The functions noisy-and
and noisy-or
are commonly used to model stochastic dependencies between random variables.
(define (noisy-equal? noise x y)
(flip (if (equal? x y)
1.0
noise)))
(define (noisify v noise)
(flip (if v (- 1 noise) noise)))
(define (noisify-all l noise)
(map (lambda (v) (noisify v noise)) l))
(define noisy-and
(lambda args
(let ((noise (first args))
(values (rest args)))
(all (noisify-all values noise)))))
(define noisy-or
(lambda args
(let ((noise (first args))
(values (rest args)))
(any (noisify-all values noise)))))
(define (show thunk title)
(barplot (enumeration-query (define _ 1) (thunk) #t) title))
(show (lambda () (noisy-and .1 #t #f))
"(noisy-and .1 #t #f)")
(show (lambda () (noisy-and .3 #t #f))
"(noisy-and .3 #t #f)")
(show (lambda () (noisy-or .1 #t #f))
"(noisy-or .1 #t #f)")
(show (lambda () (noisy-or .3 #t #f))
"(noisy-or .3 #t #f)")
(show (lambda () (noisy-equal? .3 #t #t))
"(noisy-equal? .3 #t #t)")
(show (lambda () (noisy-equal? .3 #t #f))
"(noisy-equal? .3 #t #f)")