336 |
336 |
337 fun crep_thm (Thm (_, {thy, tags, maxidx, shyps, hyps, tpairs, prop})) = |
337 fun crep_thm (Thm (_, {thy, tags, maxidx, shyps, hyps, tpairs, prop})) = |
338 let fun cterm max t = Cterm {thy = thy, t = t, T = propT, maxidx = max, sorts = shyps} in |
338 let fun cterm max t = Cterm {thy = thy, t = t, T = propT, maxidx = max, sorts = shyps} in |
339 {thy = thy, tags = tags, maxidx = maxidx, shyps = shyps, |
339 {thy = thy, tags = tags, maxidx = maxidx, shyps = shyps, |
340 hyps = map (cterm ~1) hyps, |
340 hyps = map (cterm ~1) hyps, |
341 tpairs = map (pairself (cterm maxidx)) tpairs, |
341 tpairs = map (apply2 (cterm maxidx)) tpairs, |
342 prop = cterm maxidx prop} |
342 prop = cterm maxidx prop} |
343 end; |
343 end; |
344 |
344 |
345 fun fold_terms f (Thm (_, {tpairs, prop, hyps, ...})) = |
345 fun fold_terms f (Thm (_, {tpairs, prop, hyps, ...})) = |
346 fold (fn (t, u) => f t #> f u) tpairs #> f prop #> fold f hyps; |
346 fold (fn (t, u) => f t #> f u) tpairs #> f prop #> fold f hyps; |
998 Unify.smash_unifiers (make_context opt_ctxt thy) tpairs (Envir.empty maxidx) |
998 Unify.smash_unifiers (make_context opt_ctxt thy) tpairs (Envir.empty maxidx) |
999 |> Seq.map (fn env => |
999 |> Seq.map (fn env => |
1000 if Envir.is_empty env then th |
1000 if Envir.is_empty env then th |
1001 else |
1001 else |
1002 let |
1002 let |
1003 val tpairs' = tpairs |> map (pairself (Envir.norm_term env)) |
1003 val tpairs' = tpairs |> map (apply2 (Envir.norm_term env)) |
1004 (*remove trivial tpairs, of the form t==t*) |
1004 (*remove trivial tpairs, of the form t==t*) |
1005 |> filter_out (op aconv); |
1005 |> filter_out (op aconv); |
1006 val der' = deriv_rule1 (Proofterm.norm_proof' env) der; |
1006 val der' = deriv_rule1 (Proofterm.norm_proof' env) der; |
1007 val prop' = Envir.norm_term env prop; |
1007 val prop' = Envir.norm_term env prop; |
1008 val maxidx = maxidx_tpairs tpairs' (maxidx_of_term prop'); |
1008 val maxidx = maxidx_tpairs tpairs' (maxidx_of_term prop'); |
1037 val _ = exists bad_term hyps andalso |
1037 val _ = exists bad_term hyps andalso |
1038 raise THM ("generalize: variable free in assumptions", 0, [th]); |
1038 raise THM ("generalize: variable free in assumptions", 0, [th]); |
1039 |
1039 |
1040 val gen = Term_Subst.generalize (tfrees, frees) idx; |
1040 val gen = Term_Subst.generalize (tfrees, frees) idx; |
1041 val prop' = gen prop; |
1041 val prop' = gen prop; |
1042 val tpairs' = map (pairself gen) tpairs; |
1042 val tpairs' = map (apply2 gen) tpairs; |
1043 val maxidx' = maxidx_tpairs tpairs' (maxidx_of_term prop'); |
1043 val maxidx' = maxidx_tpairs tpairs' (maxidx_of_term prop'); |
1044 in |
1044 in |
1045 Thm (deriv_rule1 (Proofterm.generalize (tfrees, frees) idx) der, |
1045 Thm (deriv_rule1 (Proofterm.generalize (tfrees, frees) idx) der, |
1046 {thy = thy, |
1046 {thy = thy, |
1047 tags = [], |
1047 tags = [], |
1289 {thy = merge_thys1 goal orule, |
1289 {thy = merge_thys1 goal orule, |
1290 tags = [], |
1290 tags = [], |
1291 maxidx = maxidx + inc, |
1291 maxidx = maxidx + inc, |
1292 shyps = Sorts.union shyps sorts, (*sic!*) |
1292 shyps = Sorts.union shyps sorts, (*sic!*) |
1293 hyps = hyps, |
1293 hyps = hyps, |
1294 tpairs = map (pairself lift_abs) tpairs, |
1294 tpairs = map (apply2 lift_abs) tpairs, |
1295 prop = Logic.list_implies (map lift_all As, lift_all B)}) |
1295 prop = Logic.list_implies (map lift_all As, lift_all B)}) |
1296 end; |
1296 end; |
1297 |
1297 |
1298 fun incr_indexes i (thm as Thm (der, {thy, maxidx, shyps, hyps, tpairs, prop, ...})) = |
1298 fun incr_indexes i (thm as Thm (der, {thy, maxidx, shyps, hyps, tpairs, prop, ...})) = |
1299 if i < 0 then raise THM ("negative increment", 0, [thm]) |
1299 if i < 0 then raise THM ("negative increment", 0, [thm]) |
1303 {thy = thy, |
1303 {thy = thy, |
1304 tags = [], |
1304 tags = [], |
1305 maxidx = maxidx + i, |
1305 maxidx = maxidx + i, |
1306 shyps = shyps, |
1306 shyps = shyps, |
1307 hyps = hyps, |
1307 hyps = hyps, |
1308 tpairs = map (pairself (Logic.incr_indexes ([], i))) tpairs, |
1308 tpairs = map (apply2 (Logic.incr_indexes ([], i))) tpairs, |
1309 prop = Logic.incr_indexes ([], i) prop}); |
1309 prop = Logic.incr_indexes ([], i) prop}); |
1310 |
1310 |
1311 (*Solve subgoal Bi of proof state B1...Bn/C by assumption. *) |
1311 (*Solve subgoal Bi of proof state B1...Bn/C by assumption. *) |
1312 fun assumption opt_ctxt i state = |
1312 fun assumption opt_ctxt i state = |
1313 let |
1313 let |
1322 maxidx = Envir.maxidx_of env, |
1322 maxidx = Envir.maxidx_of env, |
1323 shyps = Envir.insert_sorts env shyps, |
1323 shyps = Envir.insert_sorts env shyps, |
1324 hyps = hyps, |
1324 hyps = hyps, |
1325 tpairs = |
1325 tpairs = |
1326 if Envir.is_empty env then tpairs |
1326 if Envir.is_empty env then tpairs |
1327 else map (pairself (Envir.norm_term env)) tpairs, |
1327 else map (apply2 (Envir.norm_term env)) tpairs, |
1328 prop = |
1328 prop = |
1329 if Envir.is_empty env then (*avoid wasted normalizations*) |
1329 if Envir.is_empty env then (*avoid wasted normalizations*) |
1330 Logic.list_implies (Bs, C) |
1330 Logic.list_implies (Bs, C) |
1331 else (*normalize the new rule fully*) |
1331 else (*normalize the new rule fully*) |
1332 Envir.norm_term env (Logic.list_implies (Bs, C)), |
1332 Envir.norm_term env (Logic.list_implies (Bs, C)), |
1502 |> fold (add_var o fst) dpairs |
1502 |> fold (add_var o fst) dpairs |
1503 |> fold (add_var o fst) tpairs |
1503 |> fold (add_var o fst) tpairs |
1504 |> fold (add_var o snd) tpairs; |
1504 |> fold (add_var o snd) tpairs; |
1505 val vids' = fold (add_var o strip_lifted B) As []; |
1505 val vids' = fold (add_var o strip_lifted B) As []; |
1506 (*unknowns appearing elsewhere be preserved!*) |
1506 (*unknowns appearing elsewhere be preserved!*) |
1507 val al' = distinct ((op =) o pairself fst) |
1507 val al' = distinct ((op =) o apply2 fst) |
1508 (filter_out (fn (x, y) => |
1508 (filter_out (fn (x, y) => |
1509 not (member (op =) vids' x) orelse |
1509 not (member (op =) vids' x) orelse |
1510 member (op =) vids x orelse member (op =) vids y) al); |
1510 member (op =) vids x orelse member (op =) vids y) al); |
1511 val unchanged = filter_out (AList.defined (op =) al') vids'; |
1511 val unchanged = filter_out (AList.defined (op =) al') vids'; |
1512 fun del_clashing clash xs _ [] qs = |
1512 fun del_clashing clash xs _ [] qs = |
1596 let val normt = Envir.norm_term env; |
1596 let val normt = Envir.norm_term env; |
1597 (*perform minimal copying here by examining env*) |
1597 (*perform minimal copying here by examining env*) |
1598 val (ntpairs, normp) = |
1598 val (ntpairs, normp) = |
1599 if Envir.is_empty env then (tpairs, (Bs @ As, C)) |
1599 if Envir.is_empty env then (tpairs, (Bs @ As, C)) |
1600 else |
1600 else |
1601 let val ntps = map (pairself normt) tpairs |
1601 let val ntps = map (apply2 normt) tpairs |
1602 in if Envir.above env smax then |
1602 in if Envir.above env smax then |
1603 (*no assignments in state; normalize the rule only*) |
1603 (*no assignments in state; normalize the rule only*) |
1604 if lifted |
1604 if lifted |
1605 then (ntps, (Bs @ map (norm_term_skip env nlift) As, C)) |
1605 then (ntps, (Bs @ map (norm_term_skip env nlift) As, C)) |
1606 else (ntps, (Bs @ map normt As, C)) |
1606 else (ntps, (Bs @ map normt As, C)) |