monad-bayes-1.2.0: models/Sprinkler.hs
module Sprinkler (hard, soft) where
import Control.Monad (when)
import Control.Monad.Bayes.Class
hard :: (MonadMeasure m) => m Bool
hard = do
rain <- bernoulli 0.3
sprinkler <- bernoulli $ if rain then 0.1 else 0.4
wet <- bernoulli $ case (rain, sprinkler) of
(True, True) -> 0.98
(True, False) -> 0.8
(False, True) -> 0.9
(False, False) -> 0.0
condition (not wet)
return rain
soft :: (MonadMeasure m) => m Bool
soft = do
rain <- bernoulli 0.3
when rain (factor 0.2)
sprinkler <- bernoulli $ if rain then 0.1 else 0.4
when sprinkler (factor 0.1)
return rain