| author | wenzelm | 
| Sat, 03 Oct 2020 21:54:53 +0200 | |
| changeset 72371 | 3e84f4e9651a | 
| parent 69593 | 3dda49e08b9d | 
| child 72458 | b44e894796d5 | 
| permissions | -rw-r--r-- | 
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 1 | (* Title: HOL/Tools/SMT/verit_replay_methods.ML | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 2 | Author: Mathias Fleury, MPII | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 3 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 4 | Proof methods for replaying veriT proofs. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 5 | *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 6 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 7 | signature VERIT_REPLAY_METHODS = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 8 | sig | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 9 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 10 | val is_skolemisation: string -> bool | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 11 | val is_skolemisation_step: VeriT_Proof.veriT_replay_node -> bool | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 12 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 13 | (* methods for veriT proof rules *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 14 | val method_for: string -> Proof.context -> thm list -> term list -> term -> | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 15 | thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 16 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 17 | val veriT_step_requires_subproof_assms : string -> bool | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 18 | val eq_congruent_pred: Proof.context -> 'a -> term -> thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 19 | end; | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 20 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 21 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 22 | structure Verit_Replay_Methods: VERIT_REPLAY_METHODS = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 23 | struct | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 24 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 25 | (*Some general comments on the proof format: | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 26 | 1. Double negations are not always removed. This means for example that the equivalence rules | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 27 | cannot assume that the double negations have already been removed. Therefore, we match the | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 28 | term, instantiate the theorem, then use simp (to remove double negations), and finally use | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 29 | assumption. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 30 | 2. The reconstruction for rule forall_inst is buggy and tends to be very fragile, because the rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 31 | is doing much more that is supposed to do. Moreover types can make trivial goals (for the | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 32 | boolean structure) impossible to prove. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 33 | 3. Duplicate literals are sometimes removed, mostly by the SAT solver. We currently do not care | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 34 | about it, since in all cases we have met, a rule like tmp_AC_simp is called to do the | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 35 | simplification. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 36 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 37 | Rules unsupported on purpose: | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 38 | * Distinct_Elim, XOR, let (we don't need them). | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 39 | * tmp_skolemize (because it is not clear if veriT still generates using it). | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 40 | *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 41 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 42 | datatype verit_rule = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 43 | False | True | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 44 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 45 | (* input: a repeated (normalized) assumption of assumption of in a subproof *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 46 | Normalized_Input | Local_Input | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 47 | (* Subproof: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 48 | Subproof | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 49 | (* Conjunction: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 50 | And | Not_And | And_Pos | And_Neg | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 51 | (* Disjunction"" *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 52 | Or | Or_Pos | Not_Or | Or_Neg | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 53 | (* Disjunction: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 54 | Implies | Implies_Neg1 | Implies_Neg2 | Implies_Pos | Not_Implies1 | Not_Implies2 | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 55 | (* Equivalence: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 56 | Equiv_neg1 | Equiv_pos1 | Equiv_pos2 | Equiv_neg2 | Not_Equiv1 | Not_Equiv2 | Equiv1 | Equiv2 | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 57 | (* If-then-else: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 58 | ITE_Pos1 | ITE_Pos2 | ITE_Neg1 | ITE_Neg2 | Not_ITE1 | Not_ITE2 | ITE_Intro | ITE1 | ITE2 | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 59 | (* Equality: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 60 | Eq_Congruent | Eq_Reflexive | Eq_Transitive | Eq_Congruent_Pred | Trans | Refl | Cong | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 61 | (* Arithmetics: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 62 | LA_Disequality | LA_Generic | LA_Tautology | LIA_Generic | LA_Totality | LA_RW_Eq | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 63 | NLA_Generic | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 64 | (* Quantifiers: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 65 | Forall_Inst | Qnt_Rm_Unused | Qnt_Join | Qnt_Simplify | Bind | Skolem_Forall | Skolem_Ex | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 66 | (* Resolution: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 67 | Theory_Resolution | Resolution | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 68 | (* Various transformation: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 69 | Connective_Equiv | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 70 | (* Temporary rules, that the veriT developpers want to remove: *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 71 | Tmp_AC_Simp | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 72 | Tmp_Bfun_Elim | | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 73 | (* Unsupported rule *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 74 | Unsupported | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 75 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 76 | val is_skolemisation = member (op =) ["sko_forall", "sko_ex"] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 77 | fun is_skolemisation_step (VeriT_Proof.VeriT_Replay_Node {id, ...}) = is_skolemisation id
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 78 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 79 | fun verit_rule_of "bind" = Bind | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 80 | | verit_rule_of "cong" = Cong | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 81 | | verit_rule_of "refl" = Refl | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 82 | | verit_rule_of "equiv1" = Equiv1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 83 | | verit_rule_of "equiv2" = Equiv2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 84 | | verit_rule_of "equiv_pos1" = Equiv_pos1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 85 | | verit_rule_of "equiv_pos2" = Equiv_pos2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 86 | | verit_rule_of "equiv_neg1" = Equiv_neg1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 87 | | verit_rule_of "equiv_neg2" = Equiv_neg2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 88 | | verit_rule_of "sko_forall" = Skolem_Forall | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 89 | | verit_rule_of "sko_ex" = Skolem_Ex | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 90 | | verit_rule_of "eq_reflexive" = Eq_Reflexive | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 91 | | verit_rule_of "th_resolution" = Theory_Resolution | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 92 | | verit_rule_of "forall_inst" = Forall_Inst | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 93 | | verit_rule_of "implies_pos" = Implies_Pos | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 94 | | verit_rule_of "or" = Or | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 95 | | verit_rule_of "not_or" = Not_Or | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 96 | | verit_rule_of "resolution" = Resolution | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 97 | | verit_rule_of "eq_congruent" = Eq_Congruent | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 98 | | verit_rule_of "connective_equiv" = Connective_Equiv | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 99 | | verit_rule_of "trans" = Trans | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 100 | | verit_rule_of "false" = False | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 101 | | verit_rule_of "tmp_AC_simp" = Tmp_AC_Simp | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 102 | | verit_rule_of "and" = And | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 103 | | verit_rule_of "not_and" = Not_And | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 104 | | verit_rule_of "and_pos" = And_Pos | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 105 | | verit_rule_of "and_neg" = And_Neg | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 106 | | verit_rule_of "or_pos" = Or_Pos | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 107 | | verit_rule_of "or_neg" = Or_Neg | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 108 | | verit_rule_of "not_equiv1" = Not_Equiv1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 109 | | verit_rule_of "not_equiv2" = Not_Equiv2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 110 | | verit_rule_of "not_implies1" = Not_Implies1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 111 | | verit_rule_of "not_implies2" = Not_Implies2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 112 | | verit_rule_of "implies_neg1" = Implies_Neg1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 113 | | verit_rule_of "implies_neg2" = Implies_Neg2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 114 | | verit_rule_of "implies" = Implies | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 115 | | verit_rule_of "tmp_bfun_elim" = Tmp_Bfun_Elim | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 116 | | verit_rule_of "ite1" = ITE1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 117 | | verit_rule_of "ite2" = ITE2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 118 | | verit_rule_of "not_ite1" = Not_ITE1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 119 | | verit_rule_of "not_ite2" = Not_ITE2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 120 | | verit_rule_of "ite_pos1" = ITE_Pos1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 121 | | verit_rule_of "ite_pos2" = ITE_Pos2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 122 | | verit_rule_of "ite_neg1" = ITE_Neg1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 123 | | verit_rule_of "ite_neg2" = ITE_Neg2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 124 | | verit_rule_of "ite_intro" = ITE_Intro | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 125 | | verit_rule_of "la_disequality" = LA_Disequality | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 126 | | verit_rule_of "lia_generic" = LIA_Generic | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 127 | | verit_rule_of "la_generic" = LA_Generic | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 128 | | verit_rule_of "la_tautology" = LA_Tautology | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 129 | | verit_rule_of "la_totality" = LA_Totality | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 130 | | verit_rule_of "la_rw_eq"= LA_RW_Eq | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 131 | | verit_rule_of "nla_generic"= NLA_Generic | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 132 | | verit_rule_of "eq_transitive" = Eq_Transitive | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 133 | | verit_rule_of "qnt_rm_unused" = Qnt_Rm_Unused | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 134 | | verit_rule_of "qnt_simplify" = Qnt_Simplify | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 135 | | verit_rule_of "qnt_join" = Qnt_Join | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 136 | | verit_rule_of "eq_congruent_pred" = Eq_Congruent_Pred | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 137 | | verit_rule_of "subproof" = Subproof | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 138 | | verit_rule_of r = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 139 | if r = VeriT_Proof.veriT_normalized_input_rule then Normalized_Input | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 140 | else if r = VeriT_Proof.veriT_local_input_rule then Local_Input | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 141 | else Unsupported | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 142 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 143 | fun string_of_verit_rule Bind = "Bind" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 144 | | string_of_verit_rule Cong = "Cong" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 145 | | string_of_verit_rule Refl = "Refl" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 146 | | string_of_verit_rule Equiv1 = "Equiv1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 147 | | string_of_verit_rule Equiv2 = "Equiv2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 148 | | string_of_verit_rule Equiv_pos1 = "Equiv_pos1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 149 | | string_of_verit_rule Equiv_pos2 = "Equiv_pos2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 150 | | string_of_verit_rule Equiv_neg1 = "Equiv_neg1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 151 | | string_of_verit_rule Equiv_neg2 = "Equiv_neg2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 152 | | string_of_verit_rule Skolem_Forall = "Skolem_Forall" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 153 | | string_of_verit_rule Skolem_Ex = "Skolem_Ex" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 154 | | string_of_verit_rule Eq_Reflexive = "Eq_Reflexive" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 155 | | string_of_verit_rule Theory_Resolution = "Theory_Resolution" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 156 | | string_of_verit_rule Forall_Inst = "forall_inst" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 157 | | string_of_verit_rule Or = "Or" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 158 | | string_of_verit_rule Not_Or = "Not_Or" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 159 | | string_of_verit_rule Resolution = "Resolution" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 160 | | string_of_verit_rule Eq_Congruent = "eq_congruent" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 161 | | string_of_verit_rule Connective_Equiv = "connective_equiv" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 162 | | string_of_verit_rule Trans = "trans" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 163 | | string_of_verit_rule False = "false" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 164 | | string_of_verit_rule And = "and" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 165 | | string_of_verit_rule And_Pos = "and_pos" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 166 | | string_of_verit_rule Not_And = "not_and" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 167 | | string_of_verit_rule And_Neg = "and_neg" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 168 | | string_of_verit_rule Or_Pos = "or_pos" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 169 | | string_of_verit_rule Or_Neg = "or_neg" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 170 | | string_of_verit_rule Tmp_AC_Simp = "tmp_AC_simp" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 171 | | string_of_verit_rule Not_Equiv1 = "not_equiv1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 172 | | string_of_verit_rule Not_Equiv2 = "not_equiv2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 173 | | string_of_verit_rule Not_Implies1 = "not_implies1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 174 | | string_of_verit_rule Not_Implies2 = "not_implies2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 175 | | string_of_verit_rule Implies_Neg1 = "implies_neg1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 176 | | string_of_verit_rule Implies_Neg2 = "implies_neg2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 177 | | string_of_verit_rule Implies = "implies" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 178 | | string_of_verit_rule Tmp_Bfun_Elim = "tmp_bfun_elim" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 179 | | string_of_verit_rule ITE1 = "ite1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 180 | | string_of_verit_rule ITE2 = "ite2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 181 | | string_of_verit_rule Not_ITE1 = "not_ite1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 182 | | string_of_verit_rule Not_ITE2 = "not_ite2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 183 | | string_of_verit_rule ITE_Pos1 = "ite_pos1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 184 | | string_of_verit_rule ITE_Pos2 = "ite_pos2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 185 | | string_of_verit_rule ITE_Neg1 = "ite_neg1" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 186 | | string_of_verit_rule ITE_Neg2 = "ite_neg2" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 187 | | string_of_verit_rule ITE_Intro = "ite_intro" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 188 | | string_of_verit_rule LA_Disequality = "la_disequality" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 189 | | string_of_verit_rule LA_Generic = "la_generic" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 190 | | string_of_verit_rule LIA_Generic = "lia_generic" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 191 | | string_of_verit_rule LA_Tautology = "la_tautology" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 192 | | string_of_verit_rule LA_RW_Eq = "la_rw_eq" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 193 | | string_of_verit_rule LA_Totality = "LA_Totality" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 194 | | string_of_verit_rule NLA_Generic = "nla_generic" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 195 | | string_of_verit_rule Eq_Transitive = "eq_transitive" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 196 | | string_of_verit_rule Qnt_Rm_Unused = "qnt_remove_unused" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 197 | | string_of_verit_rule Qnt_Simplify = "qnt_simplify" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 198 | | string_of_verit_rule Qnt_Join = "qnt_join" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 199 | | string_of_verit_rule Eq_Congruent_Pred = "eq_congruent_pred" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 200 | | string_of_verit_rule Normalized_Input = VeriT_Proof.veriT_normalized_input_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 201 | | string_of_verit_rule Local_Input = VeriT_Proof.veriT_normalized_input_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 202 | | string_of_verit_rule Subproof = "subproof" | 
| 69593 | 203 | | string_of_verit_rule r = "Unsupported rule: " ^ \<^make_string> r | 
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 204 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 205 | (*** Methods to Replay Normal steps ***) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 206 | (* sko_forall requires the assumptions to be able to SMT_Replay_Methods.prove the equivalence in case of double | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 207 | skolemization. See comment below. *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 208 | fun veriT_step_requires_subproof_assms t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 209 | member (op =) ["refl", "cong", VeriT_Proof.veriT_local_input_rule, "sko_forall", | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 210 | "sko_ex"] t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 211 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 212 | fun simplify_tac ctxt thms = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 213 | ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 214 | |> empty_simpset | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 215 | |> put_simpset HOL_basic_ss | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 216 |   |> (fn ctxt => ctxt addsimps @{thms not_not eq_commute} addsimps thms)
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 217 | |> Simplifier.full_simp_tac | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 218 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 219 | val bind_thms = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 220 |   [@{lemma "(\<And>x x'. P x = Q x) \<Longrightarrow> (\<forall>x. P x) = (\<forall>y. Q y)"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 221 | by blast}, | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 222 |    @{lemma "(\<And>x x'.  P x = Q x) \<Longrightarrow> (\<exists>x. P x) = (\<exists>y. Q y)"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 223 | by blast}, | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 224 |    @{lemma "(\<And>x x'.  P x = Q x) \<Longrightarrow> (\<exists>x. P x = Q x)"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 225 | by blast}, | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 226 |    @{lemma "(\<And>x x'.  P x = Q x) \<Longrightarrow> (\<forall>x. P x = Q x)"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 227 | by blast}] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 228 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 229 | fun TRY' tac = fn i => TRY (tac i) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 230 | fun REPEAT' tac = fn i => REPEAT (tac i) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 231 | fun REPEAT_CHANGED tac = fn i => REPEAT (CHANGED (tac i)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 232 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 233 | fun bind ctxt [prems] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 234 | REPEAT' (resolve_tac ctxt bind_thms) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 235 | THEN' match_tac ctxt [prems] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 236 | THEN' simplify_tac ctxt [] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 237 |     THEN' REPEAT' (match_tac ctxt [@{thm refl}]))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 238 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 239 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 240 | fun refl ctxt thm t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 241 | (case find_first (fn thm => t = Thm.full_prop_of thm) thm of | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 242 | SOME thm => thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 243 | | NONE => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 244 | (case try (Z3_Replay_Methods.refl ctxt thm) t of | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 245 | NONE => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 246 | ( Z3_Replay_Methods.cong ctxt thm t) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 247 | | SOME thm => thm)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 248 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 249 | local | 
| 69593 | 250 | fun equiv_pos_neg_term ctxt thm (\<^term>\<open>Trueprop\<close> $ | 
| 251 | (\<^term>\<open>HOL.disj\<close> $ (_) $ | |
| 252 | ((\<^term>\<open>HOL.disj\<close> $ a $ b)))) = | |
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 253 | Drule.infer_instantiate' ctxt (map (SOME o Thm.cterm_of ctxt) [a, b]) thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 254 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 255 | fun prove_equiv_pos_neg thm ctxt _ t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 256 | let val thm = equiv_pos_neg_term ctxt thm t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 257 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 258 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 259 | Method.insert_tac ctxt [thm] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 260 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 261 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 262 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 263 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 264 | val equiv_pos1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 265 |   @{lemma "\<not>(a \<longleftrightarrow> ~b) \<or> a \<or> b"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 266 | by blast+} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 267 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 268 | val equiv_pos1 = prove_equiv_pos_neg equiv_pos1_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 269 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 270 | val equiv_pos2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 271 |   @{lemma  "\<And>a b. ((\<not>a) \<noteq> b) \<or> a \<or> b"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 272 | by blast+} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 273 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 274 | val equiv_pos2 = prove_equiv_pos_neg equiv_pos2_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 275 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 276 | val equiv_neg1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 277 |   @{lemma "(~a \<longleftrightarrow> ~b) \<or> a \<or> b"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 278 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 279 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 280 | val equiv_neg1 = prove_equiv_pos_neg equiv_neg1_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 281 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 282 | val equiv_neg2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 283 |   @{lemma "(a \<longleftrightarrow> b) \<or> a \<or> b"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 284 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 285 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 286 | val equiv_neg2 = prove_equiv_pos_neg equiv_neg2_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 287 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 288 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 289 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 290 | (* Most of the code below is due to the proof output of veriT: The description of the rule is wrong | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 291 | (and according to Pascal Fontaine, it is a bug). Anyway, currently, forall_inst does: | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 292 | 1. swapping out the forall quantifiers | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 293 | 2. instantiation | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 294 | 3. boolean. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 295 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 296 | However, types can mess-up things: | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 297 | lemma \<open>(0 < degree a) = (0 \<noteq> degree a) \<Longrightarrow> 0 = degree a \<or> 0 < degree a\<close> | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 298 | by fast | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 299 | works unlike | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 300 | lemma \<open>((0::nat) < degree a) = (0 \<noteq> degree a) \<Longrightarrow> 0 = degree a \<or> 0 < degree a\<close> | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 301 | by fast. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 302 | Therefore, we use fast and auto as fall-back. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 303 | *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 304 | fun forall_inst ctxt _ args t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 305 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 306 | val instantiate = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 307 | fold (fn inst => fn tac => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 308 |          let val thm = Drule.infer_instantiate' ctxt [NONE, SOME (Thm.cterm_of ctxt inst)] @{thm spec}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 309 | in tac THEN' dmatch_tac ctxt [thm]end) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 310 | args | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 311 | (K all_tac) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 312 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 313 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 314 |       resolve_tac ctxt [@{thm disj_not1} RSN (1, @{thm iffD2}) OF [@{thm impI}]]
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 315 |       THEN' TRY' (Raw_Simplifier.rewrite_goal_tac ctxt @{thms all_simps[symmetric] not_all})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 316 | THEN' TRY' instantiate | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 317 | THEN' TRY' (simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 318 | THEN' TRY' (SOLVED' (fn _ => HEADGOAL ( (assume_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 319 | ORELSE' | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 320 |             TRY' (dresolve_tac ctxt @{thms conjE}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 321 | THEN_ALL_NEW assume_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 322 | ORELSE' | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 323 |             TRY' (dresolve_tac ctxt @{thms verit_forall_inst}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 324 | THEN_ALL_NEW assume_tac ctxt)))) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 325 | THEN' (TRY' (Classical.fast_tac ctxt)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 326 | THEN' (TRY' (K (Clasimp.auto_tac ctxt)))) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 327 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 328 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 329 | fun or _ [thm] _ = thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 330 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 331 | val implies_pos_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 332 |   [@{lemma "\<not>(A \<longrightarrow> B) \<or> \<not>A \<or> B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 333 | by blast}, | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 334 |   @{lemma "\<not>(\<not>A \<longrightarrow> B) \<or> A \<or> B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 335 | by blast}] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 336 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 337 | fun implies_pos ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 338 | resolve_tac ctxt implies_pos_thm) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 339 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 340 | fun extract_rewrite_rule_assumption thms = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 341 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 342 | fun is_rewrite_rule thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 343 | (case Thm.prop_of thm of | 
| 69593 | 344 | \<^term>\<open>Trueprop\<close> $ (Const(\<^const_name>\<open>HOL.eq\<close>, _) $ Free(_, _) $ _) => true | 
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 345 | | _ => false) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 346 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 347 | thms | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 348 | |> filter is_rewrite_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 349 |     |> map (fn thm => thm COMP @{thm eq_reflection})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 350 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 351 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 352 | (* We need to unfold the assumptions if we are in a subproof: For multiple skolemization, the context | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 353 | contains a mapping "verit_vrX \<leadsto> Eps f". The variable "verit_vrX" must be unfolded to "Eps f". | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 354 | Otherwise, the proof cannot be done. *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 355 | fun skolem_forall ctxt (thms) t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 356 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 357 | val ts = extract_rewrite_rule_assumption thms | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 358 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 359 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 360 |       REPEAT_CHANGED (resolve_tac ctxt @{thms verit_sko_forall'})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 361 | THEN' TRY' (simplify_tac ctxt ts) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 362 |       THEN' TRY'(resolve_tac ctxt thms THEN_ALL_NEW resolve_tac ctxt @{thms refl})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 363 |       THEN' TRY' (resolve_tac ctxt @{thms refl}))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 364 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 365 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 366 | fun skolem_ex ctxt (thms) t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 367 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 368 | val ts = extract_rewrite_rule_assumption thms | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 369 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 370 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 371 | Raw_Simplifier.rewrite_goal_tac ctxt ts | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 372 |       THEN' REPEAT_CHANGED (resolve_tac ctxt @{thms verit_sko_ex'})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 373 |       THEN' REPEAT_CHANGED (resolve_tac ctxt thms THEN_ALL_NEW resolve_tac ctxt @{thms refl})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 374 |       THEN' TRY' (resolve_tac ctxt @{thms refl}))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 375 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 376 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 377 | fun eq_reflexive ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 378 |   resolve_tac ctxt [@{thm refl}])
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 379 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 380 | fun connective_equiv ctxt thms t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 381 | Method.insert_tac ctxt thms | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 382 | THEN' K (Clasimp.auto_tac ctxt)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 383 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 384 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 385 | fun normalized_input ctxt prems t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 386 | Method.insert_tac ctxt prems | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 387 | THEN' TRY' (simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 388 | THEN' TRY' (K (Clasimp.auto_tac ctxt))) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 389 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 390 | val false_rule_thm = @{lemma "\<not>False" by blast}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 391 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 392 | fun false_rule ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 393 | resolve_tac ctxt [false_rule_thm]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 394 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 395 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 396 | (* transitivity *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 397 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 398 | val trans_bool_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 399 |   @{lemma "P = Q \<Longrightarrow> Q \<Longrightarrow> P" by blast}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 400 | fun trans _ [thm1, thm2] _ = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 401 | (case (Thm.full_prop_of thm1, Thm.full_prop_of thm2) of | 
| 69593 | 402 | (\<^term>\<open>Trueprop\<close> $ (Const(\<^const_name>\<open>HOL.eq\<close>, _) $ _ $ t2), | 
| 403 | \<^term>\<open>Trueprop\<close> $ (Const(\<^const_name>\<open>HOL.eq\<close>, _) $ t3 $ _)) => | |
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 404 |         if t2 = t3 then thm1 RSN (1, thm2 RSN (2, @{thm trans}))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 405 |         else thm1 RSN (1, (thm2 RS sym) RSN (2, @{thm trans}))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 406 | | _ => trans_bool_thm OF [thm1, thm2]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 407 | | trans ctxt (thm1 :: thm2 :: thms) t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 408 | trans ctxt (trans ctxt [thm1, thm2] t :: thms) t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 409 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 410 | fun tmp_AC_rule ctxt _ t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 411 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 412 | val simplify = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 413 | ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 414 | |> empty_simpset | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 415 | |> put_simpset HOL_basic_ss | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 416 |      |> (fn ctxt => ctxt addsimps @{thms ac_simps conj_ac})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 417 | |> Simplifier.full_simp_tac | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 418 | in SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 419 | REPEAT_ALL_NEW (simplify_tac ctxt [] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 420 | THEN' TRY' simplify | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 421 | THEN' TRY' (Classical.fast_tac ctxt))) end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 422 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 423 | fun and_rule ctxt prems t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 424 | Method.insert_tac ctxt prems | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 425 |    THEN' (fn i => REPEAT (dresolve_tac ctxt @{thms conjE} i THEN assume_tac ctxt (i+1)))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 426 | THEN' TRY' (assume_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 427 | THEN' TRY' (simplify_tac ctxt [])) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 428 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 429 | fun not_and_rule ctxt prems t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 430 | Method.insert_tac ctxt prems THEN' | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 431 | Classical.fast_tac ctxt ORELSE' Clasimp.force_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 432 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 433 | fun not_or_rule ctxt prems t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 434 | Method.insert_tac ctxt prems THEN' | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 435 | Classical.fast_tac ctxt ORELSE' Clasimp.force_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 436 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 437 | local | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 438 | fun simplify_and_pos ctxt = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 439 | ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 440 | |> empty_simpset | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 441 | |> put_simpset HOL_basic_ss | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 442 |     |> (fn ctxt => ctxt addsimps @{thms eq_commute verit_ite_intro_simp if_cancel}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 443 |          addsimps @{thms simp_thms de_Morgan_conj})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 444 | |> Simplifier.full_simp_tac | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 445 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 446 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 447 | fun and_pos ctxt _ t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 448 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 449 |   REPEAT_CHANGED (resolve_tac ctxt @{thms verit_and_pos})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 450 | THEN' TRY' (simplify_and_pos ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 451 | THEN' TRY' (assume_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 452 | THEN' TRY' (Classical.fast_tac ctxt)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 453 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 454 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 455 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 456 | fun and_neg_rule ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 457 |   REPEAT_CHANGED (resolve_tac ctxt @{thms verit_and_neg})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 458 |   THEN' simplify_tac ctxt @{thms de_Morgan_conj[symmetric] excluded_middle
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 459 | excluded_middle[of \<open>\<not>_\<close>, unfolded not_not]}) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 460 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 461 | fun or_pos_rule ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 462 |   simplify_tac ctxt @{thms simp_thms})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 463 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 464 | fun or_neg_rule ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 465 |   resolve_tac ctxt @{thms verit_or_neg}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 466 |   THEN' (fn i => dresolve_tac ctxt @{thms verit_subst_bool} i
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 467 | THEN assume_tac ctxt (i+1)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 468 |   THEN' simplify_tac ctxt @{thms simp_thms})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 469 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 470 | val not_equiv1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 471 |   @{lemma "\<not>(A \<longleftrightarrow> B) \<Longrightarrow> A \<or> B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 472 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 473 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 474 | fun not_equiv1 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 475 | Method.insert_tac ctxt [not_equiv1_thm OF [thm]] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 476 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 477 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 478 | val not_equiv2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 479 |   @{lemma "\<not>(A \<longleftrightarrow> B) \<Longrightarrow> \<not>A \<or> \<not>B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 480 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 481 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 482 | fun not_equiv2 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 483 | Method.insert_tac ctxt [not_equiv2_thm OF [thm]] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 484 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 485 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 486 | val equiv1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 487 |   @{lemma "(A \<longleftrightarrow> B) \<Longrightarrow> \<not>A \<or> B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 488 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 489 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 490 | fun equiv1 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 491 | Method.insert_tac ctxt [equiv1_thm OF [thm]] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 492 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 493 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 494 | val equiv2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 495 |   @{lemma "(A \<longleftrightarrow> B) \<Longrightarrow> A \<or> \<not>B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 496 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 497 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 498 | fun equiv2 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 499 | Method.insert_tac ctxt [equiv2_thm OF [thm]] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 500 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 501 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 502 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 503 | val not_implies1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 504 |   @{lemma "\<not>(A \<longrightarrow> B) \<Longrightarrow> A"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 505 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 506 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 507 | fun not_implies1 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 508 | Method.insert_tac ctxt [not_implies1_thm OF [thm]] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 509 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 510 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 511 | val not_implies2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 512 |   @{lemma "\<not>(A \<longrightarrow>B) \<Longrightarrow> \<not>B"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 513 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 514 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 515 | fun not_implies2 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 516 | Method.insert_tac ctxt [not_implies2_thm OF [thm]] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 517 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 518 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 519 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 520 | local | 
| 69593 | 521 | fun implies_pos_neg_term ctxt thm (\<^term>\<open>Trueprop\<close> $ | 
| 522 | (\<^term>\<open>HOL.disj\<close> $ (\<^term>\<open>HOL.implies\<close> $ a $ b) $ _)) = | |
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 523 | Drule.infer_instantiate' ctxt (map (SOME o Thm.cterm_of ctxt) [a, b]) thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 524 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 525 | fun prove_implies_pos_neg thm ctxt _ t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 526 | let val thm = implies_pos_neg_term ctxt thm t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 527 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 528 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 529 | Method.insert_tac ctxt [thm] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 530 | THEN' simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 531 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 532 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 533 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 534 | val implies_neg1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 535 |   @{lemma "(a \<longrightarrow> b) \<or> a"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 536 | by blast} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 537 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 538 | val implies_neg1 = prove_implies_pos_neg implies_neg1_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 539 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 540 | val implies_neg2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 541 |   @{lemma "(a \<longrightarrow> b) \<or> \<not>b" by blast}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 542 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 543 | val implies_neg2 = prove_implies_pos_neg implies_neg2_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 544 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 545 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 546 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 547 | val implies_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 548 |   @{lemma "(~a \<longrightarrow> b) \<Longrightarrow> a \<or> b"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 549 | "(a \<longrightarrow> b) \<Longrightarrow> \<not>a \<or> b" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 550 | by blast+} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 551 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 552 | fun implies_rules ctxt prems t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 553 | Method.insert_tac ctxt prems | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 554 | THEN' resolve_tac ctxt implies_thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 555 | THEN' assume_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 556 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 557 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 558 | (* | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 559 | Here is a case where force_tac fails, but auto_tac succeeds: | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 560 | Ex (P x) \<noteq> P x c \<Longrightarrow> | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 561 | (\<exists>v0. if x then P True v0 else P False v0) \<noteq> (if x then P True c else P False c) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 562 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 563 | (this was before we added the eqsubst_tac). Therefore, to be safe, we add the fast, auto, and force. | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 564 | *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 565 | fun tmp_bfun_elim ctxt prems t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 566 | Method.insert_tac ctxt prems | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 567 |   THEN' REPEAT_CHANGED (EqSubst.eqsubst_tac ctxt [0] @{thms verit_tmp_bfun_elim})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 568 | THEN' TRY' (simplify_tac ctxt []) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 569 | THEN' (Classical.fast_tac ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 570 | ORELSE' K (Clasimp.auto_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 571 | ORELSE' Clasimp.force_tac ctxt)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 572 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 573 | val ite_pos1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 574 |   @{lemma "\<not>(if x then P else Q) \<or> x \<or> Q"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 575 | by auto} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 576 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 577 | fun ite_pos1 ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 578 | resolve_tac ctxt [ite_pos1_thm]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 579 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 580 | val ite_pos2_thms = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 581 |   @{lemma "\<not>(if x then P else Q) \<or> \<not>x \<or> P" "\<not>(if \<not>x then P else Q) \<or> x \<or> P"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 582 | by auto} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 583 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 584 | fun ite_pos2 ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 585 | resolve_tac ctxt ite_pos2_thms) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 586 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 587 | val ite_neg1_thms = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 588 |   @{lemma "(if x then P else Q) \<or> x \<or> \<not>Q" "(if x then P else \<not>Q) \<or> x \<or> Q"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 589 | by auto} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 590 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 591 | fun ite_neg1 ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 592 | resolve_tac ctxt ite_neg1_thms) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 593 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 594 | val ite_neg2_thms = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 595 |   @{lemma "(if x then P else Q) \<or> \<not>x \<or> \<not>P" "(if \<not>x then P else Q) \<or> x \<or> \<not>P"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 596 | "(if x then \<not>P else Q) \<or> \<not>x \<or> P" "(if \<not>x then \<not>P else Q) \<or> x \<or> P" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 597 | by auto} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 598 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 599 | fun ite_neg2 ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 600 | resolve_tac ctxt ite_neg2_thms) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 601 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 602 | val ite1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 603 |   @{lemma "(if x then P else Q) \<Longrightarrow> x \<or> Q"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 604 | by (auto split: if_splits) } | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 605 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 606 | fun ite1 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 607 | resolve_tac ctxt [ite1_thm OF [thm]]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 608 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 609 | val ite2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 610 |   @{lemma "(if x then P else Q) \<Longrightarrow> \<not>x \<or> P"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 611 | by (auto split: if_splits) } | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 612 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 613 | fun ite2 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 614 | resolve_tac ctxt [ite2_thm OF [thm]]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 615 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 616 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 617 | val not_ite1_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 618 |   @{lemma "\<not>(if x then P else Q) \<Longrightarrow> x \<or> \<not>Q"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 619 | by (auto split: if_splits) } | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 620 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 621 | fun not_ite1 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 622 | resolve_tac ctxt [not_ite1_thm OF [thm]]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 623 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 624 | val not_ite2_thm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 625 |   @{lemma "\<not>(if x then P else Q) \<Longrightarrow> \<not>x \<or> \<not>P"
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 626 | by (auto split: if_splits) } | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 627 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 628 | fun not_ite2 ctxt [thm] t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 629 | resolve_tac ctxt [not_ite2_thm OF [thm]]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 630 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 631 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 632 | fun unit_res ctxt thms t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 633 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 634 | val thms = map (Conv.fconv_rule Thm.eta_long_conversion) thms | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 635 | val t' = Thm.eta_long_conversion (Object_Logic.dest_judgment ctxt (Thm.cterm_of ctxt t)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 636 | val (_, t2) = Logic.dest_equals (Thm.prop_of t') | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 637 | val thm = Z3_Replay_Methods.unit_res ctxt thms t2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 638 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 639 |     @{thm verit_Pure_trans} OF [t', thm]
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 640 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 641 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 642 | fun ite_intro ctxt _ t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 643 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 644 | fun simplify_ite ctxt = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 645 | ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 646 | |> empty_simpset | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 647 | |> put_simpset HOL_basic_ss | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 648 |       |> (fn ctxt => ctxt addsimps @{thms eq_commute verit_ite_intro_simp if_cancel}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 649 |            addsimps @{thms simp_thms})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 650 | |> Simplifier.full_simp_tac | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 651 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 652 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 653 | (simplify_ite ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 654 | THEN' TRY' (Blast.blast_tac ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 655 | ORELSE' K (Clasimp.auto_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 656 | ORELSE' Clasimp.force_tac ctxt))) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 657 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 658 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 659 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 660 | (* Quantifiers *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 661 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 662 | fun qnt_rm_unused ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 663 | Classical.fast_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 664 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 665 | fun qnt_simplify ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 666 | Classical.fast_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 667 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 668 | fun qnt_join ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 669 | Classical.fast_tac ctxt) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 670 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 671 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 672 | (* Equality *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 673 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 674 | fun eq_transitive ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 675 |   REPEAT_CHANGED (resolve_tac ctxt [@{thm disj_not1} RSN (1, @{thm iffD2}) OF @{thms impI}])
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 676 |   THEN' REPEAT' (resolve_tac ctxt @{thms impI})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 677 |   THEN' REPEAT' (eresolve_tac ctxt @{thms conjI})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 678 |   THEN' REPEAT' (fn i => dresolve_tac ctxt @{thms verit_eq_transitive} i THEN assume_tac ctxt (i+1))
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 679 |   THEN' resolve_tac ctxt @{thms refl})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 680 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 681 | local | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 682 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 683 | (* Rewrite might apply below choice. As we do not want to change them (it can break other | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 684 | rewriting steps), we cannot use Term.lambda *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 685 | fun abstract_over_no_choice (v, body) = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 686 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 687 | fun abs lev tm = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 688 | if v aconv tm then Bound lev | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 689 | else | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 690 | (case tm of | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 691 | Abs (a, T, t) => Abs (a, T, abs (lev + 1) t) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 692 | | t as (Const (\<^const_name>\<open>Hilbert_Choice.Eps\<close>, _) $ _) => t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 693 | | t $ u => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 694 | (abs lev t $ (abs lev u handle Same.SAME => u) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 695 | handle Same.SAME => t $ abs lev u) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 696 | | _ => raise Same.SAME); | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 697 | in abs 0 body handle Same.SAME => body end; | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 698 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 699 | fun lambda_name (x, v) t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 700 | Abs (if x = "" then Term.term_name v else x, fastype_of v, abstract_over_no_choice (v, t)); | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 701 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 702 |   fun lambda v t = lambda_name ("", v) t;
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 703 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 704 | fun extract_equal_terms (Const(\<^const_name>\<open>Trueprop\<close>, _) $ t) = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 705 | let fun ext (Const(\<^const_name>\<open>HOL.disj\<close>, _) $ (Const(\<^const_name>\<open>HOL.Not\<close>, _) $ | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 706 | (Const(\<^const_name>\<open>HOL.eq\<close>, _) $ t1 $ t2)) $ t) = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 707 | apfst (curry (op ::) (t1, t2)) (ext t) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 708 | | ext t = ([], t) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 709 | in ext t end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 710 | fun eq_congruent_tac ctxt t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 711 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 712 | val (eqs, g) = extract_equal_terms t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 713 | fun replace1 (t1, t2) (g, tac) = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 714 | let | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 715 | val abs_t1 = lambda t2 g | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 716 | val subst = Drule.infer_instantiate' ctxt (map (SOME o Thm.cterm_of ctxt) [t1, t2, abs_t1]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 717 |                 @{thm subst}
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 718 | in (Term.betapply (abs_t1, t1), | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 719 | tac THEN' resolve_tac ctxt [subst] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 720 | THEN' TRY' (assume_tac ctxt)) end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 721 | val (_, tac) = fold replace1 eqs (g, K all_tac) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 722 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 723 | tac | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 724 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 725 | in | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 726 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 727 | fun eq_congruent_pred ctxt _ t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 728 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 729 |    REPEAT' (resolve_tac ctxt [@{thm disj_not1[of \<open>_ = _\<close>]} RSN (1, @{thm iffD2}) OF @{thms impI}])
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 730 |    THEN' REPEAT' (eresolve_tac ctxt @{thms conjI})
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 731 | THEN' eq_congruent_tac ctxt t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 732 |    THEN' resolve_tac ctxt @{thms refl excluded_middle
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 733 | excluded_middle[of \<open>\<not>_\<close>, unfolded not_not]}) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 734 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 735 | end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 736 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 737 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 738 | (* subproof *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 739 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 740 | fun subproof ctxt [prem] t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 741 | SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 742 |    (resolve_tac ctxt [@{thm disj_not1} RSN (1, @{thm iffD2}) OF [@{thm impI}],
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 743 |         @{thm disj_not1[of \<open>\<not>_\<close>, unfolded not_not]} RSN (1, @{thm iffD2}) OF [@{thm impI}]]
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 744 | THEN' resolve_tac ctxt [prem] | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 745 | THEN_ALL_NEW assume_tac ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 746 | THEN' TRY' (assume_tac ctxt)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 747 | ORELSE' TRY' (Method.insert_tac ctxt [prem] THEN' Blast.blast_tac ctxt)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 748 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 749 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 750 | (* la_rw_eq *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 751 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 752 | val la_rw_eq_thm = @{lemma \<open>(a :: nat) = b \<or> (a \<le> b) \<or> (a \<ge> b)\<close>
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 753 | by auto} | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 754 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 755 | fun la_rw_eq ctxt _ t = SMT_Replay_Methods.prove ctxt t (fn _ => | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 756 | resolve_tac ctxt [la_rw_eq_thm]) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 757 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 758 | (* congruence *) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 759 | fun cong ctxt thms = SMT_Replay_Methods.try_provers ctxt | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 760 | (string_of_verit_rule Cong) [ | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 761 |   ("basic", SMT_Replay_Methods.cong_basic ctxt thms),
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 762 |   ("full", SMT_Replay_Methods.cong_full ctxt thms),
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 763 |   ("unfolding then auto", SMT_Replay_Methods.cong_unfolding_first ctxt thms)] thms
 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 764 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 765 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 766 | fun unsupported rule ctxt thms _ t = SMT_Replay_Methods.replay_error ctxt "Unsupported verit rule" | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 767 | rule thms t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 768 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 769 | fun ignore_args f ctxt thm _ t = f ctxt thm t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 770 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 771 | fun choose Bind = ignore_args bind | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 772 | | choose Refl = ignore_args refl | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 773 | | choose And_Pos = ignore_args and_pos | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 774 | | choose And_Neg = ignore_args and_neg_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 775 | | choose Cong = ignore_args cong | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 776 | | choose Equiv_pos1 = ignore_args equiv_pos1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 777 | | choose Equiv_pos2 = ignore_args equiv_pos2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 778 | | choose Equiv_neg1 = ignore_args equiv_neg1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 779 | | choose Equiv_neg2 = ignore_args equiv_neg2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 780 | | choose Equiv1 = ignore_args equiv1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 781 | | choose Equiv2 = ignore_args equiv2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 782 | | choose Not_Equiv1 = ignore_args not_equiv1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 783 | | choose Not_Equiv2 = ignore_args not_equiv2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 784 | | choose Not_Implies1 = ignore_args not_implies1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 785 | | choose Not_Implies2 = ignore_args not_implies2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 786 | | choose Implies_Neg1 = ignore_args implies_neg1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 787 | | choose Implies_Neg2 = ignore_args implies_neg2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 788 | | choose Implies_Pos = ignore_args implies_pos | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 789 | | choose Implies = ignore_args implies_rules | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 790 | | choose Forall_Inst = forall_inst | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 791 | | choose Skolem_Forall = ignore_args skolem_forall | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 792 | | choose Skolem_Ex = ignore_args skolem_ex | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 793 | | choose Or = ignore_args or | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 794 | | choose Theory_Resolution = ignore_args unit_res | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 795 | | choose Resolution = ignore_args unit_res | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 796 | | choose Eq_Reflexive = ignore_args eq_reflexive | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 797 | | choose Connective_Equiv = ignore_args connective_equiv | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 798 | | choose Trans = ignore_args trans | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 799 | | choose False = ignore_args false_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 800 | | choose Tmp_AC_Simp = ignore_args tmp_AC_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 801 | | choose And = ignore_args and_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 802 | | choose Not_And = ignore_args not_and_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 803 | | choose Not_Or = ignore_args not_or_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 804 | | choose Or_Pos = ignore_args or_pos_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 805 | | choose Or_Neg = ignore_args or_neg_rule | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 806 | | choose Tmp_Bfun_Elim = ignore_args tmp_bfun_elim | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 807 | | choose ITE1 = ignore_args ite1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 808 | | choose ITE2 = ignore_args ite2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 809 | | choose Not_ITE1 = ignore_args not_ite1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 810 | | choose Not_ITE2 = ignore_args not_ite2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 811 | | choose ITE_Pos1 = ignore_args ite_pos1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 812 | | choose ITE_Pos2 = ignore_args ite_pos2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 813 | | choose ITE_Neg1 = ignore_args ite_neg1 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 814 | | choose ITE_Neg2 = ignore_args ite_neg2 | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 815 | | choose ITE_Intro = ignore_args ite_intro | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 816 | | choose LA_Disequality = ignore_args Z3_Replay_Methods.arith_th_lemma | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 817 | | choose LIA_Generic = ignore_args Z3_Replay_Methods.arith_th_lemma | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 818 | | choose LA_Generic = ignore_args Z3_Replay_Methods.arith_th_lemma | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 819 | | choose LA_Totality = ignore_args Z3_Replay_Methods.arith_th_lemma | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 820 | | choose LA_Tautology = ignore_args Z3_Replay_Methods.arith_th_lemma | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 821 | | choose LA_RW_Eq = ignore_args la_rw_eq | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 822 | | choose NLA_Generic = ignore_args Z3_Replay_Methods.arith_th_lemma | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 823 | | choose Normalized_Input = ignore_args normalized_input | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 824 | | choose Qnt_Rm_Unused = ignore_args qnt_rm_unused | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 825 | | choose Qnt_Simplify = ignore_args qnt_simplify | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 826 | | choose Qnt_Join = ignore_args qnt_join | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 827 | | choose Eq_Congruent_Pred = ignore_args eq_congruent_pred | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 828 | | choose Eq_Congruent = ignore_args eq_congruent_pred | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 829 | | choose Eq_Transitive = ignore_args eq_transitive | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 830 | | choose Local_Input = ignore_args refl | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 831 | | choose Subproof = ignore_args subproof | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 832 | | choose r = unsupported (string_of_verit_rule r) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 833 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 834 | type Verit_method = Proof.context -> thm list -> term -> thm | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 835 | type abs_context = int * term Termtab.table | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 836 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 837 | fun with_tracing rule method ctxt thms args t = | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 838 | let val _ = SMT_Replay_Methods.trace_goal ctxt rule thms t | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 839 | in method ctxt thms args t end | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 840 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 841 | fun method_for rule = with_tracing rule (choose (verit_rule_of rule)) | 
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 842 | |
| 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: diff
changeset | 843 | end; |