module Sprinkler where import Control.Monad (when) import Control.Monad.Bayes.Class hard :: MonadInfer 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 :: MonadInfer 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