src/Sequents/LK0.thy
changeset 55228 901a6696cdd8
parent 52143 36ffe23b25f8
child 55233 3229614ca9c5
equal deleted inserted replaced
55227:653de351d21c 55228:901a6696cdd8
   160   res_inst_tac ctxt [(("P", 0), s)] @{thm cut} i  THEN  rtac @{thm thinL} (i+1)
   160   res_inst_tac ctxt [(("P", 0), s)] @{thm cut} i  THEN  rtac @{thm thinL} (i+1)
   161 *}
   161 *}
   162 
   162 
   163 
   163 
   164 (** If-and-only-if rules **)
   164 (** If-and-only-if rules **)
   165 lemma iffR: 
   165 lemma iffR:
   166     "[| $H,P |- $E,Q,$F;  $H,Q |- $E,P,$F |] ==> $H |- $E, P <-> Q, $F"
   166     "[| $H,P |- $E,Q,$F;  $H,Q |- $E,P,$F |] ==> $H |- $E, P <-> Q, $F"
   167   apply (unfold iff_def)
   167   apply (unfold iff_def)
   168   apply (assumption | rule conjR impR)+
   168   apply (assumption | rule conjR impR)+
   169   done
   169   done
   170 
   170 
   171 lemma iffL: 
   171 lemma iffL:
   172     "[| $H,$G |- $E,P,Q;  $H,Q,P,$G |- $E |] ==> $H, P <-> Q, $G |- $E"
   172     "[| $H,$G |- $E,P,Q;  $H,Q,P,$G |- $E |] ==> $H, P <-> Q, $G |- $E"
   173   apply (unfold iff_def)
   173   apply (unfold iff_def)
   174   apply (assumption | rule conjL impL basic)+
   174   apply (assumption | rule conjL impL basic)+
   175   done
   175   done
   176 
   176 
   208   apply (erule thinR)
   208   apply (erule thinR)
   209   done
   209   done
   210 
   210 
   211 (*The rules of LK*)
   211 (*The rules of LK*)
   212 
   212 
       
   213 lemmas [safe] =
       
   214   iffR iffL
       
   215   notR notL
       
   216   impR impL
       
   217   disjR disjL
       
   218   conjR conjL
       
   219   FalseL TrueR
       
   220   refl basic
       
   221 ML {* val prop_pack = Cla.get_pack @{context} *}
       
   222 
       
   223 lemmas [safe] = exL allR
       
   224 lemmas [unsafe] = the_equality exR_thin allL_thin
       
   225 ML {* val LK_pack = Cla.get_pack @{context} *}
       
   226 
   213 ML {*
   227 ML {*
   214 val prop_pack = empty_pack add_safes
   228   val LK_dup_pack =
   215                 [@{thm basic}, @{thm refl}, @{thm TrueR}, @{thm FalseL},
   229     Cla.put_pack prop_pack @{context}
   216                  @{thm conjL}, @{thm conjR}, @{thm disjL}, @{thm disjR}, @{thm impL}, @{thm impR},
   230     |> fold_rev Cla.add_safe @{thms allR exL}
   217                  @{thm notL}, @{thm notR}, @{thm iffL}, @{thm iffR}];
   231     |> fold_rev Cla.add_unsafe @{thms allL exR the_equality}
   218 
   232     |> Cla.get_pack;
   219 val LK_pack = prop_pack add_safes   [@{thm allR}, @{thm exL}]
       
   220                         add_unsafes [@{thm allL_thin}, @{thm exR_thin}, @{thm the_equality}];
       
   221 
       
   222 val LK_dup_pack = prop_pack add_safes   [@{thm allR}, @{thm exL}]
       
   223                             add_unsafes [@{thm allL}, @{thm exR}, @{thm the_equality}];
       
   224 
       
   225 
       
   226 fun lemma_tac th i =
       
   227     rtac (@{thm thinR} RS @{thm cut}) i THEN REPEAT (rtac @{thm thinL} i) THEN rtac th i;
       
   228 *}
   233 *}
   229 
   234 
   230 method_setup fast_prop = {* Scan.succeed (K (SIMPLE_METHOD' (fast_tac prop_pack))) *}
   235 ML {*
   231 method_setup fast = {* Scan.succeed (K (SIMPLE_METHOD' (fast_tac LK_pack))) *}
   236   fun lemma_tac th i =
   232 method_setup fast_dup = {* Scan.succeed (K (SIMPLE_METHOD' (fast_tac LK_dup_pack))) *}
   237     rtac (@{thm thinR} RS @{thm cut}) i THEN
   233 method_setup best = {* Scan.succeed (K (SIMPLE_METHOD' (best_tac LK_pack))) *}
   238     REPEAT (rtac @{thm thinL} i) THEN
   234 method_setup best_dup = {* Scan.succeed (K (SIMPLE_METHOD' (best_tac LK_dup_pack))) *}
   239     rtac th i;
       
   240 *}
       
   241 
       
   242 
       
   243 method_setup fast_prop =
       
   244   {* Scan.succeed (fn ctxt => SIMPLE_METHOD' (Cla.fast_tac (Cla.put_pack prop_pack ctxt))) *}
       
   245 
       
   246 method_setup fast_dup =
       
   247   {* Scan.succeed (fn ctxt => SIMPLE_METHOD' (Cla.fast_tac (Cla.put_pack LK_dup_pack ctxt))) *}
       
   248 
       
   249 method_setup best_dup =
       
   250   {* Scan.succeed (fn ctxt => SIMPLE_METHOD' (Cla.best_tac (Cla.put_pack LK_dup_pack ctxt))) *}
   235 
   251 
   236 
   252 
   237 lemma mp_R:
   253 lemma mp_R:
   238   assumes major: "$H |- $E, $F, P --> Q"
   254   assumes major: "$H |- $E, $F, P --> Q"
   239     and minor: "$H |- $E, $F, P"
   255     and minor: "$H |- $E, $F, P"
   240   shows "$H |- $E, Q, $F"
   256   shows "$H |- $E, Q, $F"
   241   apply (rule thinRS [THEN cut], rule major)
   257   apply (rule thinRS [THEN cut], rule major)
   242   apply (tactic "step_tac LK_pack 1")
   258   apply step
   243   apply (rule thinR, rule minor)
   259   apply (rule thinR, rule minor)
   244   done
   260   done
   245 
   261 
   246 lemma mp_L:
   262 lemma mp_L:
   247   assumes major: "$H, $G |- $E, P --> Q"
   263   assumes major: "$H, $G |- $E, P --> Q"
   248     and minor: "$H, $G, Q |- $E"
   264     and minor: "$H, $G, Q |- $E"
   249   shows "$H, P, $G |- $E"
   265   shows "$H, P, $G |- $E"
   250   apply (rule thinL [THEN cut], rule major)
   266   apply (rule thinL [THEN cut], rule major)
   251   apply (tactic "step_tac LK_pack 1")
   267   apply step
   252   apply (rule thinL, rule minor)
   268   apply (rule thinL, rule minor)
   253   done
   269   done
   254 
   270 
   255 
   271 
   256 (** Two rules to generate left- and right- rules from implications **)
   272 (** Two rules to generate left- and right- rules from implications **)
   299 
   315 
   300 
   316 
   301 (** Equality **)
   317 (** Equality **)
   302 
   318 
   303 lemma sym: "|- a=b --> b=a"
   319 lemma sym: "|- a=b --> b=a"
   304   by (tactic {* safe_tac (LK_pack add_safes [@{thm subst}]) 1 *})
   320   by (safe add!: subst)
   305 
   321 
   306 lemma trans: "|- a=b --> b=c --> a=c"
   322 lemma trans: "|- a=b --> b=c --> a=c"
   307   by (tactic {* safe_tac (LK_pack add_safes [@{thm subst}]) 1 *})
   323   by (safe add!: subst)
   308 
   324 
   309 (* Symmetry of equality in hypotheses *)
   325 (* Symmetry of equality in hypotheses *)
   310 lemmas symL = sym [THEN L_of_imp]
   326 lemmas symL = sym [THEN L_of_imp]
   311 
   327 
   312 (* Symmetry of equality in hypotheses *)
   328 (* Symmetry of equality in hypotheses *)