| author | wenzelm | 
| Sat, 27 Aug 2011 16:11:24 +0200 | |
| changeset 44547 | 5a35790413f5 | 
| parent 42364 | 8c674b3b8e44 | 
| child 46531 | eff798e48efc | 
| permissions | -rw-r--r-- | 
| 41959 | 1 | (* Title: HOL/Matrix/Compute_Oracle/compute.ML | 
| 23174 | 2 | Author: Steven Obua | 
| 3 | *) | |
| 4 | ||
| 5 | signature COMPUTE = sig | |
| 6 | ||
| 7 | type computer | |
| 25217 | 8 | type theorem | 
| 9 | type naming = int -> string | |
| 23174 | 10 | |
| 23663 | 11 | datatype machine = BARRAS | BARRAS_COMPILED | HASKELL | SML | 
| 23174 | 12 | |
| 25217 | 13 | (* Functions designated with a ! in front of them actually update the computer parameter *) | 
| 14 | ||
| 23663 | 15 | exception Make of string | 
| 16 | val make : machine -> theory -> thm list -> computer | |
| 25520 | 17 | val make_with_cache : machine -> theory -> term list -> thm list -> computer | 
| 23174 | 18 | val theory_of : computer -> theory | 
| 23663 | 19 | val hyps_of : computer -> term list | 
| 20 | val shyps_of : computer -> sort list | |
| 25217 | 21 | (* ! *) val update : computer -> thm list -> unit | 
| 25520 | 22 | (* ! *) val update_with_cache : computer -> term list -> thm list -> unit | 
| 25217 | 23 | (* ! *) val discard : computer -> unit | 
| 24 | ||
| 25 | (* ! *) val set_naming : computer -> naming -> unit | |
| 26 | val naming_of : computer -> naming | |
| 27 | ||
| 28 | exception Compute of string | |
| 29 | val simplify : computer -> theorem -> thm | |
| 30 | val rewrite : computer -> cterm -> thm | |
| 23663 | 31 | |
| 25217 | 32 | val make_theorem : computer -> thm -> string list -> theorem | 
| 33 | (* ! *) val instantiate : computer -> (string * cterm) list -> theorem -> theorem | |
| 34 | (* ! *) val evaluate_prem : computer -> int -> theorem -> theorem | |
| 35 | (* ! *) val modus_ponens : computer -> int -> thm -> theorem -> theorem | |
| 23663 | 36 | |
| 23174 | 37 | end | 
| 38 | ||
| 23663 | 39 | structure Compute :> COMPUTE = struct | 
| 40 | ||
| 25217 | 41 | open Report; | 
| 24654 | 42 | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 43 | datatype machine = BARRAS | BARRAS_COMPILED | HASKELL | SML | 
| 23663 | 44 | |
| 45 | (* Terms are mapped to integer codes *) | |
| 46 | structure Encode :> | |
| 47 | sig | |
| 48 | type encoding | |
| 49 | val empty : encoding | |
| 50 | val insert : term -> encoding -> int * encoding | |
| 51 | val lookup_code : term -> encoding -> int option | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 52 | val lookup_term : int -> encoding -> term option | 
| 23663 | 53 | val remove_code : int -> encoding -> encoding | 
| 54 | val remove_term : term -> encoding -> encoding | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 55 | val fold : ((term * int) -> 'a -> 'a) -> encoding -> 'a -> 'a | 
| 23663 | 56 | end | 
| 57 | = | |
| 58 | struct | |
| 59 | ||
| 60 | type encoding = int * (int Termtab.table) * (term Inttab.table) | |
| 61 | ||
| 62 | val empty = (0, Termtab.empty, Inttab.empty) | |
| 63 | ||
| 64 | fun insert t (e as (count, term2int, int2term)) = | |
| 65 | (case Termtab.lookup term2int t of | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 66 | NONE => (count, (count+1, Termtab.update_new (t, count) term2int, Inttab.update_new (count, t) int2term)) | 
| 23663 | 67 | | SOME code => (code, e)) | 
| 68 | ||
| 69 | fun lookup_code t (_, term2int, _) = Termtab.lookup term2int t | |
| 70 | ||
| 71 | fun lookup_term c (_, _, int2term) = Inttab.lookup int2term c | |
| 72 | ||
| 73 | fun remove_code c (e as (count, term2int, int2term)) = | |
| 74 | (case lookup_term c e of NONE => e | SOME t => (count, Termtab.delete t term2int, Inttab.delete c int2term)) | |
| 75 | ||
| 76 | fun remove_term t (e as (count, term2int, int2term)) = | |
| 77 | (case lookup_code t e of NONE => e | SOME c => (count, Termtab.delete t term2int, Inttab.delete c int2term)) | |
| 78 | ||
| 25520 | 79 | fun fold f (_, term2int, _) = Termtab.fold f term2int | 
| 23663 | 80 | |
| 81 | end | |
| 82 | ||
| 23174 | 83 | exception Make of string; | 
| 23663 | 84 | exception Compute of string; | 
| 23174 | 85 | |
| 23663 | 86 | local | 
| 87 | fun make_constant t ty encoding = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 88 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 89 | val (code, encoding) = Encode.insert t encoding | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 90 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 91 | (encoding, AbstractMachine.Const code) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 92 | end | 
| 23663 | 93 | in | 
| 23174 | 94 | |
| 23663 | 95 | fun remove_types encoding t = | 
| 96 | case t of | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 97 | Var (_, ty) => make_constant t ty encoding | 
| 23663 | 98 | | Free (_, ty) => make_constant t ty encoding | 
| 99 | | Const (_, ty) => make_constant t ty encoding | |
| 100 | | Abs (_, ty, t') => | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 101 | let val (encoding, t'') = remove_types encoding t' in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 102 | (encoding, AbstractMachine.Abs t'') | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 103 | end | 
| 23663 | 104 | | a $ b => | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 105 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 106 | val (encoding, a) = remove_types encoding a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 107 | val (encoding, b) = remove_types encoding b | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 108 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 109 | (encoding, AbstractMachine.App (a,b)) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 110 | end | 
| 23663 | 111 | | Bound b => (encoding, AbstractMachine.Var b) | 
| 112 | end | |
| 113 | ||
| 114 | local | |
| 115 | fun type_of (Free (_, ty)) = ty | |
| 116 | | type_of (Const (_, ty)) = ty | |
| 117 | | type_of (Var (_, ty)) = ty | |
| 40314 
b5ec88d9ac03
replaced ancient sys_error by raise Fail, assuming that the latter is not handled specifically by the environment;
 wenzelm parents: 
38808diff
changeset | 118 | | type_of _ = raise Fail "infer_types: type_of error" | 
| 23663 | 119 | in | 
| 120 | fun infer_types naming encoding = | |
| 23174 | 121 | let | 
| 42364 | 122 | fun infer_types _ bounds _ (AbstractMachine.Var v) = (Bound v, nth bounds v) | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 123 | | infer_types _ bounds _ (AbstractMachine.Const code) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 124 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 125 | val c = the (Encode.lookup_term code encoding) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 126 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 127 | (c, type_of c) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 128 | end | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 129 | | infer_types level bounds _ (AbstractMachine.App (a, b)) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 130 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 131 | val (a, aty) = infer_types level bounds NONE a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 132 | val (adom, arange) = | 
| 23174 | 133 | case aty of | 
| 134 |                         Type ("fun", [dom, range]) => (dom, range)
 | |
| 40314 
b5ec88d9ac03
replaced ancient sys_error by raise Fail, assuming that the latter is not handled specifically by the environment;
 wenzelm parents: 
38808diff
changeset | 135 | | _ => raise Fail "infer_types: function type expected" | 
| 23663 | 136 | val (b, bty) = infer_types level bounds (SOME adom) b | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 137 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 138 | (a $ b, arange) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 139 | end | 
| 23663 | 140 |           | infer_types level bounds (SOME (ty as Type ("fun", [dom, range]))) (AbstractMachine.Abs m) =
 | 
| 23174 | 141 | let | 
| 23663 | 142 | val (m, _) = infer_types (level+1) (dom::bounds) (SOME range) m | 
| 23174 | 143 | in | 
| 23663 | 144 | (Abs (naming level, dom, m), ty) | 
| 23174 | 145 | end | 
| 40314 
b5ec88d9ac03
replaced ancient sys_error by raise Fail, assuming that the latter is not handled specifically by the environment;
 wenzelm parents: 
38808diff
changeset | 146 | | infer_types _ _ NONE (AbstractMachine.Abs m) = | 
| 
b5ec88d9ac03
replaced ancient sys_error by raise Fail, assuming that the latter is not handled specifically by the environment;
 wenzelm parents: 
38808diff
changeset | 147 | raise Fail "infer_types: cannot infer type of abstraction" | 
| 23174 | 148 | |
| 23663 | 149 | fun infer ty term = | 
| 23174 | 150 | let | 
| 23663 | 151 | val (term', _) = infer_types 0 [] (SOME ty) term | 
| 23174 | 152 | in | 
| 153 | term' | |
| 154 | end | |
| 155 | in | |
| 156 | infer | |
| 157 | end | |
| 23663 | 158 | end | 
| 23174 | 159 | |
| 23663 | 160 | datatype prog = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 161 | ProgBarras of AM_Interpreter.program | 
| 23663 | 162 | | ProgBarrasC of AM_Compiler.program | 
| 163 | | ProgHaskell of AM_GHC.program | |
| 164 | | ProgSML of AM_SML.program | |
| 23174 | 165 | |
| 25217 | 166 | fun machine_of_prog (ProgBarras _) = BARRAS | 
| 167 | | machine_of_prog (ProgBarrasC _) = BARRAS_COMPILED | |
| 168 | | machine_of_prog (ProgHaskell _) = HASKELL | |
| 169 | | machine_of_prog (ProgSML _) = SML | |
| 170 | ||
| 171 | type naming = int -> string | |
| 172 | ||
| 41491 | 173 | fun default_naming i = "v_" ^ string_of_int i | 
| 25217 | 174 | |
| 32740 | 175 | datatype computer = Computer of | 
| 176 | (theory_ref * Encode.encoding * term list * unit Sorttab.table * prog * unit Unsynchronized.ref * naming) | |
| 177 | option Unsynchronized.ref | |
| 25217 | 178 | |
| 32740 | 179 | fun theory_of (Computer (Unsynchronized.ref (SOME (rthy,_,_,_,_,_,_)))) = Theory.deref rthy | 
| 180 | fun hyps_of (Computer (Unsynchronized.ref (SOME (_,_,hyps,_,_,_,_)))) = hyps | |
| 181 | fun shyps_of (Computer (Unsynchronized.ref (SOME (_,_,_,shyptable,_,_,_)))) = Sorttab.keys (shyptable) | |
| 182 | fun shyptab_of (Computer (Unsynchronized.ref (SOME (_,_,_,shyptable,_,_,_)))) = shyptable | |
| 183 | fun stamp_of (Computer (Unsynchronized.ref (SOME (_,_,_,_,_,stamp,_)))) = stamp | |
| 184 | fun prog_of (Computer (Unsynchronized.ref (SOME (_,_,_,_,prog,_,_)))) = prog | |
| 185 | fun encoding_of (Computer (Unsynchronized.ref (SOME (_,encoding,_,_,_,_,_)))) = encoding | |
| 186 | fun set_encoding (Computer (r as Unsynchronized.ref (SOME (p1,encoding,p2,p3,p4,p5,p6)))) encoding' = | |
| 25217 | 187 | (r := SOME (p1,encoding',p2,p3,p4,p5,p6)) | 
| 32740 | 188 | fun naming_of (Computer (Unsynchronized.ref (SOME (_,_,_,_,_,_,n)))) = n | 
| 189 | fun set_naming (Computer (r as Unsynchronized.ref (SOME (p1,p2,p3,p4,p5,p6,naming)))) naming'= | |
| 25217 | 190 | (r := SOME (p1,p2,p3,p4,p5,p6,naming')) | 
| 191 | ||
| 192 | fun ref_of (Computer r) = r | |
| 23663 | 193 | |
| 194 | datatype cthm = ComputeThm of term list * sort list * term | |
| 195 | ||
| 196 | fun thm2cthm th = | |
| 23174 | 197 | let | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 198 |         val {hyps, prop, tpairs, shyps, ...} = Thm.rep_thm th
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 199 | val _ = if not (null tpairs) then raise Make "theorems may not contain tpairs" else () | 
| 23663 | 200 | in | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 201 | ComputeThm (hyps, shyps, prop) | 
| 23663 | 202 | end | 
| 23174 | 203 | |
| 25520 | 204 | fun make_internal machine thy stamp encoding cache_pattern_terms raw_ths = | 
| 23663 | 205 | let | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 206 | fun transfer (x:thm) = Thm.transfer thy x | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 207 | val ths = map (thm2cthm o Thm.strip_shyps o transfer) raw_ths | 
| 23174 | 208 | |
| 25520 | 209 | fun make_pattern encoding n vars (var as AbstractMachine.Abs _) = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 210 | raise (Make "no lambda abstractions allowed in pattern") | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 211 | | make_pattern encoding n vars (var as AbstractMachine.Var _) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 212 | raise (Make "no bound variables allowed in pattern") | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 213 | | make_pattern encoding n vars (AbstractMachine.Const code) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 214 | (case the (Encode.lookup_term code encoding) of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 215 | Var _ => ((n+1, Inttab.update_new (code, n) vars, AbstractMachine.PVar) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 216 | handle Inttab.DUP _ => raise (Make "no duplicate variable in pattern allowed")) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 217 | | _ => (n, vars, AbstractMachine.PConst (code, []))) | 
| 25520 | 218 | | make_pattern encoding n vars (AbstractMachine.App (a, b)) = | 
| 219 | let | |
| 220 | val (n, vars, pa) = make_pattern encoding n vars a | |
| 221 | val (n, vars, pb) = make_pattern encoding n vars b | |
| 222 | in | |
| 223 | case pa of | |
| 224 | AbstractMachine.PVar => | |
| 225 | raise (Make "patterns may not start with a variable") | |
| 226 | | AbstractMachine.PConst (c, args) => | |
| 227 | (n, vars, AbstractMachine.PConst (c, args@[pb])) | |
| 228 | end | |
| 229 | ||
| 23663 | 230 | fun thm2rule (encoding, hyptable, shyptable) th = | 
| 231 | let | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 232 | val (ComputeThm (hyps, shyps, prop)) = th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 233 | val hyptable = fold (fn h => Termtab.update (h, ())) hyps hyptable | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 234 | val shyptable = fold (fn sh => Sorttab.update (sh, ())) shyps shyptable | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 235 | val (prems, prop) = (Logic.strip_imp_prems prop, Logic.strip_imp_concl prop) | 
| 23663 | 236 | val (a, b) = Logic.dest_equals prop | 
| 237 | handle TERM _ => raise (Make "theorems must be meta-level equations (with optional guards)") | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 238 | val a = Envir.eta_contract a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 239 | val b = Envir.eta_contract b | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 240 | val prems = map Envir.eta_contract prems | 
| 23174 | 241 | |
| 23663 | 242 | val (encoding, left) = remove_types encoding a | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 243 | val (encoding, right) = remove_types encoding b | 
| 23663 | 244 | fun remove_types_of_guard encoding g = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 245 | (let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 246 | val (t1, t2) = Logic.dest_equals g | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 247 | val (encoding, t1) = remove_types encoding t1 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 248 | val (encoding, t2) = remove_types encoding t2 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 249 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 250 | (encoding, AbstractMachine.Guard (t1, t2)) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 251 | end handle TERM _ => raise (Make "guards must be meta-level equations")) | 
| 23663 | 252 | val (encoding, prems) = fold_rev (fn p => fn (encoding, ps) => let val (e, p) = remove_types_of_guard encoding p in (e, p::ps) end) prems (encoding, []) | 
| 23174 | 253 | |
| 23663 | 254 | (* Principally, a check should be made here to see if the (meta-) hyps contain any of the variables of the rule. | 
| 255 | As it is, all variables of the rule are schematic, and there are no schematic variables in meta-hyps, therefore | |
| 256 | this check can be left out. *) | |
| 257 | ||
| 258 | val (vcount, vars, pattern) = make_pattern encoding 0 Inttab.empty left | |
| 23174 | 259 | val _ = (case pattern of | 
| 23663 | 260 | AbstractMachine.PVar => | 
| 23174 | 261 | raise (Make "patterns may not start with a variable") | 
| 23663 | 262 | (* | AbstractMachine.PConst (_, []) => | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 263 | (print th; raise (Make "no parameter rewrite found"))*) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 264 | | _ => ()) | 
| 23174 | 265 | |
| 266 | (* finally, provide a function for renaming the | |
| 23663 | 267 | pattern bound variables on the right hand side *) | 
| 23174 | 268 | |
| 23663 | 269 | fun rename level vars (var as AbstractMachine.Var _) = var | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 270 | | rename level vars (c as AbstractMachine.Const code) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 271 | (case Inttab.lookup vars code of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 272 | NONE => c | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 273 | | SOME n => AbstractMachine.Var (vcount-n-1+level)) | 
| 23663 | 274 | | rename level vars (AbstractMachine.App (a, b)) = | 
| 275 | AbstractMachine.App (rename level vars a, rename level vars b) | |
| 276 | | rename level vars (AbstractMachine.Abs m) = | |
| 277 | AbstractMachine.Abs (rename (level+1) vars m) | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 278 | |
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 279 | fun rename_guard (AbstractMachine.Guard (a,b)) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 280 | AbstractMachine.Guard (rename 0 vars a, rename 0 vars b) | 
| 23174 | 281 | in | 
| 23663 | 282 | ((encoding, hyptable, shyptable), (map rename_guard prems, pattern, rename 0 vars right)) | 
| 23174 | 283 | end | 
| 284 | ||
| 23663 | 285 | val ((encoding, hyptable, shyptable), rules) = | 
| 286 | fold_rev (fn th => fn (encoding_hyptable, rules) => | |
| 23174 | 287 | let | 
| 23663 | 288 | val (encoding_hyptable, rule) = thm2rule encoding_hyptable th | 
| 289 | in (encoding_hyptable, rule::rules) end) | |
| 25217 | 290 | ths ((encoding, Termtab.empty, Sorttab.empty), []) | 
| 23174 | 291 | |
| 25520 | 292 | fun make_cache_pattern t (encoding, cache_patterns) = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 293 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 294 | val (encoding, a) = remove_types encoding t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 295 | val (_,_,p) = make_pattern encoding 0 Inttab.empty a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 296 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 297 | (encoding, p::cache_patterns) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 298 | end | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 299 | |
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 300 | val (encoding, cache_patterns) = fold_rev make_cache_pattern cache_pattern_terms (encoding, []) | 
| 25520 | 301 | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 302 |         fun arity (Type ("fun", [a,b])) = 1 + arity b
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 303 | | arity _ = 0 | 
| 25520 | 304 | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 305 | fun make_arity (Const (s, _), i) tab = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 306 | (Inttab.update (i, arity (Sign.the_const_type thy s)) tab handle TYPE _ => tab) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 307 | | make_arity _ tab = tab | 
| 25520 | 308 | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 309 | val const_arity_tab = Encode.fold make_arity encoding Inttab.empty | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 310 | fun const_arity x = Inttab.lookup const_arity_tab x | 
| 25520 | 311 | |
| 23663 | 312 | val prog = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 313 | case machine of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 314 | BARRAS => ProgBarras (AM_Interpreter.compile cache_patterns const_arity rules) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 315 | | BARRAS_COMPILED => ProgBarrasC (AM_Compiler.compile cache_patterns const_arity rules) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 316 | | HASKELL => ProgHaskell (AM_GHC.compile cache_patterns const_arity rules) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 317 | | SML => ProgSML (AM_SML.compile cache_patterns const_arity rules) | 
| 23174 | 318 | |
| 23663 | 319 | fun has_witness s = not (null (Sign.witness_sorts thy [] [s])) | 
| 23174 | 320 | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 321 | val shyptable = fold Sorttab.delete (filter has_witness (Sorttab.keys (shyptable))) shyptable | 
| 23663 | 322 | |
| 25217 | 323 | in (Theory.check_thy thy, encoding, Termtab.keys hyptable, shyptable, prog, stamp, default_naming) end | 
| 324 | ||
| 32740 | 325 | fun make_with_cache machine thy cache_patterns raw_thms = | 
| 326 | Computer (Unsynchronized.ref (SOME (make_internal machine thy (Unsynchronized.ref ()) Encode.empty cache_patterns raw_thms))) | |
| 23663 | 327 | |
| 25520 | 328 | fun make machine thy raw_thms = make_with_cache machine thy [] raw_thms | 
| 329 | ||
| 330 | fun update_with_cache computer cache_patterns raw_thms = | |
| 25217 | 331 | let | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 332 | val c = make_internal (machine_of_prog (prog_of computer)) (theory_of computer) (stamp_of computer) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 333 | (encoding_of computer) cache_patterns raw_thms | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 334 | val _ = (ref_of computer) := SOME c | 
| 25217 | 335 | in | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 336 | () | 
| 25217 | 337 | end | 
| 338 | ||
| 25520 | 339 | fun update computer raw_thms = update_with_cache computer [] raw_thms | 
| 340 | ||
| 25217 | 341 | fun discard computer = | 
| 23174 | 342 | let | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 343 | val _ = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 344 | case prog_of computer of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 345 | ProgBarras p => AM_Interpreter.discard p | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 346 | | ProgBarrasC p => AM_Compiler.discard p | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 347 | | ProgHaskell p => AM_GHC.discard p | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 348 | | ProgSML p => AM_SML.discard p | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 349 | val _ = (ref_of computer) := NONE | 
| 23174 | 350 | in | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 351 | () | 
| 25217 | 352 | end | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 353 | |
| 25217 | 354 | fun runprog (ProgBarras p) = AM_Interpreter.run p | 
| 355 | | runprog (ProgBarrasC p) = AM_Compiler.run p | |
| 356 | | runprog (ProgHaskell p) = AM_GHC.run p | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 357 | | runprog (ProgSML p) = AM_SML.run p | 
| 25217 | 358 | |
| 359 | (* ------------------------------------------------------------------------------------- *) | |
| 360 | (* An oracle for exporting theorems; must only be accessible from inside this structure! *) | |
| 361 | (* ------------------------------------------------------------------------------------- *) | |
| 362 | ||
| 363 | fun merge_hyps hyps1 hyps2 = | |
| 364 | let | |
| 365 | fun add hyps tab = fold (fn h => fn tab => Termtab.update (h, ()) tab) hyps tab | |
| 366 | in | |
| 367 | Termtab.keys (add hyps2 (add hyps1 Termtab.empty)) | |
| 368 | end | |
| 369 | ||
| 370 | fun add_shyps shyps tab = fold (fn h => fn tab => Sorttab.update (h, ()) tab) shyps tab | |
| 371 | ||
| 372 | fun merge_shyps shyps1 shyps2 = Sorttab.keys (add_shyps shyps2 (add_shyps shyps1 Sorttab.empty)) | |
| 373 | ||
| 28290 | 374 | val (_, export_oracle) = Context.>>> (Context.map_theory_result | 
| 38808 | 375 |   (Thm.add_oracle (@{binding compute}, fn (thy, hyps, shyps, prop) =>
 | 
| 25217 | 376 | let | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 377 | val shyptab = add_shyps shyps Sorttab.empty | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 378 | fun delete s shyptab = Sorttab.delete s shyptab handle Sorttab.UNDEF _ => shyptab | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 379 | fun delete_term t shyptab = fold delete (Sorts.insert_term t []) shyptab | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 380 | fun has_witness s = not (null (Sign.witness_sorts thy [] [s])) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 381 | val shyptab = fold Sorttab.delete (filter has_witness (Sorttab.keys (shyptab))) shyptab | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 382 | val shyps = if Sorttab.is_empty shyptab then [] else Sorttab.keys (fold delete_term (prop::hyps) shyptab) | 
| 31322 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 383 | val _ = | 
| 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 384 | if not (null shyps) then | 
| 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 385 |             raise Compute ("dangling sort hypotheses: " ^
 | 
| 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 386 | commas (map (Syntax.string_of_sort_global thy) shyps)) | 
| 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 387 | else () | 
| 25217 | 388 | in | 
| 28290 | 389 | Thm.cterm_of thy (fold_rev (fn hyp => fn p => Logic.mk_implies (hyp, p)) hyps prop) | 
| 390 | end))); | |
| 25217 | 391 | |
| 392 | fun export_thm thy hyps shyps prop = | |
| 393 | let | |
| 28290 | 394 | val th = export_oracle (thy, hyps, shyps, prop) | 
| 36945 | 395 | val hyps = map (fn h => Thm.assume (cterm_of thy h)) hyps | 
| 25217 | 396 | in | 
| 36945 | 397 | fold (fn h => fn p => Thm.implies_elim p h) hyps th | 
| 25217 | 398 | end | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 399 | |
| 25217 | 400 | (* --------- Rewrite ----------- *) | 
| 401 | ||
| 402 | fun rewrite computer ct = | |
| 403 | let | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 404 | val thy = Thm.theory_of_cterm ct | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 405 |         val {t=t',T=ty,...} = rep_cterm ct
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 406 | val _ = Theory.assert_super (theory_of computer) thy | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 407 | val naming = naming_of computer | 
| 25217 | 408 | val (encoding, t) = remove_types (encoding_of computer) t' | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 409 |         (*val _ = if (!print_encoding) then writeln (makestring ("encoding: ",Encode.fold (fn x => fn s => x::s) encoding [])) else ()*)
 | 
| 25217 | 410 | val t = runprog (prog_of computer) t | 
| 411 | val t = infer_types naming encoding ty t | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 412 | val eq = Logic.mk_equals (t', t) | 
| 25217 | 413 | in | 
| 414 | export_thm thy (hyps_of computer) (Sorttab.keys (shyptab_of computer)) eq | |
| 415 | end | |
| 416 | ||
| 417 | (* --------- Simplify ------------ *) | |
| 23663 | 418 | |
| 25217 | 419 | datatype prem = EqPrem of AbstractMachine.term * AbstractMachine.term * Term.typ * int | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 420 | | Prem of AbstractMachine.term | 
| 32740 | 421 | datatype theorem = Theorem of theory_ref * unit Unsynchronized.ref * (int * typ) Symtab.table * (AbstractMachine.term option) Inttab.table | 
| 25217 | 422 | * prem list * AbstractMachine.term * term list * sort list | 
| 423 | ||
| 424 | ||
| 425 | exception ParamSimplify of computer * theorem | |
| 426 | ||
| 427 | fun make_theorem computer th vars = | |
| 428 | let | |
| 429 | val _ = Theory.assert_super (theory_of computer) (theory_of_thm th) | |
| 430 | ||
| 431 | val (ComputeThm (hyps, shyps, prop)) = thm2cthm th | |
| 432 | ||
| 433 | val encoding = encoding_of computer | |
| 434 | ||
| 435 | (* variables in the theorem are identified upfront *) | |
| 436 | fun collect_vars (Abs (_, _, t)) tab = collect_vars t tab | |
| 437 | | collect_vars (a $ b) tab = collect_vars b (collect_vars a tab) | |
| 438 | | collect_vars (Const _) tab = tab | |
| 439 | | collect_vars (Free _) tab = tab | |
| 440 | | collect_vars (Var ((s, i), ty)) tab = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 441 | if List.find (fn x => x=s) vars = NONE then | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 442 | tab | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 443 | else | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 444 | (case Symtab.lookup tab s of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 445 | SOME ((s',i'),ty') => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 446 | if s' <> s orelse i' <> i orelse ty <> ty' then | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 447 |                          raise Compute ("make_theorem: variable name '"^s^"' is not unique")
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 448 | else | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 449 | tab | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 450 | | NONE => Symtab.update (s, ((s, i), ty)) tab) | 
| 25217 | 451 | val vartab = collect_vars prop Symtab.empty | 
| 452 | fun encodevar (s, t as (_, ty)) (encoding, tab) = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 453 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 454 | val (x, encoding) = Encode.insert (Var t) encoding | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 455 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 456 | (encoding, Symtab.update (s, (x, ty)) tab) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 457 | end | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 458 | val (encoding, vartab) = Symtab.fold encodevar vartab (encoding, Symtab.empty) | 
| 25217 | 459 | val varsubst = Inttab.make (map (fn (s, (x, _)) => (x, NONE)) (Symtab.dest vartab)) | 
| 23174 | 460 | |
| 25217 | 461 | (* make the premises and the conclusion *) | 
| 462 | fun mk_prem encoding t = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 463 | (let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 464 | val (a, b) = Logic.dest_equals t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 465 | val ty = type_of a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 466 | val (encoding, a) = remove_types encoding a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 467 | val (encoding, b) = remove_types encoding b | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 468 |              val (eq, encoding) = Encode.insert (Const ("==", ty --> ty --> @{typ "prop"})) encoding 
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 469 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 470 | (encoding, EqPrem (a, b, ty, eq)) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 471 | end handle TERM _ => let val (encoding, t) = remove_types encoding t in (encoding, Prem t) end) | 
| 25217 | 472 | val (encoding, prems) = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 473 | (fold_rev (fn t => fn (encoding, l) => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 474 | case mk_prem encoding t of | 
| 25217 | 475 | (encoding, t) => (encoding, t::l)) (Logic.strip_imp_prems prop) (encoding, [])) | 
| 476 | val (encoding, concl) = remove_types encoding (Logic.strip_imp_concl prop) | |
| 477 | val _ = set_encoding computer encoding | |
| 478 | in | |
| 479 | Theorem (Theory.check_thy (theory_of_thm th), stamp_of computer, vartab, varsubst, | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 480 | prems, concl, hyps, shyps) | 
| 25217 | 481 | end | 
| 482 | ||
| 483 | fun theory_of_theorem (Theorem (rthy,_,_,_,_,_,_,_)) = Theory.deref rthy | |
| 484 | fun update_theory thy (Theorem (_,p0,p1,p2,p3,p4,p5,p6)) = | |
| 485 | Theorem (Theory.check_thy thy,p0,p1,p2,p3,p4,p5,p6) | |
| 486 | fun stamp_of_theorem (Theorem (_,s, _, _, _, _, _, _)) = s | |
| 487 | fun vartab_of_theorem (Theorem (_,_,vt,_,_,_,_,_)) = vt | |
| 488 | fun varsubst_of_theorem (Theorem (_,_,_,vs,_,_,_,_)) = vs | |
| 489 | fun update_varsubst vs (Theorem (p0,p1,p2,_,p3,p4,p5,p6)) = Theorem (p0,p1,p2,vs,p3,p4,p5,p6) | |
| 490 | fun prems_of_theorem (Theorem (_,_,_,_,prems,_,_,_)) = prems | |
| 491 | fun update_prems prems (Theorem (p0,p1,p2,p3,_,p4,p5,p6)) = Theorem (p0,p1,p2,p3,prems,p4,p5,p6) | |
| 492 | fun concl_of_theorem (Theorem (_,_,_,_,_,concl,_,_)) = concl | |
| 493 | fun hyps_of_theorem (Theorem (_,_,_,_,_,_,hyps,_)) = hyps | |
| 494 | fun update_hyps hyps (Theorem (p0,p1,p2,p3,p4,p5,_,p6)) = Theorem (p0,p1,p2,p3,p4,p5,hyps,p6) | |
| 495 | fun shyps_of_theorem (Theorem (_,_,_,_,_,_,_,shyps)) = shyps | |
| 496 | fun update_shyps shyps (Theorem (p0,p1,p2,p3,p4,p5,p6,_)) = Theorem (p0,p1,p2,p3,p4,p5,p6,shyps) | |
| 497 | ||
| 498 | fun check_compatible computer th s = | |
| 499 | if stamp_of computer <> stamp_of_theorem th then | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 500 | raise Compute (s^": computer and theorem are incompatible") | 
| 25217 | 501 | else () | 
| 502 | ||
| 503 | fun instantiate computer insts th = | |
| 504 | let | |
| 505 | val _ = check_compatible computer th | |
| 506 | ||
| 507 | val thy = theory_of computer | |
| 508 | ||
| 509 | val vartab = vartab_of_theorem th | |
| 510 | ||
| 511 | fun rewrite computer t = | |
| 512 | let | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 513 | val naming = naming_of computer | 
| 25217 | 514 | val (encoding, t) = remove_types (encoding_of computer) t | 
| 515 | val t = runprog (prog_of computer) t | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 516 | val _ = set_encoding computer encoding | 
| 23174 | 517 | in | 
| 518 | t | |
| 519 | end | |
| 520 | ||
| 25217 | 521 | fun assert_varfree vs t = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 522 | if AbstractMachine.forall_consts (fn x => Inttab.lookup vs x = NONE) t then | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 523 | () | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 524 | else | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 525 | raise Compute "instantiate: assert_varfree failed" | 
| 25217 | 526 | |
| 527 | fun assert_closed t = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 528 | if AbstractMachine.closed t then | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 529 | () | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 530 | else | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 531 | raise Compute "instantiate: not a closed term" | 
| 23663 | 532 | |
| 25217 | 533 | fun compute_inst (s, ct) vs = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 534 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 535 | val _ = Theory.assert_super (theory_of_cterm ct) thy | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 536 | val ty = typ_of (ctyp_of_term ct) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 537 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 538 | (case Symtab.lookup vartab s of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 539 |                  NONE => raise Compute ("instantiate: variable '"^s^"' not found in theorem")
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 540 | | SOME (x, ty') => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 541 | (case Inttab.lookup vs x of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 542 |                       SOME (SOME _) => raise Compute ("instantiate: variable '"^s^"' has already been instantiated")
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 543 | | SOME NONE => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 544 | if ty <> ty' then | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 545 |                           raise Compute ("instantiate: wrong type for variable '"^s^"'")
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 546 | else | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 547 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 548 | val t = rewrite computer (term_of ct) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 549 | val _ = assert_varfree vs t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 550 | val _ = assert_closed t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 551 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 552 | Inttab.update (x, SOME t) vs | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 553 | end | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 554 | | NONE => raise Compute "instantiate: internal error")) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 555 | end | 
| 23174 | 556 | |
| 25217 | 557 | val vs = fold compute_inst insts (varsubst_of_theorem th) | 
| 558 | in | |
| 559 | update_varsubst vs th | |
| 560 | end | |
| 23174 | 561 | |
| 25217 | 562 | fun match_aterms subst = | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 563 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 564 | exception no_match | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 565 | open AbstractMachine | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 566 | fun match subst (b as (Const c)) a = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 567 | if a = b then subst | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 568 | else | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 569 | (case Inttab.lookup subst c of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 570 | SOME (SOME a') => if a=a' then subst else raise no_match | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 571 | | SOME NONE => if AbstractMachine.closed a then | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 572 | Inttab.update (c, SOME a) subst | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 573 | else raise no_match | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 574 | | NONE => raise no_match) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 575 | | match subst (b as (Var _)) a = if a=b then subst else raise no_match | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 576 | | match subst (App (u, v)) (App (u', v')) = match (match subst u u') v v' | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 577 | | match subst (Abs u) (Abs u') = match subst u u' | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 578 | | match subst _ _ = raise no_match | 
| 23663 | 579 | in | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 580 | fn b => fn a => (SOME (match subst b a) handle no_match => NONE) | 
| 25217 | 581 | end | 
| 582 | ||
| 583 | fun apply_subst vars_allowed subst = | |
| 584 | let | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 585 | open AbstractMachine | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 586 | fun app (t as (Const c)) = | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 587 | (case Inttab.lookup subst c of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 588 | NONE => t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 589 | | SOME (SOME t) => Computed t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 590 | | SOME NONE => if vars_allowed then t else raise Compute "apply_subst: no vars allowed") | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 591 | | app (t as (Var _)) = t | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 592 | | app (App (u, v)) = App (app u, app v) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 593 | | app (Abs m) = Abs (app m) | 
| 25217 | 594 | in | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 595 | app | 
| 23663 | 596 | end | 
| 597 | ||
| 25217 | 598 | fun splicein n l L = List.take (L, n) @ l @ List.drop (L, n+1) | 
| 23663 | 599 | |
| 25217 | 600 | fun evaluate_prem computer prem_no th = | 
| 601 | let | |
| 602 | val _ = check_compatible computer th | |
| 603 | val prems = prems_of_theorem th | |
| 604 | val varsubst = varsubst_of_theorem th | |
| 605 | fun run vars_allowed t = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 606 | runprog (prog_of computer) (apply_subst vars_allowed varsubst t) | 
| 25217 | 607 | in | 
| 42364 | 608 | case nth prems prem_no of | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 609 | Prem _ => raise Compute "evaluate_prem: no equality premise" | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 610 | | EqPrem (a, b, ty, _) => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 611 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 612 | val a' = run false a | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 613 | val b' = run true b | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 614 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 615 | case match_aterms varsubst b' a' of | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 616 | NONE => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 617 | let | 
| 31322 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 618 | fun mk s = Syntax.string_of_term_global Pure.thy | 
| 
526e149999cc
attempt to eliminate adhoc makestring at runtime (which is not well-defined);
 wenzelm parents: 
30288diff
changeset | 619 | (infer_types (naming_of computer) (encoding_of computer) ty s) | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 620 | val left = "computed left side: "^(mk a') | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 621 | val right = "computed right side: "^(mk b') | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 622 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 623 |                     raise Compute ("evaluate_prem: cannot assign computed left to right hand side\n"^left^"\n"^right^"\n")
 | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 624 | end | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 625 | | SOME varsubst => | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 626 | update_prems (splicein prem_no [] prems) (update_varsubst varsubst th) | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 627 | end | 
| 25217 | 628 | end | 
| 23663 | 629 | |
| 25217 | 630 | fun prem2term (Prem t) = t | 
| 631 | | prem2term (EqPrem (a,b,_,eq)) = | |
| 632 | AbstractMachine.App (AbstractMachine.App (AbstractMachine.Const eq, a), b) | |
| 23663 | 633 | |
| 25217 | 634 | fun modus_ponens computer prem_no th' th = | 
| 635 | let | |
| 636 | val _ = check_compatible computer th | |
| 637 | val thy = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 638 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 639 | val thy1 = theory_of_theorem th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 640 | val thy2 = theory_of_thm th' | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 641 | in | 
| 26674 | 642 | if Theory.subthy (thy1, thy2) then thy2 | 
| 643 | else if Theory.subthy (thy2, thy1) then thy1 else | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 644 | raise Compute "modus_ponens: theorems are not compatible with each other" | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 645 | end | 
| 25217 | 646 | val th' = make_theorem computer th' [] | 
| 647 | val varsubst = varsubst_of_theorem th | |
| 648 | fun run vars_allowed t = | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 649 | runprog (prog_of computer) (apply_subst vars_allowed varsubst t) | 
| 25217 | 650 | val prems = prems_of_theorem th | 
| 42364 | 651 | val prem = run true (prem2term (nth prems prem_no)) | 
| 25217 | 652 | val concl = run false (concl_of_theorem th') | 
| 653 | in | |
| 654 | case match_aterms varsubst prem concl of | |
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 655 | NONE => raise Compute "modus_ponens: conclusion does not match premise" | 
| 25217 | 656 | | SOME varsubst => | 
| 26626 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 657 | let | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 658 | val th = update_varsubst varsubst th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 659 | val th = update_prems (splicein prem_no (prems_of_theorem th') prems) th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 660 | val th = update_hyps (merge_hyps (hyps_of_theorem th) (hyps_of_theorem th')) th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 661 | val th = update_shyps (merge_shyps (shyps_of_theorem th) (shyps_of_theorem th')) th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 662 | in | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 663 | update_theory thy th | 
| 
c6231d64d264
rep_cterm/rep_thm: no longer dereference theory_ref;
 wenzelm parents: 
25520diff
changeset | 664 | end | 
| 25217 | 665 | end | 
| 666 | ||
| 667 | fun simplify computer th = | |
| 668 | let | |
| 669 | val _ = check_compatible computer th | |
| 670 | val varsubst = varsubst_of_theorem th | |
| 671 | val encoding = encoding_of computer | |
| 672 | val naming = naming_of computer | |
| 673 |     fun infer t = infer_types naming encoding @{typ "prop"} t
 | |
| 674 | fun run t = infer (runprog (prog_of computer) (apply_subst true varsubst t)) | |
| 675 | fun runprem p = run (prem2term p) | |
| 676 | val prop = Logic.list_implies (map runprem (prems_of_theorem th), run (concl_of_theorem th)) | |
| 677 | val hyps = merge_hyps (hyps_of computer) (hyps_of_theorem th) | |
| 678 | val shyps = merge_shyps (shyps_of_theorem th) (Sorttab.keys (shyptab_of computer)) | |
| 679 | in | |
| 680 | export_thm (theory_of_theorem th) hyps shyps prop | |
| 681 | end | |
| 23174 | 682 | |
| 683 | end | |
| 23663 | 684 |