| author | blanchet | 
| Fri, 16 Apr 2010 16:53:00 +0200 | |
| changeset 36185 | 0ee736f08ed0 | 
| parent 35113 | 1a0c129bb2e0 | 
| child 39159 | 0dec18004e75 | 
| permissions | -rw-r--r-- | 
| 17481 | 1 | (* Title: Sequents/ILL.thy | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 2 | Author: Sara Kalvala and Valeria de Paiva | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 3 | Copyright 1995 University of Cambridge | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 4 | *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 5 | |
| 17481 | 6 | theory ILL | 
| 7 | imports Sequents | |
| 8 | begin | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 9 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 10 | consts | 
| 14765 | 11 | Trueprop :: "two_seqi" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 12 | |
| 22894 | 13 | tens :: "[o, o] => o" (infixr "><" 35) | 
| 14 | limp :: "[o, o] => o" (infixr "-o" 45) | |
| 15 | liff :: "[o, o] => o" (infixr "o-o" 45) | |
| 16 |   FShriek :: "o => o"          ("! _" [100] 1000)
 | |
| 17 | lconj :: "[o, o] => o" (infixr "&&" 35) | |
| 18 | ldisj :: "[o, o] => o" (infixr "++" 35) | |
| 19 |   zero :: "o"                  ("0")
 | |
| 20 |   top :: "o"                   ("1")
 | |
| 21 |   eye :: "o"                   ("I")
 | |
| 22 |   aneg :: "o=>o"               ("~_")
 | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 23 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 24 | |
| 14765 | 25 | (* context manipulation *) | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 26 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 27 | Context :: "two_seqi" | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 28 | |
| 14765 | 29 | (* promotion rule *) | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 30 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 31 | PromAux :: "three_seqi" | 
| 14765 | 32 | |
| 33 | syntax | |
| 35113 | 34 |   "_Trueprop" :: "single_seqe" ("((_)/ |- (_))" [6,6] 5)
 | 
| 35 |   "_Context"  :: "two_seqe"   ("((_)/ :=: (_))" [6,6] 5)
 | |
| 36 |   "_PromAux"  :: "three_seqe" ("promaux {_||_||_}")
 | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 37 | |
| 17481 | 38 | parse_translation {*
 | 
| 35113 | 39 |   [(@{syntax_const "_Trueprop"}, single_tr @{const_syntax Trueprop}),
 | 
| 40 |    (@{syntax_const "_Context"}, two_seq_tr @{const_syntax Context}),
 | |
| 41 |    (@{syntax_const "_PromAux"}, three_seq_tr @{const_syntax PromAux})]
 | |
| 42 | *} | |
| 17481 | 43 | |
| 44 | print_translation {*
 | |
| 35113 | 45 |   [(@{const_syntax Trueprop}, single_tr' @{syntax_const "_Trueprop"}),
 | 
| 46 |    (@{const_syntax Context}, two_seq_tr' @{syntax_const "_Context"}),
 | |
| 47 |    (@{const_syntax PromAux}, three_seq_tr' @{syntax_const "_PromAux"})]
 | |
| 48 | *} | |
| 17481 | 49 | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 50 | defs | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 51 | |
| 17481 | 52 | liff_def: "P o-o Q == (P -o Q) >< (Q -o P)" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 53 | |
| 17481 | 54 | aneg_def: "~A == A -o 0" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 55 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 56 | |
| 17481 | 57 | axioms | 
| 14765 | 58 | |
| 17481 | 59 | identity: "P |- P" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 60 | |
| 17481 | 61 | zerol: "$G, 0, $H |- A" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 62 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 63 | (* RULES THAT DO NOT DIVIDE CONTEXT *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 64 | |
| 17481 | 65 | derelict: "$F, A, $G |- C ==> $F, !A, $G |- C" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 66 | (* unfortunately, this one removes !A *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 67 | |
| 17481 | 68 | contract: "$F, !A, !A, $G |- C ==> $F, !A, $G |- C" | 
| 14765 | 69 | |
| 17481 | 70 | weaken: "$F, $G |- C ==> $G, !A, $F |- C" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 71 | (* weak form of weakening, in practice just to clean context *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 72 | (* weaken and contract not needed (CHECK) *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 73 | |
| 17481 | 74 | promote2:        "promaux{ || $H || B} ==> $H |- !B"
 | 
| 75 | promote1:        "promaux{!A, $G || $H || B}
 | |
| 76 |                   ==> promaux {$G || $H, !A || B}"
 | |
| 77 | promote0:        "$G |- A ==> promaux {$G || || A}"
 | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 78 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 79 | |
| 14765 | 80 | |
| 17481 | 81 | tensl: "$H, A, B, $G |- C ==> $H, A >< B, $G |- C" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 82 | |
| 17481 | 83 | impr: "A, $F |- B ==> $F |- A -o B" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 84 | |
| 17481 | 85 | conjr: "[| $F |- A ; | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 86 | $F |- B |] | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 87 | ==> $F |- (A && B)" | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 88 | |
| 17481 | 89 | conjll: "$G, A, $H |- C ==> $G, A && B, $H |- C" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 90 | |
| 17481 | 91 | conjlr: "$G, B, $H |- C ==> $G, A && B, $H |- C" | 
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 92 | |
| 17481 | 93 | disjrl: "$G |- A ==> $G |- A ++ B" | 
| 94 | disjrr: "$G |- B ==> $G |- A ++ B" | |
| 95 | disjl: "[| $G, A, $H |- C ; | |
| 96 | $G, B, $H |- C |] | |
| 97 | ==> $G, A ++ B, $H |- C" | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 98 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 99 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 100 | (* RULES THAT DIVIDE CONTEXT *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 101 | |
| 17481 | 102 | tensr: "[| $F, $J :=: $G; | 
| 103 | $F |- A ; | |
| 104 | $J |- B |] | |
| 105 | ==> $G |- A >< B" | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 106 | |
| 17481 | 107 | impl: "[| $G, $F :=: $J, $H ; | 
| 108 | B, $F |- C ; | |
| 109 | $G |- A |] | |
| 110 | ==> $J, A -o B, $H |- C" | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 111 | |
| 14765 | 112 | |
| 17481 | 113 | cut: " [| $J1, $H1, $J2, $H3, $J3, $H2, $J4, $H4 :=: $F ; | 
| 114 | $H1, $H2, $H3, $H4 |- A ; | |
| 115 | $J1, $J2, A, $J3, $J4 |- B |] ==> $F |- B" | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 116 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 117 | |
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 118 | (* CONTEXT RULES *) | 
| 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 119 | |
| 17481 | 120 | context1: "$G :=: $G" | 
| 121 | context2: "$F, $G :=: $H, !A, $G ==> $F, A, $G :=: $H, !A, $G" | |
| 122 | context3: "$F, $G :=: $H, $J ==> $F, A, $G :=: $H, A, $J" | |
| 123 | context4a: "$F :=: $H, $G ==> $F :=: $H, !A, $G" | |
| 124 | context4b: "$F, $H :=: $G ==> $F, !A, $H :=: $G" | |
| 125 | context5: "$F, $G :=: $H ==> $G, $F :=: $H" | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 126 | |
| 21427 | 127 | |
| 128 | ML {*
 | |
| 129 | ||
| 130 | val lazy_cs = empty_pack | |
| 131 | add_safes [thm "tensl", thm "conjr", thm "disjl", thm "promote0", | |
| 132 | thm "context2", thm "context3"] | |
| 133 | add_unsafes [thm "identity", thm "zerol", thm "conjll", thm "conjlr", | |
| 134 | thm "disjrl", thm "disjrr", thm "impr", thm "tensr", thm "impl", | |
| 135 | thm "derelict", thm "weaken", thm "promote1", thm "promote2", | |
| 136 | thm "context1", thm "context4a", thm "context4b"]; | |
| 137 | ||
| 138 | local | |
| 139 | val promote0 = thm "promote0" | |
| 140 | val promote1 = thm "promote1" | |
| 141 | val promote2 = thm "promote2" | |
| 142 | in | |
| 143 | ||
| 144 | fun prom_tac n = REPEAT (resolve_tac [promote0,promote1,promote2] n) | |
| 14765 | 145 | |
| 2073 
fb0655539d05
New unified treatment of sequent calculi by Sara Kalvala
 paulson parents: diff
changeset | 146 | end | 
| 21427 | 147 | *} | 
| 148 | ||
| 149 | method_setup best_lazy = | |
| 30549 | 150 |   {* Scan.succeed (K (SIMPLE_METHOD' (best_tac lazy_cs))) *}
 | 
| 21588 | 151 | "lazy classical reasoning" | 
| 21427 | 152 | |
| 153 | lemma aux_impl: "$F, $G |- A ==> $F, !(A -o B), $G |- B" | |
| 154 | apply (rule derelict) | |
| 155 | apply (rule impl) | |
| 156 | apply (rule_tac [2] identity) | |
| 157 | apply (rule context1) | |
| 158 | apply assumption | |
| 159 | done | |
| 160 | ||
| 161 | lemma conj_lemma: " $F, !A, !B, $G |- C ==> $F, !(A && B), $G |- C" | |
| 162 | apply (rule contract) | |
| 163 | apply (rule_tac A = " (!A) >< (!B) " in cut) | |
| 164 | apply (rule_tac [2] tensr) | |
| 165 | prefer 3 | |
| 166 | apply (subgoal_tac "! (A && B) |- !A") | |
| 167 | apply assumption | |
| 168 | apply best_lazy | |
| 169 | prefer 3 | |
| 170 | apply (subgoal_tac "! (A && B) |- !B") | |
| 171 | apply assumption | |
| 172 | apply best_lazy | |
| 173 | apply (rule_tac [2] context1) | |
| 174 | apply (rule_tac [2] tensl) | |
| 175 | prefer 2 apply (assumption) | |
| 176 | apply (rule context3) | |
| 177 | apply (rule context3) | |
| 178 | apply (rule context1) | |
| 179 | done | |
| 180 | ||
| 181 | lemma impr_contract: "!A, !A, $G |- B ==> $G |- (!A) -o B" | |
| 182 | apply (rule impr) | |
| 183 | apply (rule contract) | |
| 184 | apply assumption | |
| 185 | done | |
| 186 | ||
| 187 | lemma impr_contr_der: "A, !A, $G |- B ==> $G |- (!A) -o B" | |
| 188 | apply (rule impr) | |
| 189 | apply (rule contract) | |
| 190 | apply (rule derelict) | |
| 191 | apply assumption | |
| 192 | done | |
| 193 | ||
| 194 | lemma contrad1: "$F, (!B) -o 0, $G, !B, $H |- A" | |
| 195 | apply (rule impl) | |
| 196 | apply (rule_tac [3] identity) | |
| 197 | apply (rule context3) | |
| 198 | apply (rule context1) | |
| 199 | apply (rule zerol) | |
| 200 | done | |
| 201 | ||
| 202 | ||
| 203 | lemma contrad2: "$F, !B, $G, (!B) -o 0, $H |- A" | |
| 204 | apply (rule impl) | |
| 205 | apply (rule_tac [3] identity) | |
| 206 | apply (rule context3) | |
| 207 | apply (rule context1) | |
| 208 | apply (rule zerol) | |
| 209 | done | |
| 210 | ||
| 211 | lemma ll_mp: "A -o B, A |- B" | |
| 212 | apply (rule impl) | |
| 213 | apply (rule_tac [2] identity) | |
| 214 | apply (rule_tac [2] identity) | |
| 215 | apply (rule context1) | |
| 216 | done | |
| 217 | ||
| 218 | lemma mp_rule1: "$F, B, $G, $H |- C ==> $F, A, $G, A -o B, $H |- C" | |
| 219 | apply (rule_tac A = "B" in cut) | |
| 220 | apply (rule_tac [2] ll_mp) | |
| 221 | prefer 2 apply (assumption) | |
| 222 | apply (rule context3) | |
| 223 | apply (rule context3) | |
| 224 | apply (rule context1) | |
| 225 | done | |
| 226 | ||
| 227 | lemma mp_rule2: "$F, B, $G, $H |- C ==> $F, A -o B, $G, A, $H |- C" | |
| 228 | apply (rule_tac A = "B" in cut) | |
| 229 | apply (rule_tac [2] ll_mp) | |
| 230 | prefer 2 apply (assumption) | |
| 231 | apply (rule context3) | |
| 232 | apply (rule context3) | |
| 233 | apply (rule context1) | |
| 234 | done | |
| 235 | ||
| 236 | lemma or_to_and: "!((!(A ++ B)) -o 0) |- !( ((!A) -o 0) && ((!B) -o 0))" | |
| 237 | by best_lazy | |
| 238 | ||
| 239 | lemma o_a_rule: "$F, !( ((!A) -o 0) && ((!B) -o 0)), $G |- C ==> | |
| 240 | $F, !((!(A ++ B)) -o 0), $G |- C" | |
| 241 | apply (rule cut) | |
| 242 | apply (rule_tac [2] or_to_and) | |
| 243 | prefer 2 apply (assumption) | |
| 244 | apply (rule context3) | |
| 245 | apply (rule context1) | |
| 246 | done | |
| 247 | ||
| 248 | lemma conj_imp: "((!A) -o C) ++ ((!B) -o C) |- (!(A && B)) -o C" | |
| 249 | apply (rule impr) | |
| 250 | apply (rule conj_lemma) | |
| 251 | apply (rule disjl) | |
| 252 | apply (rule mp_rule1, best_lazy)+ | |
| 253 | done | |
| 254 | ||
| 255 | lemma not_imp: "!A, !((!B) -o 0) |- (!((!A) -o B)) -o 0" | |
| 256 | by best_lazy | |
| 257 | ||
| 258 | lemma a_not_a: "!A -o (!A -o 0) |- !A -o 0" | |
| 259 | apply (rule impr) | |
| 260 | apply (rule contract) | |
| 261 | apply (rule impl) | |
| 262 | apply (rule_tac [3] identity) | |
| 263 | apply (rule context1) | |
| 264 | apply best_lazy | |
| 265 | done | |
| 266 | ||
| 267 | lemma a_not_a_rule: "$J1, !A -o 0, $J2 |- B ==> $J1, !A -o (!A -o 0), $J2 |- B" | |
| 268 | apply (rule_tac A = "!A -o 0" in cut) | |
| 269 | apply (rule_tac [2] a_not_a) | |
| 270 | prefer 2 apply (assumption) | |
| 271 | apply best_lazy | |
| 272 | done | |
| 273 | ||
| 274 | ML {*
 | |
| 275 | ||
| 276 | val safe_cs = lazy_cs add_safes [thm "conj_lemma", thm "ll_mp", thm "contrad1", | |
| 277 | thm "contrad2", thm "mp_rule1", thm "mp_rule2", thm "o_a_rule", | |
| 278 | thm "a_not_a_rule"] | |
| 279 | add_unsafes [thm "aux_impl"]; | |
| 280 | ||
| 281 | val power_cs = safe_cs add_unsafes [thm "impr_contr_der"]; | |
| 282 | *} | |
| 283 | ||
| 284 | ||
| 285 | method_setup best_safe = | |
| 30549 | 286 |   {* Scan.succeed (K (SIMPLE_METHOD' (best_tac safe_cs))) *} ""
 | 
| 21427 | 287 | |
| 288 | method_setup best_power = | |
| 30549 | 289 |   {* Scan.succeed (K (SIMPLE_METHOD' (best_tac power_cs))) *} ""
 | 
| 21427 | 290 | |
| 291 | ||
| 292 | (* Some examples from Troelstra and van Dalen *) | |
| 293 | ||
| 294 | lemma "!((!A) -o ((!B) -o 0)) |- (!(A && B)) -o 0" | |
| 295 | by best_safe | |
| 296 | ||
| 297 | lemma "!((!(A && B)) -o 0) |- !((!A) -o ((!B) -o 0))" | |
| 298 | by best_safe | |
| 299 | ||
| 300 | lemma "!( (!((! ((!A) -o B) ) -o 0)) -o 0) |- | |
| 301 | (!A) -o ( (! ((!B) -o 0)) -o 0)" | |
| 302 | by best_safe | |
| 303 | ||
| 304 | lemma "!( (!A) -o ( (! ((!B) -o 0)) -o 0) ) |- | |
| 305 | (!((! ((!A) -o B) ) -o 0)) -o 0" | |
| 306 | by best_power | |
| 307 | ||
| 308 | end |