| author | kleing | 
| Thu, 19 Feb 2009 23:55:10 +1100 | |
| changeset 29984 | 015c56cc1864 | 
| parent 29834 | 3237cfd177f3 | 
| child 30148 | 5d04b67a866e | 
| permissions | -rw-r--r-- | 
| 29650 | 1 | (* Title: HOL/Library/reflection.ML | 
| 2 | Author: Amine Chaieb, TU Muenchen | |
| 20319 | 3 | |
| 4 | A trial for automatical reification. | |
| 5 | *) | |
| 6 | ||
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 7 | signature REFLECTION = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 8 | sig | 
| 20319 | 9 | val genreify_tac: Proof.context -> thm list -> term option -> int -> tactic | 
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 10 | val reflection_tac: Proof.context -> thm list -> thm list -> term option -> int -> tactic | 
| 21878 | 11 | val gen_reflection_tac: Proof.context -> (cterm -> thm) | 
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 12 | -> thm list -> thm list -> term option -> int -> tactic | 
| 20319 | 13 | end; | 
| 14 | ||
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 15 | structure Reflection : REFLECTION = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 16 | struct | 
| 20319 | 17 | |
| 29650 | 18 | val ext2 = @{thm ext2};
 | 
| 19 | val nth_Cons_0 = @{thm nth_Cons_0};
 | |
| 20 | val nth_Cons_Suc = @{thm nth_Cons_Suc};
 | |
| 21669 | 21 | |
| 20374 | 22 | (* Make a congruence rule out of a defining equation for the interpretation *) | 
| 23 | (* th is one defining equation of f, i.e. | |
| 24 | th is "f (Cp ?t1 ... ?tn) = P(f ?t1, .., f ?tn)" *) | |
| 25 | (* Cp is a constructor pattern and P is a pattern *) | |
| 26 | ||
| 27 | (* The result is: | |
| 28 | [|?A1 = f ?t1 ; .. ; ?An= f ?tn |] ==> P (?A1, .., ?An) = f (Cp ?t1 .. ?tn) *) | |
| 29 | (* + the a list of names of the A1 .. An, Those are fresh in the ctxt*) | |
| 30 | ||
| 31 | ||
| 32 | fun mk_congeq ctxt fs th = | |
| 33 | let | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 34 | val (f as Const(fN,fT)) = th |> prop_of |> HOLogic.dest_Trueprop |> HOLogic.dest_eq | 
| 29650 | 35 | |> fst |> strip_comb |> fst | 
| 20374 | 36 | val thy = ProofContext.theory_of ctxt | 
| 37 | val cert = Thm.cterm_of thy | |
| 22568 
ed7aa5a350ef
renamed Variable.import to import_thms (avoid clash with Alice keywords);
 wenzelm parents: 
