src/Pure/thm.ML
changeset 59058 a78612c67ec0
parent 58950 d07464875dd4
child 59582 0fbed69ff081
equal deleted inserted replaced
59057:5b649fb2f2e1 59058:a78612c67ec0
   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))