type Predicate =
| A
| B
| And of Predicate * Predicate
| Or of Predicate * Predicate
| Xor of Predicate * Predicate
| Not of Predicate
let rec eval (p : Predicate) (a : bool) (b : bool) =
match p with
| A -> a
| B -> b
| And (q, r) -> eval q a b && eval r a b
| Or (q, r) -> eval q a b || eval r a b
| Xor (q, r) -> eval q a b <> eval r a b
| Not (q) -> not (eval q a b)
let table (p : Predicate) =
seq {
for a in [false; true] do
for b in [false; true] do
yield (a, b, eval p a b)
}
table (Xor (Or (Not (And (A, B)), B), Not B))
|> Seq.
iter (fun
(a
, b
, r
) -> printf "%b\t%b\t%b\n" a b r
)
dHlwZSBQcmVkaWNhdGUgPQogICAgfCBBCiAgICB8IEIKICAgIHwgQW5kIG9mIFByZWRpY2F0ZSAqIFByZWRpY2F0ZQogICAgfCBPciBvZiBQcmVkaWNhdGUgKiBQcmVkaWNhdGUKICAgIHwgWG9yIG9mIFByZWRpY2F0ZSAqIFByZWRpY2F0ZQogICAgfCBOb3Qgb2YgUHJlZGljYXRlCgpsZXQgcmVjIGV2YWwgKHAgOiBQcmVkaWNhdGUpIChhIDogYm9vbCkgKGIgOiBib29sKSA9CiAgICBtYXRjaCBwIHdpdGgKICAgIHwgQSAtPiBhCiAgICB8IEIgLT4gYgogICAgfCBBbmQgKHEsIHIpIC0+IGV2YWwgcSBhIGIgJiYgZXZhbCByIGEgYgogICAgfCBPciAocSwgcikgLT4gZXZhbCBxIGEgYiB8fCBldmFsIHIgYSBiCiAgICB8IFhvciAocSwgcikgLT4gZXZhbCBxIGEgYiA8PiBldmFsIHIgYSBiCiAgICB8IE5vdCAocSkgLT4gbm90IChldmFsIHEgYSBiKQoKbGV0IHRhYmxlIChwIDogUHJlZGljYXRlKSA9CiAgICBzZXEgewogICAgICAgIGZvciBhIGluIFtmYWxzZTsgdHJ1ZV0gZG8KICAgICAgICAgICAgZm9yIGIgaW4gW2ZhbHNlOyB0cnVlXSBkbwogICAgICAgICAgICAgICAgeWllbGQgKGEsIGIsIGV2YWwgcCBhIGIpCiAgICB9Cgp0YWJsZSAoWG9yIChPciAoTm90IChBbmQgKEEsIEIpKSwgQiksIE5vdCBCKSkKfD4gU2VxLml0ZXIgKGZ1biAoYSwgYiwgcikgLT4gcHJpbnRmICIlYlx0JWJcdCViXG4iIGEgYiByKQo=