needs "Examples/ssrfun-compiled.hl";;
(* Module Ssrbool*)
module Ssrbool = struct
(* Section ApplyIff *)
Sections.begin_section "ApplyIff";;
(Sections.add_section_var (mk_var ("P", (`:bool`))); Sections.add_section_var (mk_var ("Q", (`:bool`))));;
(Sections.add_section_hyp "eqPQ" (`P <=> Q`));;
(* Lemma iffLR *)
let iffLR = Sections.section_proof []
`P ==> Q`
[
(done_tac);
];;
(* Lemma iffRL *)
let iffRL = Sections.section_proof []
`Q ==> P`
[
(done_tac);
];;
(* Lemma iffLRn *)
let iffLRn = Sections.section_proof []
`~P ==> ~Q`
[
(done_tac);
];;
(* Lemma iffRLn *)
let iffRLn = Sections.section_proof []
`~Q ==> ~P`
[
(done_tac);
];;
(* Finalization of the section ApplyIff *)
let iffLR = Sections.finalize_theorem iffLR;;
let iffRL = Sections.finalize_theorem iffRL;;
let iffLRn = Sections.finalize_theorem iffLRn;;
let iffRLn = Sections.finalize_theorem iffRLn;;
Sections.end_section "ApplyIff";;
(* Lemma is_true_true *)
let is_true_true = Sections.section_proof []
`T`
[
(done_tac);
];;
(* Lemma not_false_is_true *)
let not_false_is_true = Sections.section_proof []
`~F`
[
(done_tac);
];;
let isT = is_true_true;;
let notF = not_false_is_true;;
(* Lemma negbT *)
let negbT = Sections.section_proof ["b"]
`(b = F) ==> ~b`
[
(done_tac);
];;
(* Lemma negbTE *)
let negbTE = Sections.section_proof ["b"]
`~b ==> b = F`
[
(done_tac);
];;
(* Lemma negbF *)
let negbF = Sections.section_proof ["b"]
`b ==> ~b = F`
[
(done_tac);
];;
(* Lemma negbFE *)
let negbFE = Sections.section_proof ["b"]
`~b = F ==> b`
[
(done_tac);
];;
(* Lemma negbK *)
let negbK = Sections.section_proof ["b"]
`~ ~b = b`
[
(done_tac);
];;
(* Lemma negbNE *)
let negbNE = Sections.section_proof ["b"]
`~ ~ b ==> b`
[
(done_tac);
];;
(* Lemma negb_inj *)
let negb_inj = Sections.section_proof ["b1";"b2"]
`~b1 = ~b2 ==> b1 = b2`
[
((((use_arg_then2 ("b1", [])) (disch_tac [])) THEN (clear_assumption "b1") THEN case) THEN (((use_arg_then2 ("b2", [])) (disch_tac [])) THEN (clear_assumption "b2") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma negbLR *)
let negbLR = Sections.section_proof ["b";"c"]
`b = ~c ==> ~b = c`
[
((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("negbK", [negbK]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
];;
(* Lemma negbRL *)
let negbRL = Sections.section_proof ["b";"c"]
`~b = c ==> b = ~c`
[
((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (((use_arg_then2 ("negbK", [negbK]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
];;
(* Lemma contra *)
let contra = Sections.section_proof ["c";"b"]
`(c ==> b) ==> ~b ==> ~c`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
];;
let contraNN = contra;;
(* Lemma contraL *)
let contraL = Sections.section_proof ["c";"b"]
`(c ==> ~b) ==> b ==> ~c`
[
(BETA_TAC THEN (move ["h"]));
((((fun arg_tac -> (use_arg_then2 ("contra", [contra])) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((use_arg_then2 ("negbK", [negbK]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
];;
(* Lemma contraR *)
let contraR = Sections.section_proof ["c";"b"]
`(~c ==> b) ==> ~b ==> c`
[
(BETA_TAC THEN (move ["h"]));
((((fun arg_tac -> (use_arg_then2 ("contra", [contra])) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((use_arg_then2 ("negbK", [negbK]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
];;
(* Lemma contraLR *)
let contraLR = Sections.section_proof ["c";"b"]
`(~c ==> ~b) ==> b ==> c`
[
(BETA_TAC THEN (move ["h"]));
((((fun arg_tac -> (use_arg_then2 ("contra", [contra])) (fun fst_arg -> (use_arg_then2 ("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_then2 ("negbK", [negbK]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
];;
(* Lemma contraT *)
let contraT = Sections.section_proof ["b"]
`(~b ==> F) ==> b`
[
(done_tac);
];;
(* Lemma wlog_neg *)
let wlog_neg = Sections.section_proof ["b"]
`(~b ==> b) ==> b`
[
(((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac));
];;
(* Lemma contraFT *)
let contraFT = Sections.section_proof ["c";"b"]
`(~c ==> b) ==> b = F ==> c`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
];;
(* Lemma contraFN *)
let contraFN = Sections.section_proof ["c";"b"]
`(c ==> b) ==> b = F ==> ~c`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
];;
(* Lemma contraTF *)
let contraTF = Sections.section_proof ["c";"b"]
`(c ==> ~b) ==> b ==> c = F`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
];;
(* Lemma contraNF *)
let contraNF = Sections.section_proof ["c";"b"]
`(c ==> b) ==> ~b ==> c = F`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
];;
(* Lemma contraFF *)
let contraFF = Sections.section_proof ["c";"b"]
`(c ==> b) ==> b = F ==> c = F`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)));
];;
(* Section BoolIf *)
Sections.begin_section "BoolIf";;
(Sections.add_section_var (mk_var ("vT", (`:A`))); Sections.add_section_var (mk_var ("vF", (`:A`))));;
(Sections.add_section_var (mk_var ("f", (`:A -> B`))));;
(Sections.add_section_var (mk_var ("b", (`:bool`))));;
(* Lemma if_same *)
let if_same = Sections.section_proof []
`(if b then vT else vT) = vT`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma if_neg *)
let if_neg = Sections.section_proof []
`(if ~b then vT else vF) = if b then vF else vT`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma fun_if *)
let fun_if = Sections.section_proof []
`f (if b then vT else vF) = if b then f vT else f vF`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma if_arg *)
let if_arg = Sections.section_proof ["fT";"fF";"x"]
`(if b then (fT:A->B) else fF) x = if b then fT x else fF x`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Finalization of the section BoolIf *)
let if_same = Sections.finalize_theorem if_same;;
let if_neg = Sections.finalize_theorem if_neg;;
let fun_if = Sections.finalize_theorem fun_if;;
let if_arg = Sections.finalize_theorem if_arg;;
Sections.end_section "BoolIf";;
(* Lemma andTb *)
let andTb = Sections.section_proof ["b"]
`(T /\ b) = b`
[
(done_tac);
];;
(* Lemma andFb *)
let andFb = Sections.section_proof ["b"]
`(F /\ b) = F`
[
(done_tac);
];;
(* Lemma andbT *)
let andbT = Sections.section_proof ["b"]
`(b /\ T) = b`
[
(done_tac);
];;
(* Lemma andbF *)
let andbF = Sections.section_proof ["b"]
`(b /\ F) = F`
[
(done_tac);
];;
(* Lemma andbb *)
let andbb = Sections.section_proof ["b"]
`(b /\ b) = b`
[
(done_tac);
];;
(* Lemma andbC *)
let andbC = Sections.section_proof ["b";"c"]
`(b /\ c) = (c /\ b)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andbA *)
let andbA = Sections.section_proof ["b";"c";"p"]
`b /\ (c /\ p) <=> (b /\ c) /\ p`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andbCA *)
let andbCA = Sections.section_proof ["b";"c";"p"]
`b /\ (c /\ p) <=> c /\ (b /\ p)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andbAC *)
let andbAC = Sections.section_proof ["b";"c";"p"]
`(b /\ c) /\ p <=> (b /\ p) /\ c`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orTb *)
let orTb = Sections.section_proof ["b"]
`T \/ b <=> T`
[
(done_tac);
];;
(* Lemma orFb *)
let orFb = Sections.section_proof ["b"]
`F \/ b <=> b`
[
(done_tac);
];;
(* Lemma orbT *)
let orbT = Sections.section_proof ["b"]
`b \/ T <=> T`
[
(done_tac);
];;
(* Lemma orbF *)
let orbF = Sections.section_proof ["b"]
`b \/ F <=> b`
[
(done_tac);
];;
(* Lemma orbb *)
let orbb = Sections.section_proof ["b"]
`b \/ b <=> b`
[
(done_tac);
];;
(* Lemma orbC *)
let orbC = Sections.section_proof ["b";"c"]
`b \/ c <=> c \/ b`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orbA *)
let orbA = Sections.section_proof ["b";"c";"p"]
`b \/ (c \/ p) <=> (b \/ c) \/ p`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orbCA *)
let orbCA = Sections.section_proof ["b";"c";"p"]
`b \/ (c \/ p) <=> c \/ (b \/ p)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orbAC *)
let orbAC = Sections.section_proof ["b";"c";"p"]
`(b \/ c) \/ p <=> (b \/ p) \/ c`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andbN *)
let andbN = Sections.section_proof ["b"]
`b /\ ~b <=> F`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andNb *)
let andNb = Sections.section_proof ["b"]
`~b /\ b <=> F`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orbN *)
let orbN = Sections.section_proof ["b"]
`b \/ ~b`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orNb *)
let orNb = Sections.section_proof ["b"]
`~b \/ b`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andb_orl *)
let andb_orl = Sections.section_proof ["b";"c";"p"]
`(b \/ c) /\ p <=> (b /\ p) \/ (c /\ p)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andb_orr *)
let andb_orr = Sections.section_proof ["b";"c";"p"]
`b /\ (c \/ p) <=> (b /\ c) \/ (b /\ p)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orb_andl *)
let orb_andl = Sections.section_proof ["b";"c";"p"]
`(b /\ c) \/ p <=> (b \/ p) /\ (c \/ p)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orb_andr *)
let orb_andr = Sections.section_proof ["b";"c";"p"]
`b \/ (c /\ p) <=> (b \/ c) /\ (b \/ p)`
[
((((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andb_idl *)
let andb_idl = Sections.section_proof ["a";"b"]
`(b ==> a) ==> (a /\ b <=> b)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andb_idr *)
let andb_idr = Sections.section_proof ["a";"b"]
`(a ==> b) ==> (a /\ b <=> a)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andb_id2l *)
let andb_id2l = Sections.section_proof ["a";"b";"c"]
`(a ==> (b <=> c)) ==> (a /\ b <=> a /\ c)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andb_id2r *)
let andb_id2r = Sections.section_proof ["a";"b";"c"]
`(b ==> (a <=> c)) ==> (a /\ b <=> c /\ b)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orb_idl *)
let orb_idl = Sections.section_proof ["a";"b"]
`(a ==> b) ==> (a \/ b <=> b)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orbb_idr *)
let orbb_idr = Sections.section_proof ["a";"b"]
`(b ==> a) ==> (a \/ b <=> a)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orb_id2l *)
let orb_id2l = Sections.section_proof ["a";"b";"c"]
`(~ a ==> (b <=> c)) ==> (a \/ b <=> a \/ c)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orb_id2r *)
let orb_id2r = Sections.section_proof ["a";"b";"c"]
`(~ b ==> (a <=> c)) ==> (a \/ b <=> c \/ b)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma negb_and *)
let negb_and = Sections.section_proof ["a";"b"]
`~ (a /\ b) <=> ~ a \/ ~ b`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma negb_or *)
let negb_or = Sections.section_proof ["a";"b"]
`~ (a \/ b) <=> ~ a /\ ~ b`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andbK *)
let andbK = Sections.section_proof ["a";"b"]
`((a /\ b) \/ a) = a`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma andKb *)
let andKb = Sections.section_proof ["a";"b"]
`a \/ b /\ a <=> a`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orbK *)
let orbK = Sections.section_proof ["a";"b"]
`(a \/ b) /\ a <=> a`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma orKb *)
let orKb = Sections.section_proof ["a";"b"]
`a /\ (b \/ a) <=> a`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implybT *)
let implybT = Sections.section_proof ["b"]
`b ==> T`
[
(done_tac);
];;
(* Lemma implybF *)
let implybF = Sections.section_proof ["b"]
`(b ==> F) <=> ~ b`
[
(done_tac);
];;
(* Lemma implyFb *)
let implyFb = Sections.section_proof ["b"]
`F ==> b`
[
(done_tac);
];;
(* Lemma implyTb *)
let implyTb = Sections.section_proof ["b"]
`(T ==> b) <=> b`
[
(done_tac);
];;
(* Lemma implybb *)
let implybb = Sections.section_proof ["b"]
`b ==> b`
[
(done_tac);
];;
(* Lemma negb_imply *)
let negb_imply = Sections.section_proof ["a";"b"]
`~ (a ==> b) <=> a /\ ~ b`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implybE *)
let implybE = Sections.section_proof ["a";"b"]
`(a ==> b) <=> ~ a \/ b`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implyNb *)
let implyNb = Sections.section_proof ["a";"b"]
`(~ a ==> b) <=> a \/ b`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implybN *)
let implybN = Sections.section_proof ["a";"b"]
`(a ==> ~ b) <=> (b ==> ~ a)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implybNN *)
let implybNN = Sections.section_proof ["a";"b"]
`(~ a ==> ~ b) <=> b ==> a`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implyb_idl *)
let implyb_idl = Sections.section_proof ["a";"b"]
`(~ a ==> b) ==> ((a ==> b) <=> b)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implyb_idr *)
let implyb_idr = Sections.section_proof ["a";"b"]
`(b ==> ~ a) ==> ((a ==> b) <=> ~ a)`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma implyb_id2l *)
let implyb_id2l = Sections.section_proof ["a";"b";"c"]
`(a ==> (b <=> c)) ==> ((a ==> b) <=> (a ==> c))`
[
((((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)) THEN (done_tac));
];;
let XOR_DEF = new_definition `XOR p q = if p then ~q else q`;;
overload_interface("+", `XOR`);;
(* Lemma addFb *)
let addFb = Sections.section_proof ["b"]
`F + b <=> b`
[
((((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
];;
(* Lemma addbF *)
let addbF = Sections.section_proof ["b"]
`b + F <=> b`
[
((((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma addbb *)
let addbb = Sections.section_proof ["b"]
`b + b <=> F`
[
((((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma addbC *)
let addbC = Sections.section_proof ["b";"c"]
`b + c <=> c + b`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma addbA *)
let addbA = Sections.section_proof ["a";"b";"c"]
`a + (b + c) <=> (a + b) + c`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
];;
(* Lemma addbCA *)
let addbCA = Sections.section_proof ["a";"b";"c"]
`(a + b) + c <=> (a + c) + b`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
];;
(* Lemma addbAC *)
let addbAC = Sections.section_proof ["a";"b";"c"]
`a + (b + c) <=> b + (a + c)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
];;
(* Lemma andb_addl *)
let andb_addl = Sections.section_proof ["a";"b";"c"]
`(a + b) /\ c <=> (a /\ c) + (b /\ c)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
];;
(* Lemma andb_addr *)
let andb_addr = Sections.section_proof ["a";"b";"c"]
`a /\ (b + c) <=> (a /\ b) + (a /\ c)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case) THEN (((use_arg_then2 ("c", [])) (disch_tac [])) THEN (clear_assumption "c") THEN case) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case THEN (simp_tac)));
];;
(* Lemma addKb *)
let addKb = Sections.section_proof ["x";"y"]
`x + (x + y) <=> y`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("x", [])) (disch_tac [])) THEN (clear_assumption "x") THEN case) THEN (((use_arg_then2 ("y", [])) (disch_tac [])) THEN (clear_assumption "y") THEN case THEN (simp_tac)));
];;
(* Lemma addbK *)
let addbK = Sections.section_proof ["x";"y"]
`(y + x) + x <=> y`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("x", [])) (disch_tac [])) THEN (clear_assumption "x") THEN case) THEN (((use_arg_then2 ("y", [])) (disch_tac [])) THEN (clear_assumption "y") THEN case THEN (simp_tac)));
];;
(* Lemma addIb *)
let addIb = Sections.section_proof ["x";"y1";"y2"]
`(y1 + x <=> y2 + x) ==> (y1 = y2)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("y1", [])) (disch_tac [])) THEN (clear_assumption "y1") THEN case) THEN (((use_arg_then2 ("y2", [])) (disch_tac [])) THEN (clear_assumption "y2") THEN case) THEN (((use_arg_then2 ("x", [])) (disch_tac [])) THEN (clear_assumption "x") THEN case THEN (simp_tac)));
];;
(* Lemma addbI *)
let addbI = Sections.section_proof ["x";"y1";"y2"]
`(x + y1 <=> x + y2) ==> (y1 = y2)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("x", [])) (disch_tac [])) THEN (clear_assumption "x") THEN case) THEN (((use_arg_then2 ("y1", [])) (disch_tac [])) THEN (clear_assumption "y1") THEN case) THEN (((use_arg_then2 ("y2", [])) (disch_tac [])) THEN (clear_assumption "y2") THEN case THEN (simp_tac)));
];;
(* Lemma addTb *)
let addTb = Sections.section_proof ["b"]
`T + b <=> ~b`
[
(((((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (done_tac));
];;
(* Lemma addbT *)
let addbT = Sections.section_proof ["b"]
`b + T <=> ~ b`
[
((((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma addbN *)
let addbN = Sections.section_proof ["a";"b"]
`a + ~ b <=> ~ (a + b)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)));
];;
(* Lemma addNb *)
let addNb = Sections.section_proof ["a";"b"]
`~ a + b <=> ~ (a + b)`
[
((repeat_tactic 1 9 (((use_arg_then2 ("XOR_DEF", [XOR_DEF]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("a", [])) (disch_tac [])) THEN (clear_assumption "a") THEN case) THEN (((use_arg_then2 ("b", [])) (disch_tac [])) THEN (clear_assumption "b") THEN case THEN (simp_tac)));
];;
(* Lemma subrelUl *)
let subrelUl = Sections.section_proof ["r1";"r2"]
`subrel r1 (relU r1 r2)`
[
(((((use_arg_then2 ("relU", [relU]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subrel", [subrel]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
];;
(* Lemma subrelUr *)
let subrelUr = Sections.section_proof ["r1";"r2"]
`subrel r2 (relU r1 r2)`
[
(((((use_arg_then2 ("relU", [relU]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subrel", [subrel]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
];;
(* Close the module *)
end;;