1 (* Title: Sequents/ILL.thy
3 Author: Sara Kalvala and Valeria de Paiva
4 Copyright 1995 University of Cambridge
12 Trueprop :: "two_seqi"
14 tens :: "[o, o] => o" (infixr "><" 35)
15 limp :: "[o, o] => o" (infixr "-o" 45)
16 liff :: "[o, o] => o" (infixr "o-o" 45)
17 FShriek :: "o => o" ("! _" [100] 1000)
18 lconj :: "[o, o] => o" (infixr "&&" 35)
19 ldisj :: "[o, o] => o" (infixr "++" 35)
26 (* context manipulation *)
32 PromAux :: "three_seqi"
35 "@Trueprop" :: "single_seqe" ("((_)/ |- (_))" [6,6] 5)
36 "@Context" :: "two_seqe" ("((_)/ :=: (_))" [6,6] 5)
37 "@PromAux" :: "three_seqe" ("promaux {_||_||_}")
40 [("@Trueprop", single_tr "Trueprop"),
41 ("@Context", two_seq_tr "Context"),
42 ("@PromAux", three_seq_tr "PromAux")] *}
45 [("Trueprop", single_tr' "@Trueprop"),
46 ("Context", two_seq_tr'"@Context"),
47 ("PromAux", three_seq_tr'"@PromAux")] *}
51 liff_def: "P o-o Q == (P -o Q) >< (Q -o P)"
53 aneg_def: "~A == A -o 0"
60 zerol: "$G, 0, $H |- A"
62 (* RULES THAT DO NOT DIVIDE CONTEXT *)
64 derelict: "$F, A, $G |- C ==> $F, !A, $G |- C"
65 (* unfortunately, this one removes !A *)
67 contract: "$F, !A, !A, $G |- C ==> $F, !A, $G |- C"
69 weaken: "$F, $G |- C ==> $G, !A, $F |- C"
70 (* weak form of weakening, in practice just to clean context *)
71 (* weaken and contract not needed (CHECK) *)
73 promote2: "promaux{ || $H || B} ==> $H |- !B"
74 promote1: "promaux{!A, $G || $H || B}
75 ==> promaux {$G || $H, !A || B}"
76 promote0: "$G |- A ==> promaux {$G || || A}"
80 tensl: "$H, A, B, $G |- C ==> $H, A >< B, $G |- C"
82 impr: "A, $F |- B ==> $F |- A -o B"
88 conjll: "$G, A, $H |- C ==> $G, A && B, $H |- C"
90 conjlr: "$G, B, $H |- C ==> $G, A && B, $H |- C"
92 disjrl: "$G |- A ==> $G |- A ++ B"
93 disjrr: "$G |- B ==> $G |- A ++ B"
94 disjl: "[| $G, A, $H |- C ;
96 ==> $G, A ++ B, $H |- C"
99 (* RULES THAT DIVIDE CONTEXT *)
101 tensr: "[| $F, $J :=: $G;
106 impl: "[| $G, $F :=: $J, $H ;
109 ==> $J, A -o B, $H |- C"
112 cut: " [| $J1, $H1, $J2, $H3, $J3, $H2, $J4, $H4 :=: $F ;
113 $H1, $H2, $H3, $H4 |- A ;
114 $J1, $J2, A, $J3, $J4 |- B |] ==> $F |- B"
119 context1: "$G :=: $G"
120 context2: "$F, $G :=: $H, !A, $G ==> $F, A, $G :=: $H, !A, $G"
121 context3: "$F, $G :=: $H, $J ==> $F, A, $G :=: $H, A, $J"
122 context4a: "$F :=: $H, $G ==> $F :=: $H, !A, $G"
123 context4b: "$F, $H :=: $G ==> $F, !A, $H :=: $G"
124 context5: "$F, $G :=: $H ==> $G, $F :=: $H"
129 val lazy_cs = empty_pack
130 add_safes [thm "tensl", thm "conjr", thm "disjl", thm "promote0",
131 thm "context2", thm "context3"]
132 add_unsafes [thm "identity", thm "zerol", thm "conjll", thm "conjlr",
133 thm "disjrl", thm "disjrr", thm "impr", thm "tensr", thm "impl",
134 thm "derelict", thm "weaken", thm "promote1", thm "promote2",
135 thm "context1", thm "context4a", thm "context4b"];
138 val promote0 = thm "promote0"
139 val promote1 = thm "promote1"
140 val promote2 = thm "promote2"
143 fun prom_tac n = REPEAT (resolve_tac [promote0,promote1,promote2] n)
148 method_setup best_lazy =
149 {* Method.no_args (Method.SIMPLE_METHOD' (best_tac lazy_cs)) *}
150 "lazy classical reasoning"
152 lemma aux_impl: "$F, $G |- A ==> $F, !(A -o B), $G |- B"
153 apply (rule derelict)
155 apply (rule_tac [2] identity)
156 apply (rule context1)
160 lemma conj_lemma: " $F, !A, !B, $G |- C ==> $F, !(A && B), $G |- C"
161 apply (rule contract)
162 apply (rule_tac A = " (!A) >< (!B) " in cut)
163 apply (rule_tac [2] tensr)
165 apply (subgoal_tac "! (A && B) |- !A")
169 apply (subgoal_tac "! (A && B) |- !B")
172 apply (rule_tac [2] context1)
173 apply (rule_tac [2] tensl)
174 prefer 2 apply (assumption)
175 apply (rule context3)
176 apply (rule context3)
177 apply (rule context1)
180 lemma impr_contract: "!A, !A, $G |- B ==> $G |- (!A) -o B"
182 apply (rule contract)
186 lemma impr_contr_der: "A, !A, $G |- B ==> $G |- (!A) -o B"
188 apply (rule contract)
189 apply (rule derelict)
193 lemma contrad1: "$F, (!B) -o 0, $G, !B, $H |- A"
195 apply (rule_tac [3] identity)
196 apply (rule context3)
197 apply (rule context1)
202 lemma contrad2: "$F, !B, $G, (!B) -o 0, $H |- A"
204 apply (rule_tac [3] identity)
205 apply (rule context3)
206 apply (rule context1)
210 lemma ll_mp: "A -o B, A |- B"
212 apply (rule_tac [2] identity)
213 apply (rule_tac [2] identity)
214 apply (rule context1)
217 lemma mp_rule1: "$F, B, $G, $H |- C ==> $F, A, $G, A -o B, $H |- C"
218 apply (rule_tac A = "B" in cut)
219 apply (rule_tac [2] ll_mp)
220 prefer 2 apply (assumption)
221 apply (rule context3)
222 apply (rule context3)
223 apply (rule context1)
226 lemma mp_rule2: "$F, B, $G, $H |- C ==> $F, A -o B, $G, A, $H |- C"
227 apply (rule_tac A = "B" in cut)
228 apply (rule_tac [2] ll_mp)
229 prefer 2 apply (assumption)
230 apply (rule context3)
231 apply (rule context3)
232 apply (rule context1)
235 lemma or_to_and: "!((!(A ++ B)) -o 0) |- !( ((!A) -o 0) && ((!B) -o 0))"
238 lemma o_a_rule: "$F, !( ((!A) -o 0) && ((!B) -o 0)), $G |- C ==>
239 $F, !((!(A ++ B)) -o 0), $G |- C"
241 apply (rule_tac [2] or_to_and)
242 prefer 2 apply (assumption)
243 apply (rule context3)
244 apply (rule context1)
247 lemma conj_imp: "((!A) -o C) ++ ((!B) -o C) |- (!(A && B)) -o C"
249 apply (rule conj_lemma)
251 apply (rule mp_rule1, best_lazy)+
254 lemma not_imp: "!A, !((!B) -o 0) |- (!((!A) -o B)) -o 0"
257 lemma a_not_a: "!A -o (!A -o 0) |- !A -o 0"
259 apply (rule contract)
261 apply (rule_tac [3] identity)
262 apply (rule context1)
266 lemma a_not_a_rule: "$J1, !A -o 0, $J2 |- B ==> $J1, !A -o (!A -o 0), $J2 |- B"
267 apply (rule_tac A = "!A -o 0" in cut)
268 apply (rule_tac [2] a_not_a)
269 prefer 2 apply (assumption)
275 val safe_cs = lazy_cs add_safes [thm "conj_lemma", thm "ll_mp", thm "contrad1",
276 thm "contrad2", thm "mp_rule1", thm "mp_rule2", thm "o_a_rule",
278 add_unsafes [thm "aux_impl"];
280 val power_cs = safe_cs add_unsafes [thm "impr_contr_der"];
284 method_setup best_safe =
285 {* Method.no_args (Method.SIMPLE_METHOD' (best_tac safe_cs)) *} ""
287 method_setup best_power =
288 {* Method.no_args (Method.SIMPLE_METHOD' (best_tac power_cs)) *} ""
291 (* Some examples from Troelstra and van Dalen *)
293 lemma "!((!A) -o ((!B) -o 0)) |- (!(A && B)) -o 0"
296 lemma "!((!(A && B)) -o 0) |- !((!A) -o ((!B) -o 0))"
299 lemma "!( (!((! ((!A) -o B) ) -o 0)) -o 0) |-
300 (!A) -o ( (! ((!B) -o 0)) -o 0)"
303 lemma "!( (!A) -o ( (! ((!B) -o 0)) -o 0) ) |-
304 (!((! ((!A) -o B) ) -o 0)) -o 0"