(1.-.p, false)] let grassModel = let rain = flip 0.3 and sprinkler = flip 0.5 in let grass_is_wet = flip 0.9 && rain || flip 0.8 && sprinkler || flip 0.1 in if grass_is_wet then rain else fail()
F F X F F X F X F X F X F X 0.1 0.9 0.2 0.8 0.1 0.9 0.1 0.9 0.1 0.9 0.8 0.2 0.9 0.1 0.5 0.5 0.1 0.9 0.2 0.8 0.1 0.9 0.2 0.8 0.9 0.1 0.1 0.9 0.1 0.9 0.8 0.2 0.9 0.1 0.9 0.1 0.9 0.8 0.2 0.1 0.5 0.5 0.3 0.7 1.0
a) type PV a = [(Prob, VC a)] type PM a = PV a pvUnit :: a -> PV a pvUnit x = [(1.0, V x)] pvBind :: PV a -> (a -> PV b) -> PV b pvBind m f = map g m where g (p, V x) = (p, C (f x)) g (p, C t) = (p, C (pvBind (t f)))
ch con e1 e2 = pvBind e1 (¥v1 -> if v1 then e2 else pvUnit False) dis e1 e2 = pvBind e1 (¥v1 -> if v1 then pvUnit True else e2) if_ et e1 e2 = pvBind et (¥t -> if t then e1 else e2)
a) type PV a = [(Prob, VC a)] type PM a = (a -> PV Bool) -> PV Bool dist ch k = map (¥(p,v) -> (p, C (k v))) ch con e1 e2 k = e1 (¥v1 -> if v1 then e2 k else k False) dis e1 e2 k = e1 (¥v1 -> if v1 then k True else e2 k) if_ et e1 e2 k = et (¥t -> if t then e1 k else e2 k)
k -> List.map (fun (p,v) -> (p, C (fun () -> k v))) ch) let neg e = not e let con e1 e2 = e1 && e2 let dis e1 e2 = e1 || e2 let if_ et e1 e2 = if et then e1 () else e2 () let reify0 m = reset (fun () -> pv_unit (m ()))
map (¥ (p,v) -> (p, C (k v))) ch) neg = liftM not con = liftM2 (&&) dis = liftM2 (||) if_ et e1 e2 = et >>= (¥t -> if t then e1 else e2) reify0 m = reset (pvUnit `liftM` m) いろいろ余計なものが付いてる