|
|
1.1 root 1: (* propositional calculus *)
2:
3: datatype truth = TRUE | FALSE
4:
5: datatype term
6: = VAR of string
7: | CON of truth
8: | NOT of term
9: | AND of term * term
10: | OR of term * term
11:
12: (* (~ p) and q ==> AND(NOT(VAR "p"), VAR "q") *)
13:
14: (* transform term to conjuctive normal form *)
15:
16: fun negate (NOT(NOT p)) = negate p
17: | negate (NOT p) = p
18: | negate (AND(p,q)) = OR(NOT p, NOT q)
19: | negate (OR(p,q)) = AND(NOT p, NOT q)
20: | negate p = NOT p
21:
22: fun cnf (AND(p,q)) = AND(cnf p, cnf q)
23: | cnf (NOT(NOT p)) = cnf p
24: | cnf (NOT(AND(p,q))) = cnf(OR(negate p, negate q))
25: | cnf (NOT(OR(p,q))) = AND(cnf(NOT p), cnf(NOT q))
26: | cnf (OR(AND(p,q),r)) = AND(cnf(OR(p,r)),cnf(OR(q,r)))
27: | cnf (OR(p,AND(q,r))) = AND(cnf(OR(p,q)),cnf(OR(p,r)))
28: | cnf (OR(NOT p,q)) = cnf(OR(negate p, q))
29: | cnf (OR(p, NOT q)) = cnf(OR(p, negate q))
30: | cnf p = p
31:
32: (* exercise: write a tautology checker.
33: (hint: use resolution) *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.