1 (* ---------------------------------------------------------------------- *)
3 (* ---------------------------------------------------------------------- *)
10 | And(False,q) -> False
11 | And(p,False) -> False
18 | Imp(False,q) -> True
21 | Imp(p,False) -> Not p
24 | Iff(False,q) -> Not q
25 | Iff(p,False) -> Not p
39 else if fm = nf then t
40 else if is_conj fm then
41 let l,r = dest_conj fm in
42 if l = f or r = f then f
46 else if is_disj fm then
47 let l,r = dest_disj fm in
48 if l = t or r = t then t
52 else if is_imp fm then
53 let l,r = dest_imp fm in
57 else if r = f then mk_neg l
59 else if is_iff fm then
60 let l,r = dest_beq fm in
61 if l = f then mk_neg r
64 else if r = f then mk_neg l
66 else failwith "PSIMPLIFY: 0" in
67 let fm'' = mk_eq(fm,fm') in
68 prove(fm'',REWRITE_TAC[])
73 PSIMPLIFY1_CONV `T /\ A`
77 Forall(x,p) -> if mem x (fv p) then fm else p
78 | Exists(x,p) -> if mem x (fv p) then fm else p
79 | _ -> psimplify1 fm;;
82 let SIMPLIFY1_CONV fm =
83 if is_forall fm or is_exists fm then
84 let x,p = dest_forall fm in
85 if mem x (frees p) then REFL fm
86 else prove(mk_eq(fm,p),REWRITE_TAC[])
87 else PSIMPLIFY1_CONV fm;;
92 Not p -> simplify1 (Not(simplify p))
93 | And(p,q) -> simplify1 (And(simplify p,simplify q))
94 | Or(p,q) -> simplify1 (Or(simplify p,simplify q))
95 | Imp(p,q) -> simplify1 (Imp(simplify p,simplify q))
96 | Iff(p,q) -> simplify1 (Iff(simplify p,simplify q))
97 | Forall(x,p) -> simplify1(Forall(x,simplify p))
98 | Exists(x,p) -> simplify1(Exists(x,simplify p))
102 let rec SIMPLIFY_CONV =
107 let thm1 = SIMPLIFY_CONV (dest_neg fm) in
108 let thm2 = AP_TERM not_tm thm1 in
109 let l,r = dest_eq (concl thm2) in
110 let thm3 = SIMPLIFY1_CONV r in
112 else if is_conj fm or is_disj fm or is_imp fm or is_iff fm then
113 let op,l,r = get_binop fm in
114 let l_thm = SIMPLIFY_CONV l in
115 let r_thm = SIMPLIFY_CONV r in
116 let a_thm = (curry MK_COMB) (AP_TERM op l_thm) r_thm in
117 let al,ar = dest_eq (concl a_thm) in
118 let thm = SIMPLIFY1_CONV ar in
120 else if is_forall fm or is_exists fm then
121 let x,bod = dest_quant fm in
122 let bod_thm = SIMPLIFY_CONV bod in
123 let lam_thm = ABS x bod_thm in
124 let q_thm = AP_TERM ex_tm lam_thm in
125 let l,r = dest_eq (concl q_thm) in
126 let thm = SIMPLIFY1_CONV r in
134 SIMPLIFY_CONV `T /\ T \/ F`
137 ["=",(=/); "<",(</); ">",(>/); "<=",(<=/); ">=",(>=/);
138 "divides",(fun x y -> mod_num y x =/ Int 0)];;
143 (try if assoc p operations (dest_numeral s) (dest_numeral t)
145 with Failure _ -> Atom at)
148 let evalc = onatoms evalc_atom;;
151 let REAL_LEAF_CONV fm =
152 let op,l,r = get_binop fm in
155 else if op = rgt then
157 else if op = rle then
159 else if op = rge then
161 else if op = req then
163 else failwith "REAL_LEAF_CONV";;
165 let EVALC_CONV = DEPTH_CONV REAL_LEAF_CONV;;
172 EVALC_CONV `x < &0 /\ &1 < &2`
173 (EVALC_CONV THENC SIMPLIFY_CONV) `(&0 + a * &1 = &0) /\
174 ((&0 + b * &1 = &0) /\
175 ((&0 + c * &1 = &0) /\ T \/
176 &0 + c * &1 < &0 /\ F \/
177 &0 + c * &1 > &0 /\ F) \/
178 &0 + b * &1 < &0 /\ T \/
179 &0 + b * &1 > &0 /\ T) \/
181 ((&0 + a * ((&0 + b * (&0 + b * -- &1)) + a * (&0 + c * &4)) = &0) /\ T \/
182 &0 + a * ((&0 + b * (&0 + b * -- &1)) + a * (&0 + c * &4)) < &0 /\ F \/
183 &0 + a * ((&0 + b * (&0 + b * -- &1)) + a * (&0 + c * &4)) > &0 /\ T) \/
185 ((&0 + a * ((&0 + b * (&0 + b * -- &1)) + a * (&0 + c * &4)) = &0) /\ T \/
186 &0 + a * ((&0 + b * (&0 + b * -- &1)) + a * (&0 + c * &4)) < &0 /\ T \/
187 &0 + a * ((&0 + b * (&0 + b * -- &1)) + a * (&0 + c * &4)) > &0 /\ &1 < &2)`