40 ["(True <-> P) <-> P", "(P <-> True) <-> P", |
40 ["(True <-> P) <-> P", "(P <-> True) <-> P", |
41 "(P <-> P) <-> True", |
41 "(P <-> P) <-> True", |
42 "(False <-> P) <-> ~P", "(P <-> False) <-> ~P"]; |
42 "(False <-> P) <-> ~P", "(P <-> False) <-> ~P"]; |
43 |
43 |
44 val quant_simps = map int_prove_fun |
44 val quant_simps = map int_prove_fun |
45 ["(ALL x.P) <-> P", "(EX x.P) <-> P"]; |
45 ["(ALL x. P) <-> P", "(EX x. P) <-> P"]; |
46 |
46 |
47 (*These are NOT supplied by default!*) |
47 (*These are NOT supplied by default!*) |
48 val distrib_simps = map int_prove_fun |
48 val distrib_simps = map int_prove_fun |
49 ["P & (Q | R) <-> P&Q | P&R", |
49 ["P & (Q | R) <-> P&Q | P&R", |
50 "(Q | R) & P <-> Q&P | R&P", |
50 "(Q | R) & P <-> Q&P | R&P", |
101 |
101 |
102 (*Miniscoping: pushing in existential quantifiers*) |
102 (*Miniscoping: pushing in existential quantifiers*) |
103 val ex_simps = map prove_fun |
103 val ex_simps = map prove_fun |
104 ["(EX x. x=t & P(x)) <-> P(t)", |
104 ["(EX x. x=t & P(x)) <-> P(t)", |
105 "(EX x. t=x & P(x)) <-> P(t)", |
105 "(EX x. t=x & P(x)) <-> P(t)", |
106 "(EX x. P(x) & Q) <-> (EX x.P(x)) & Q", |
106 "(EX x. P(x) & Q) <-> (EX x. P(x)) & Q", |
107 "(EX x. P & Q(x)) <-> P & (EX x.Q(x))", |
107 "(EX x. P & Q(x)) <-> P & (EX x. Q(x))", |
108 "(EX x. P(x) | Q) <-> (EX x.P(x)) | Q", |
108 "(EX x. P(x) | Q) <-> (EX x. P(x)) | Q", |
109 "(EX x. P | Q(x)) <-> P | (EX x.Q(x))", |
109 "(EX x. P | Q(x)) <-> P | (EX x. Q(x))", |
110 "(EX x. P(x) --> Q) <-> (ALL x.P(x)) --> Q", |
110 "(EX x. P(x) --> Q) <-> (ALL x. P(x)) --> Q", |
111 "(EX x. P --> Q(x)) <-> P --> (EX x.Q(x))"]; |
111 "(EX x. P --> Q(x)) <-> P --> (EX x. Q(x))"]; |
112 |
112 |
113 (*Miniscoping: pushing in universal quantifiers*) |
113 (*Miniscoping: pushing in universal quantifiers*) |
114 val all_simps = map prove_fun |
114 val all_simps = map prove_fun |
115 ["(ALL x. x=t --> P(x)) <-> P(t)", |
115 ["(ALL x. x=t --> P(x)) <-> P(t)", |
116 "(ALL x. t=x --> P(x)) <-> P(t)", |
116 "(ALL x. t=x --> P(x)) <-> P(t)", |
117 "(ALL x. P(x) & Q) <-> (ALL x.P(x)) & Q", |
117 "(ALL x. P(x) & Q) <-> (ALL x. P(x)) & Q", |
118 "(ALL x. P & Q(x)) <-> P & (ALL x.Q(x))", |
118 "(ALL x. P & Q(x)) <-> P & (ALL x. Q(x))", |
119 "(ALL x. P(x) | Q) <-> (ALL x.P(x)) | Q", |
119 "(ALL x. P(x) | Q) <-> (ALL x. P(x)) | Q", |
120 "(ALL x. P | Q(x)) <-> P | (ALL x.Q(x))", |
120 "(ALL x. P | Q(x)) <-> P | (ALL x. Q(x))", |
121 "(ALL x. P(x) --> Q) <-> (EX x.P(x)) --> Q", |
121 "(ALL x. P(x) --> Q) <-> (EX x. P(x)) --> Q", |
122 "(ALL x. P --> Q(x)) <-> P --> (ALL x.Q(x))"]; |
122 "(ALL x. P --> Q(x)) <-> P --> (ALL x. Q(x))"]; |
123 |
123 |
124 fun int_prove nm thm = qed_goal nm IFOL.thy thm |
124 fun int_prove nm thm = qed_goal nm IFOL.thy thm |
125 (fn prems => [ (cut_facts_tac prems 1), |
125 (fn prems => [ (cut_facts_tac prems 1), |
126 (IntPr.fast_tac 1) ]); |
126 (IntPr.fast_tac 1) ]); |
127 |
127 |
148 int_prove "de_Morgan_disj" "(~(P | Q)) <-> (~P & ~Q)"; |
148 int_prove "de_Morgan_disj" "(~(P | Q)) <-> (~P & ~Q)"; |
149 prove "de_Morgan_conj" "(~(P & Q)) <-> (~P | ~Q)"; |
149 prove "de_Morgan_conj" "(~(P & Q)) <-> (~P | ~Q)"; |
150 |
150 |
151 prove "not_iff" "~(P <-> Q) <-> (P <-> ~Q)"; |
151 prove "not_iff" "~(P <-> Q) <-> (P <-> ~Q)"; |
152 |
152 |
153 prove "not_all" "(~ (ALL x.P(x))) <-> (EX x.~P(x))"; |
153 prove "not_all" "(~ (ALL x. P(x))) <-> (EX x.~P(x))"; |
154 prove "imp_all" "((ALL x.P(x)) --> Q) <-> (EX x.P(x) --> Q)"; |
154 prove "imp_all" "((ALL x. P(x)) --> Q) <-> (EX x. P(x) --> Q)"; |
155 int_prove "not_ex" "(~ (EX x.P(x))) <-> (ALL x.~P(x))"; |
155 int_prove "not_ex" "(~ (EX x. P(x))) <-> (ALL x.~P(x))"; |
156 int_prove "imp_ex" "((EX x. P(x)) --> Q) <-> (ALL x. P(x) --> Q)"; |
156 int_prove "imp_ex" "((EX x. P(x)) --> Q) <-> (ALL x. P(x) --> Q)"; |
157 |
157 |
158 int_prove "ex_disj_distrib" |
158 int_prove "ex_disj_distrib" |
159 "(EX x. P(x) | Q(x)) <-> ((EX x. P(x)) | (EX x. Q(x)))"; |
159 "(EX x. P(x) | Q(x)) <-> ((EX x. P(x)) | (EX x. Q(x)))"; |
160 int_prove "all_conj_distrib" |
160 int_prove "all_conj_distrib" |