22199diff
changeset | 38 | val (((_,_),[th']), ctxt') = Variable.import_thms true [th] ctxt | 
| 20374 | 39 | val (lhs, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop (Thm.prop_of th')) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 40 | fun add_fterms (t as t1 $ t2) = | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 41 | if exists (fn f => Term.could_unify (t |> strip_comb |> fst, f)) fs then insert (op aconv) t | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 42 | else add_fterms t1 #> add_fterms t2 | 
| 20374 | 43 | | add_fterms (t as Abs(xn,xT,t')) = | 
| 29273 | 44 | if exists_Const (fn (c, _) => c = fN) t then (fn _ => [t]) else (fn _ => []) | 
| 20374 | 45 | | add_fterms _ = I | 
| 46 | val fterms = add_fterms rhs [] | |
| 20797 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 wenzelm parents: 
20595diff
changeset | 47 | val (xs, ctxt'') = Variable.variant_fixes (replicate (length fterms) "x") ctxt' | 
| 20374 | 48 | val tys = map fastype_of fterms | 
| 49 | val vs = map Free (xs ~~ tys) | |
| 50 | val env = fterms ~~ vs | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 51 | (* FIXME!!!!*) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 52 | fun replace_fterms (t as t1 $ t2) = | 
| 20374 | 53 | (case AList.lookup (op aconv) env t of | 
| 54 | SOME v => v | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 55 | | NONE => replace_fterms t1 $ replace_fterms t2) | 
| 20374 | 56 | | replace_fterms t = (case AList.lookup (op aconv) env t of | 
| 57 | SOME v => v | |
| 58 | | NONE => t) | |
| 59 | ||
| 60 | fun mk_def (Abs(x,xT,t),v) = HOLogic.mk_Trueprop ((HOLogic.all_const xT)$ Abs(x,xT,HOLogic.mk_eq(v$(Bound 0), t))) | |
| 61 | | mk_def (t, v) = HOLogic.mk_Trueprop (HOLogic.mk_eq (v, t)) | |
| 23605 | 62 | fun tryext x = (x RS ext2 handle THM _ => x) | 
| 20374 | 63 | val cong = (Goal.prove ctxt'' [] (map mk_def env) | 
| 64 | (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, replace_fterms rhs))) | |
| 65 | (fn x => LocalDefs.unfold_tac (#context x) (map tryext (#prems x)) | |
| 66 | THEN rtac th' 1)) RS sym | |
| 67 | ||
| 68 | val (cong' :: vars') = | |
| 69 | Variable.export ctxt'' ctxt (cong :: map (Drule.mk_term o cert) vs) | |
| 70 | val vs' = map (fst o fst o Term.dest_Var o Thm.term_of o Drule.dest_term) vars' | |
| 71 | ||
| 72 | in (vs', cong') end; | |
| 20319 | 73 | (* congs is a list of pairs (P,th) where th is a theorem for *) | 
| 74 | (* [| f p1 = A1; ...; f pn = An|] ==> f (C p1 .. pn) = P *) | |
| 75 | val FWD = curry (op OF); | |
| 76 | ||
| 77 | (* da is the decomposition for atoms, ie. it returns ([],g) where g | |
| 78 | returns the right instance f (AtC n) = t , where AtC is the Atoms | |
| 79 | constructor and n is the number of the atom corresponding to t *) | |
| 80 | ||
| 81 | (* Generic decomp for reification : matches the actual term with the | |
| 82 | rhs of one cong rule. The result of the matching guides the | |
| 83 | proof synthesis: The matches of the introduced Variables A1 .. An are | |
| 84 | processed recursively | |
| 85 | The rest is instantiated in the cong rule,i.e. no reification is needed *) | |
| 86 | ||
| 20374 | 87 | exception REIF of string; | 
| 88 | ||
| 29834 | 89 | fun dest_listT (Type ("List.list", [T])) = T;
 | 
| 90 | ||
| 91 | fun partition P [] = ([],[]) | |
| 92 | | partition P (x::xs) = | |
| 93 | let val (yes,no) = partition P xs | |
| 94 | in if P x then (x::yes,no) else (yes, x::no) end | |
| 95 | ||
| 96 | fun rearrange congs = | |
| 97 | let | |
| 98 | fun P (_, th) = | |
| 99 |   let val @{term "Trueprop"}$(Const ("op =",_) $l$_) = concl_of th
 | |
| 100 | in can dest_Var l end | |
| 101 | val (yes,no) = partition P congs | |
| 102 | in no @ yes end | |
| 103 | ||
| 104 | fun genreif ctxt raw_eqs t = | |
| 105 | let | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 106 | val bds = ref ([]: (typ * ((term list) * (term list))) list); | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 107 | |
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 108 | fun index_of t = | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 109 | let | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 110 | val tt = HOLogic.listT (fastype_of t) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 111 | in | 
| 22199 
b617ddd200eb
Now deals with simples cases where the input equations contain type variables
 chaieb parents: 
21878diff
changeset | 112 | (case AList.lookup Type.could_unify (!bds) tt of | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 113 | NONE => error "index_of : type not found in environements!" | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 114 | | SOME (tbs,tats) => | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 115 | let | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 116 | val i = find_index_eq t tats | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 117 | val j = find_index_eq t tbs | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 118 | in (if j= ~1 then | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 119 | if i= ~1 | 
| 23605 | 120 | then (bds := AList.update Type.could_unify (tt,(tbs,tats@[t])) (!bds) ; | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 121 | length tbs + length tats) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 122 | else i else j) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 123 | end) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 124 | end; | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 125 | |
| 20374 | 126 | fun decomp_genreif da cgns (t,ctxt) = | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 127 | let | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 128 | val thy = ProofContext.theory_of ctxt | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 129 | val cert = cterm_of thy | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 130 | fun tryabsdecomp (s,ctxt) = | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 131 | (case s of | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 132 | Abs(xn,xT,ta) => | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 133 | (let | 
| 20797 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 wenzelm parents: 
20595diff
changeset | 134 | val ([xn],ctxt') = Variable.variant_fixes ["x"] ctxt | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 135 | val (xn,ta) = variant_abs (xn,xT,ta) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 136 | val x = Free(xn,xT) | 
| 23605 | 137 | val _ = (case AList.lookup Type.could_unify (!bds) (HOLogic.listT xT) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 138 | of NONE => error "tryabsdecomp: Type not found in the Environement" | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 139 | | SOME (bsT,atsT) => | 
| 23605 | 140 | (bds := AList.update Type.could_unify (HOLogic.listT xT, ((x::bsT), atsT)) (!bds))) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 141 | in ([(ta, ctxt')] , | 
| 23605 | 142 | fn [th] => ((let val (bsT,asT) = the(AList.lookup Type.could_unify (!bds) (HOLogic.listT xT)) | 
| 143 | in (bds := AList.update Type.could_unify (HOLogic.listT xT,(tl bsT,asT)) (!bds)) | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 144 | end) ; | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 145 | hd (Variable.export ctxt' ctxt [(forall_intr (cert x) th) COMP allI]))) | 
| 20374 | 146 | end) | 
| 147 | | _ => da (s,ctxt)) | |
| 148 | in | |
| 149 | (case cgns of | |
| 150 | [] => tryabsdecomp (t,ctxt) | |
| 151 | | ((vns,cong)::congs) => ((let | |
| 152 | val cert = cterm_of thy | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 153 | val certy = ctyp_of thy | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 154 | val (tyenv, tmenv) = | 
| 20319 | 155 | Pattern.match thy | 
| 156 | ((fst o HOLogic.dest_eq o HOLogic.dest_Trueprop) (concl_of cong), t) | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 157 | (Envir.type_env (Envir.empty 0), Vartab.empty) | 
| 20319 | 158 | val (fnvs,invs) = List.partition (fn ((vn,_),_) => vn mem vns) (Vartab.dest tmenv) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 159 | val (fts,its) = | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 160 | (map (snd o snd) fnvs, | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 161 | map (fn ((vn,vi),(tT,t)) => (cert(Var ((vn,vi),tT)), cert t)) invs) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 162 | val ctyenv = map (fn ((vn,vi),(s,ty)) => (certy (TVar((vn,vi),s)), certy ty)) (Vartab.dest tyenv) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 163 | in (fts ~~ (replicate (length fts) ctxt), FWD (instantiate (ctyenv, its) cong)) | 
| 20319 | 164 | end) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 165 | handle MATCH => decomp_genreif da congs (t,ctxt))) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 166 | end; | 
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 167 | |
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 168 | (* looks for the atoms equation and instantiates it with the right number *) | 
| 20374 | 169 | fun mk_decompatom eqs (t,ctxt) = | 
| 23605 | 170 | let | 
| 171 | val tT = fastype_of t | |
| 172 | fun isat eq = | |
| 173 | let | |
| 174 | val rhs = eq |> prop_of |> HOLogic.dest_Trueprop |> HOLogic.dest_eq |> snd | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 175 | in exists_Const | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 176 | (fn (n,ty) => n="List.nth" | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 177 | andalso | 
| 22199 
b617ddd200eb
Now deals with simples cases where the input equations contain type variables
 chaieb parents: 
21878diff
changeset | 178 | AList.defined Type.could_unify (!bds) (domain_type ty)) rhs | 
| 
b617ddd200eb
Now deals with simples cases where the input equations contain type variables
 chaieb parents: 
21878diff
changeset | 179 | andalso Type.could_unify (fastype_of rhs, tT) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 180 | end | 
| 23605 | 181 | fun get_nths t acc = | 
| 182 | case t of | |
| 183 |     Const("List.nth",_)$vs$n => insert (fn ((a,_),(b,_)) => a aconv b) (t,(vs,n)) acc
 | |
| 184 | | t1$t2 => get_nths t1 (get_nths t2 acc) | |
| 185 | | Abs(_,_,t') => get_nths t' acc | |
| 186 | | _ => acc | |
| 23548 
e25991f126ce
Generalized case for atoms. Selection of environment lists is allowed more than once.
 chaieb parents: 
22568diff
changeset | 187 | |
| 23605 | 188 | fun | 
| 189 | tryeqs [] = error "Can not find the atoms equation" | |
| 190 | | tryeqs (eq::eqs) = (( | |
| 191 | let | |
| 192 | val rhs = eq |> prop_of |> HOLogic.dest_Trueprop |> HOLogic.dest_eq |> snd | |
| 193 | val nths = get_nths rhs [] | |
| 194 | val (vss,ns) = fold_rev (fn (_,(vs,n)) => fn (vss,ns) => | |
| 195 | (insert (op aconv) vs vss, insert (op aconv) n ns)) nths ([],[]) | |
| 196 | val (vsns, ctxt') = Variable.variant_fixes (replicate (length vss) "vs") ctxt | |
| 197 | val (xns, ctxt'') = Variable.variant_fixes (replicate (length nths) "x") ctxt' | |
| 198 | val thy = ProofContext.theory_of ctxt'' | |
| 199 | val cert = cterm_of thy | |
| 200 | val certT = ctyp_of thy | |
| 201 | val vsns_map = vss ~~ vsns | |
| 202 | val xns_map = (fst (split_list nths)) ~~ xns | |
| 203 | val subst = map (fn (nt, xn) => (nt, Var ((xn,0), fastype_of nt))) xns_map | |
| 204 | val rhs_P = subst_free subst rhs | |
| 205 | val (tyenv, tmenv) = Pattern.match | |
| 206 | thy (rhs_P, t) | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: 
24630diff
changeset | 207 | (Envir.type_env (Envir.empty 0), Vartab.empty) | 
| 23605 | 208 | val sbst = Envir.subst_vars (tyenv, tmenv) | 
| 209 | val sbsT = Envir.typ_subst_TVars tyenv | |
| 210 | val subst_ty = map (fn (n,(s,t)) => (certT (TVar (n, s)), certT t)) | |
| 211 | (Vartab.dest tyenv) | |
| 212 | val tml = Vartab.dest tmenv | |
| 213 | val t's = map (fn xn => snd (valOf (AList.lookup (op =) tml (xn,0)))) xns (* FIXME : Express with sbst*) | |
| 214 | val subst_ns = map (fn (Const _ $ vs $ n, Var (xn0,T)) => | |
| 215 | (cert n, snd (valOf (AList.lookup (op =) tml xn0)) | |
| 24630 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 wenzelm parents: 
24044diff
changeset | 216 | |> (index_of #> HOLogic.mk_nat #> cert))) | 
| 23605 | 217 | subst | 
| 218 | val subst_vs = | |
| 219 | let | |
| 220 | fun ty (Const _ $ (vs as Var (vsn,lT)) $ n, Var (xn0,T)) = (certT T, certT (sbsT T)) | |
| 221 | fun h (Const _ $ (vs as Var (vsn,lT)) $ n, Var (xn0,T)) = | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 222 | let | 
| 23605 | 223 |        val cns = sbst (Const("List.list.Cons", T --> lT --> lT))
 | 
| 224 | val lT' = sbsT lT | |
| 225 | val (bsT,asT) = the (AList.lookup Type.could_unify (!bds) lT) | |
| 226 | val vsn = valOf (AList.lookup (op =) vsns_map vs) | |
| 227 | val cvs = cert (fold_rev (fn x => fn xs => cns$x$xs) bsT (Free (vsn, lT'))) | |
| 228 | in (cert vs, cvs) end | |
| 229 | in map h subst end | |
| 230 | val cts = map (fn ((vn,vi),(tT,t)) => (cert(Var ((vn,vi),tT)), cert t)) | |
| 231 | (fold (AList.delete (fn (((a: string),_),(b,_)) => a = b)) | |
| 232 | (map (fn n => (n,0)) xns) tml) | |
| 233 | val substt = | |
| 234 | let val ih = Drule.cterm_rule (Thm.instantiate (subst_ty,[])) | |
| 235 | in map (fn (v,t) => (ih v, ih t)) (subst_ns@subst_vs@cts) end | |
| 236 | val th = (instantiate (subst_ty, substt) eq) RS sym | |
| 237 | in hd (Variable.export ctxt'' ctxt [th]) end) | |
| 238 | handle MATCH => tryeqs eqs) | |
| 239 | in ([], fn _ => tryeqs (filter isat eqs)) | |
| 240 | end; | |
| 20374 | 241 | |
| 20319 | 242 | (* Generic reification procedure: *) | 
| 243 | (* creates all needed cong rules and then just uses the theorem synthesis *) | |
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 244 | |
| 29834 | 245 | fun mk_congs ctxt raw_eqs = | 
| 246 | let | |
| 21078 | 247 | val fs = fold_rev (fn eq => | 
| 20853 | 248 | insert (op =) (eq |> prop_of |> HOLogic.dest_Trueprop | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 249 | |> HOLogic.dest_eq |> fst |> strip_comb | 
| 21078 | 250 | |> fst)) raw_eqs [] | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 251 | val tys = fold_rev (fn f => fn ts => (f |> fastype_of |> binder_types |> tl) | 
| 21078 | 252 | union ts) fs [] | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 253 | val _ = bds := AList.make (fn _ => ([],[])) tys | 
| 20797 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 wenzelm parents: 
20595diff
changeset | 254 | val (vs, ctxt') = Variable.variant_fixes (replicate (length tys) "vs") ctxt | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 255 | val thy = ProofContext.theory_of ctxt' | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 256 | val cert = cterm_of thy | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 257 | val vstys = map (fn (t,v) => (t,SOME (cert (Free(v,t))))) | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 258 | (tys ~~ vs) | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 259 | val is_Var = can dest_Var | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 260 | fun insteq eq vs = | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 261 | let | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 262 | val subst = map (fn (v as Var(n,t)) => (cert v, (valOf o valOf) (AList.lookup (op =) vstys t))) | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 263 | (filter is_Var vs) | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 264 | in Thm.instantiate ([],subst) eq | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 265 | end | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 266 | val eqs = map (fn eq => eq |> prop_of |> HOLogic.dest_Trueprop | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 267 | |> HOLogic.dest_eq |> fst |> strip_comb |> snd |> tl | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 268 | |> (insteq eq)) raw_eqs | 
| 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 269 | val (ps,congs) = split_list (map (mk_congeq ctxt' fs) eqs) | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 270 | in ps ~~ (Variable.export ctxt' ctxt congs) | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 271 | end | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 272 | |
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 273 | val congs = rearrange (mk_congs ctxt raw_eqs) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 274 | val th = divide_and_conquer (decomp_genreif (mk_decompatom raw_eqs) congs) (t,ctxt) | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 275 | fun is_listVar (Var (_,t)) = can dest_listT t | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 276 | | is_listVar _ = false | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 277 | val vars = th |> prop_of |> HOLogic.dest_Trueprop |> HOLogic.dest_eq |> snd | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 278 | |> strip_comb |> snd |> filter is_listVar | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 279 | val cert = cterm_of (ProofContext.theory_of ctxt) | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 280 | val cvs = map (fn (v as Var(n,t)) => (cert v, the (AList.lookup Type.could_unify (!bds) t) |> snd |> HOLogic.mk_list (dest_listT t) |> cert)) vars | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 281 | val th' = instantiate ([], cvs) th | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 282 | val t' = (fst o HOLogic.dest_eq o HOLogic.dest_Trueprop o prop_of) th' | 
| 23643 
32ee4111d1bc
Corrected erronus use of compiletime context to the runtime context
 chaieb parents: 
23624diff
changeset | 283 | val th'' = Goal.prove ctxt [] [] (HOLogic.mk_Trueprop (HOLogic.mk_eq (t, t'))) | 
| 24044 | 284 | (fn _ => simp_tac (local_simpset_of ctxt) 1) | 
| 20564 
6857bd9f1a79
Reifiaction now deals with Interpretations with an arbtrary number of parameters. It deals with binding. The Atomic cases can be I ... = f (xs!n)
 chaieb parents: 
20374diff
changeset | 285 | val _ = bds := [] | 
| 23624 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 286 | in FWD trans [th'',th'] | 
| 
82091387f6d7
The order for parameter for interpretation is now inversted:
 chaieb parents: 
23605diff
changeset | 287 | end | 
| 20319 | 288 | |
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 289 | |
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 290 | fun genreflect ctxt conv corr_thms raw_eqs t = | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 291 | let | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 292 | val reifth = genreif ctxt raw_eqs t | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 293 | fun trytrans [] = error "No suitable correctness theorem found" | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 294 | | trytrans (th::ths) = | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 295 | (FWD trans [reifth, th RS sym] handle THM _ => trytrans ths) | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 296 | val th = trytrans corr_thms | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 297 | val ft = (Thm.dest_arg1 o Thm.dest_arg o Thm.dest_arg o cprop_of) th | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 298 | val rth = conv ft | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 299 | in simplify (HOL_basic_ss addsimps raw_eqs addsimps [nth_Cons_0, nth_Cons_Suc]) | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 300 | (simplify (HOL_basic_ss addsimps [rth]) th) | 
| 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 301 | end | 
| 20319 | 302 | |
| 303 | fun genreify_tac ctxt eqs to i = (fn st => | |
| 304 | let | |
| 29805 | 305 | fun P () = HOLogic.dest_Trueprop (List.nth (prems_of st, i - 1)) | 
| 306 | val t = (case to of NONE => P () | SOME x => x) | |
| 20319 | 307 | val th = (genreif ctxt eqs t) RS ssubst | 
| 308 | in rtac th i st | |
| 309 | end); | |
| 310 | ||
| 311 | (* Reflection calls reification and uses the correctness *) | |
| 312 | (* theorem assumed to be the dead of the list *) | |
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 313 | fun gen_reflection_tac ctxt conv corr_thms raw_eqs to i = (fn st => | 
| 21878 | 314 | let | 
| 315 | val P = HOLogic.dest_Trueprop (nth (prems_of st) (i - 1)); | |
| 316 | val t = the_default P to; | |
| 23648 
bccbf6138c30
Try several correctness theorems for reflection; rearrange cong rules to avoid the absoption cases;
 chaieb parents: 
23643diff
changeset | 317 | val th = genreflect ctxt conv corr_thms raw_eqs t | 
| 21878 | 318 | RS ssubst; | 
| 23791 | 319 | in (rtac th i THEN TRY(rtac TrueI i)) st end); | 
| 21878 | 320 | |
| 23791 | 321 | fun reflection_tac ctxt = gen_reflection_tac ctxt Codegen.evaluation_conv; | 
| 29650 | 322 | |
| 20797 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 wenzelm parents: 
20595diff
changeset | 323 | end |