1 needs "lib/ssrfun-compiled.hl";;
4 begin_section "ApplyIff";;
5 (add_section_var (mk_var ("P", (`:bool`))); add_section_var (mk_var ("Q", (`:bool`))));;
6 (add_section_hyp "eqPQ" (`P <=> Q`));;
9 let iffLR = section_proof []
16 let iffRL = section_proof []
23 let iffLRn = section_proof []
30 let iffRLn = section_proof []
36 (* Finalization of the section ApplyIff *)
37 let iffLR = finalize_theorem iffLR;;
38 let iffRL = finalize_theorem iffRL;;
39 let iffLRn = finalize_theorem iffLRn;;
40 let iffRLn = finalize_theorem iffRLn;;
41 end_section "ApplyIff";;
43 (* Lemma is_true_true *)
44 let is_true_true = section_proof []
50 (* Lemma not_false_is_true *)
51 let not_false_is_true = section_proof []
56 let isT = is_true_true;;
57 let notF = not_false_is_true;;
60 let negbT = section_proof ["b"]
67 let negbTE = section_proof ["b"]
74 let negbF = section_proof ["b"]
81 let negbFE = section_proof ["b"]
88 let negbK = section_proof ["b"]
95 let negbNE = section_proof ["b"]
102 let negb_inj = section_proof ["b1";"b2"]
103 `~b1 = ~b2 ==> b1 = b2`
105 ((((use_arg_then "b1") (disch_tac [])) THEN (clear_assumption "b1") THEN case) THEN (((use_arg_then "b2") (disch_tac [])) THEN (clear_assumption "b2") THEN case THEN (simp_tac)) THEN (done_tac));
109 let negbLR = section_proof ["b";"c"]
112 ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "negbK")(thm_tac (new_rewrite [] [])))) THEN (done_tac));
116 let negbRL = section_proof ["b";"c"]
119 ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (((use_arg_then "negbK")(thm_tac (new_rewrite [] [])))) THEN (done_tac));
123 let contra = section_proof ["c";"b"]
124 `(c ==> b) ==> ~b ==> ~c`
126 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
128 let contraNN = contra;;
131 let contraL = section_proof ["c";"b"]
132 `(c ==> ~b) ==> b ==> ~c`
134 (BETA_TAC THEN (move ["h"]));
135 ((((fun arg_tac -> (use_arg_then "contra") (fun fst_arg -> (use_arg_then "h") (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((use_arg_then "negbK")(thm_tac (new_rewrite [] [])))) THEN (done_tac));
139 let contraR = section_proof ["c";"b"]
140 `(~c ==> b) ==> ~b ==> c`
142 (BETA_TAC THEN (move ["h"]));
143 ((((fun arg_tac -> (use_arg_then "contra") (fun fst_arg -> (use_arg_then "h") (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((use_arg_then "negbK")(thm_tac (new_rewrite [] [])))) THEN (done_tac));
147 let contraLR = section_proof ["c";"b"]
148 `(~c ==> ~b) ==> b ==> c`
150 (BETA_TAC THEN (move ["h"]));
151 ((((fun arg_tac -> (use_arg_then "contra") (fun fst_arg -> (use_arg_then "h") (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((use_arg_then "negbK")(thm_tac (new_rewrite [] []))))) THEN (done_tac));
155 let contraT = section_proof ["b"]
162 let wlog_neg = section_proof ["b"]
165 (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac));
169 let contraFT = section_proof ["c";"b"]
170 `(~c ==> b) ==> b = F ==> c`
172 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
176 let contraFN = section_proof ["c";"b"]
177 `(c ==> b) ==> b = F ==> ~c`
179 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
183 let contraTF = section_proof ["c";"b"]
184 `(c ==> ~b) ==> b ==> c = F`
186 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
190 let contraNF = section_proof ["c";"b"]
191 `(c ==> b) ==> ~b ==> c = F`
193 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
197 let contraFF = section_proof ["c";"b"]
198 `(c ==> b) ==> b = F ==> c = F`
200 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
202 let isSome = define `isSome NONE = F /\ (!x. isSome (SOME x) = T)`;;
205 begin_section "BoolIf";;
206 (add_section_var (mk_var ("vT", (`:A`))); add_section_var (mk_var ("vF", (`:A`))));;
207 (add_section_var (mk_var ("f", (`:A -> B`))));;
208 (add_section_var (mk_var ("b", (`:bool`))));;
211 let if_same = section_proof []
212 `(if b then vT else vT) = vT`
214 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
218 let if_neg = section_proof []
219 `(if ~b then vT else vF) = if b then vF else vT`
221 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
225 let fun_if = section_proof []
226 `f (if b then vT else vF) = if b then f vT else f vF`
228 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
232 let if_arg = section_proof ["fT";"fF";"x"]
233 `(if b then (fT:A->B) else fF) x = if b then fT x else fF x`
235 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
238 (* Finalization of the section BoolIf *)
239 let if_same = finalize_theorem if_same;;
240 let if_neg = finalize_theorem if_neg;;
241 let fun_if = finalize_theorem fun_if;;
242 let if_arg = finalize_theorem if_arg;;
243 end_section "BoolIf";;
246 let andTb = section_proof ["b"]
253 let andFb = section_proof ["b"]
260 let andbT = section_proof ["b"]
267 let andbF = section_proof ["b"]
274 let andbb = section_proof ["b"]
281 let andbC = section_proof ["b";"c"]
282 `(b /\ c) = (c /\ b)`
284 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
288 let andbA = section_proof ["b";"c";"p"]
289 `b /\ (c /\ p) <=> (b /\ c) /\ p`
291 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
295 let andbCA = section_proof ["b";"c";"p"]
296 `b /\ (c /\ p) <=> c /\ (b /\ p)`
298 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
302 let andbAC = section_proof ["b";"c";"p"]
303 `(b /\ c) /\ p <=> (b /\ p) /\ c`
305 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
309 let orTb = section_proof ["b"]
316 let orFb = section_proof ["b"]
323 let orbT = section_proof ["b"]
330 let orbF = section_proof ["b"]
337 let orbb = section_proof ["b"]
344 let orbC = section_proof ["b";"c"]
347 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
351 let orbA = section_proof ["b";"c";"p"]
352 `b \/ (c \/ p) <=> (b \/ c) \/ p`
354 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
358 let orbCA = section_proof ["b";"c";"p"]
359 `b \/ (c \/ p) <=> c \/ (b \/ p)`
361 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
365 let orbAC = section_proof ["b";"c";"p"]
366 `(b \/ c) \/ p <=> (b \/ p) \/ c`
368 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
372 let andbN = section_proof ["b"]
375 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
379 let andNb = section_proof ["b"]
382 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
386 let orbN = section_proof ["b"]
389 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
393 let orNb = section_proof ["b"]
396 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
400 let andb_orl = section_proof ["b";"c";"p"]
401 `(b \/ c) /\ p <=> (b /\ p) \/ (c /\ p)`
403 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
407 let andb_orr = section_proof ["b";"c";"p"]
408 `b /\ (c \/ p) <=> (b /\ c) \/ (b /\ p)`
410 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
414 let orb_andl = section_proof ["b";"c";"p"]
415 `(b /\ c) \/ p <=> (b \/ p) /\ (c \/ p)`
417 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
421 let orb_andr = section_proof ["b";"c";"p"]
422 `b \/ (c /\ p) <=> (b \/ c) /\ (b \/ p)`
424 ((((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
428 let andb_idl = section_proof ["a";"b"]
429 `(b ==> a) ==> (a /\ b <=> b)`
431 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
435 let andb_idr = section_proof ["a";"b"]
436 `(a ==> b) ==> (a /\ b <=> a)`
438 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
441 (* Lemma andb_id2l *)
442 let andb_id2l = section_proof ["a";"b";"c"]
443 `(a ==> (b <=> c)) ==> (a /\ b <=> a /\ c)`
445 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
448 (* Lemma andb_id2r *)
449 let andb_id2r = section_proof ["a";"b";"c"]
450 `(b ==> (a <=> c)) ==> (a /\ b <=> c /\ b)`
452 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
456 let orb_idl = section_proof ["a";"b"]
457 `(a ==> b) ==> (a \/ b <=> b)`
459 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
463 let orbb_idr = section_proof ["a";"b"]
464 `(b ==> a) ==> (a \/ b <=> a)`
466 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
470 let orb_id2l = section_proof ["a";"b";"c"]
471 `(~ a ==> (b <=> c)) ==> (a \/ b <=> a \/ c)`
473 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
477 let orb_id2r = section_proof ["a";"b";"c"]
478 `(~ b ==> (a <=> c)) ==> (a \/ b <=> c \/ b)`
480 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
484 let negb_and = section_proof ["a";"b"]
485 `~ (a /\ b) <=> ~ a \/ ~ b`
487 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
491 let negb_or = section_proof ["a";"b"]
492 `~ (a \/ b) <=> ~ a /\ ~ b`
494 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
498 let andbK = section_proof ["a";"b"]
499 `((a /\ b) \/ a) = a`
501 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
505 let andKb = section_proof ["a";"b"]
508 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
512 let orbK = section_proof ["a";"b"]
513 `(a \/ b) /\ a <=> a`
515 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
519 let orKb = section_proof ["a";"b"]
520 `a /\ (b \/ a) <=> a`
522 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
526 let implybT = section_proof ["b"]
533 let implybF = section_proof ["b"]
540 let implyFb = section_proof ["b"]
547 let implyTb = section_proof ["b"]
554 let implybb = section_proof ["b"]
560 (* Lemma negb_imply *)
561 let negb_imply = section_proof ["a";"b"]
562 `~ (a ==> b) <=> a /\ ~ b`
564 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
568 let implybE = section_proof ["a";"b"]
569 `(a ==> b) <=> ~ a \/ b`
571 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
575 let implyNb = section_proof ["a";"b"]
576 `(~ a ==> b) <=> a \/ b`
578 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
582 let implybN = section_proof ["a";"b"]
583 `(a ==> ~ b) <=> (b ==> ~ a)`
585 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
589 let implybNN = section_proof ["a";"b"]
590 `(~ a ==> ~ b) <=> b ==> a`
592 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
595 (* Lemma implyb_idl *)
596 let implyb_idl = section_proof ["a";"b"]
597 `(~ a ==> b) ==> ((a ==> b) <=> b)`
599 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
602 (* Lemma implyb_idr *)
603 let implyb_idr = section_proof ["a";"b"]
604 `(b ==> ~ a) ==> ((a ==> b) <=> ~ a)`
606 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
609 (* Lemma implyb_id2l *)
610 let implyb_id2l = section_proof ["a";"b";"c"]
611 `(a ==> (b <=> c)) ==> ((a ==> b) <=> (a ==> c))`
613 ((((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
615 let XOR_DEF = new_definition `XOR p q = if p then ~q else q`;;
616 overload_interface("+", `XOR`);;
619 let addFb = section_proof ["b"]
622 ((((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] [])))) THEN (done_tac));
626 let addbF = section_proof ["b"]
629 ((((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
633 let addbb = section_proof ["b"]
636 ((((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
640 let addbC = section_proof ["b";"c"]
643 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
647 let addbA = section_proof ["a";"b";"c"]
648 `a + (b + c) <=> (a + b) + c`
650 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
654 let addbCA = section_proof ["a";"b";"c"]
655 `(a + b) + c <=> (a + c) + b`
657 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
661 let addbAC = section_proof ["a";"b";"c"]
662 `a + (b + c) <=> b + (a + c)`
664 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
667 (* Lemma andb_addl *)
668 let andb_addl = section_proof ["a";"b";"c"]
669 `(a + b) /\ c <=> (a /\ c) + (b /\ c)`
671 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
674 (* Lemma andb_addr *)
675 let andb_addr = section_proof ["a";"b";"c"]
676 `a /\ (b + c) <=> (a /\ b) + (a /\ c)`
678 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then "c") (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
682 let addKb = section_proof ["x";"y"]
685 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "x") (disch_tac [])) THEN (clear_assumption "x") THEN case) THEN (((use_arg_then "y") (disch_tac [])) THEN (clear_assumption "y") THEN case THEN (simp_tac)));
689 let addbK = section_proof ["x";"y"]
692 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "x") (disch_tac [])) THEN (clear_assumption "x") THEN case) THEN (((use_arg_then "y") (disch_tac [])) THEN (clear_assumption "y") THEN case THEN (simp_tac)));
696 let addIb = section_proof ["x";"y1";"y2"]
697 `(y1 + x <=> y2 + x) ==> (y1 = y2)`
699 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "y1") (disch_tac [])) THEN (clear_assumption "y1") THEN case) THEN (((use_arg_then "y2") (disch_tac [])) THEN (clear_assumption "y2") THEN case) THEN (((use_arg_then "x") (disch_tac [])) THEN (clear_assumption "x") THEN case THEN (simp_tac)));
703 let addbI = section_proof ["x";"y1";"y2"]
704 `(x + y1 <=> x + y2) ==> (y1 = y2)`
706 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "x") (disch_tac [])) THEN (clear_assumption "x") THEN case) THEN (((use_arg_then "y1") (disch_tac [])) THEN (clear_assumption "y1") THEN case) THEN (((use_arg_then "y2") (disch_tac [])) THEN (clear_assumption "y2") THEN case THEN (simp_tac)));
710 let addTb = section_proof ["b"]
713 (((((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (done_tac));
717 let addbT = section_proof ["b"]
720 ((((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
724 let addbN = section_proof ["a";"b"]
725 `a + ~ b <=> ~ (a + b)`
727 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)));
731 let addNb = section_proof ["a";"b"]
732 `~ a + b <=> ~ (a + b)`
734 ((repeat_tactic 1 9 (((use_arg_then "XOR_DEF")(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then "a") (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then "b") (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)));
736 let subpred = new_definition `subpred p1 p2 <=> (!x. p1 x ==> p2 x)`;;
737 let subrel = new_definition `subrel r1 r2 <=> (!x y. r1 x y ==> r2 x y)`;;
738 let pred0 = new_definition `pred0 = (\x. F)`;;
739 let predT = new_definition `predT = (\x. T)`;;
740 let predI = new_definition `predI p1 p2 = (\x. p1 x /\ p2 x)`;;
741 let predU = new_definition `predU p1 p2 = (\x. p1 x \/ p2 x)`;;
742 let predC = new_definition `predC p = (\x. ~p x)`;;
743 let predD = new_definition `predD p1 p2 = (\x. ~p2 x /\ p1 x)`;;
744 let preim = new_definition `preim f (d:A->bool) = (\x. d (f x))`;;
745 let relU = new_definition `relU r1 r2 = (\x y. r1 x y \/ r2 x y)`;;
748 let subrelUl = section_proof ["r1";"r2"]
749 `subrel r1 (relU r1 r2)`
751 (((((use_arg_then "relU")(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then "subrel")(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
755 let subrelUr = section_proof ["r1";"r2"]
756 `subrel r2 (relU r1 r2)`
758 (((((use_arg_then "relU")(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then "subrel")(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));