src/Pure/proofterm.ML
changeset 70419 ea5a492cd196
parent 70417 eb6ff14767cd
child 70420 328573dd886f
equal deleted inserted replaced
70418:d23cfb85438a 70419:ea5a492cd196
   151     (typ list -> term option list -> proof -> (proof * proof) option) list -> proof -> proof
   151     (typ list -> term option list -> proof -> (proof * proof) option) list -> proof -> proof
   152   val rew_proof: theory -> proof -> proof
   152   val rew_proof: theory -> proof -> proof
   153 
   153 
   154   val forall_intr_vfs: term -> term
   154   val forall_intr_vfs: term -> term
   155   val forall_intr_vfs_prf: term -> proof -> proof
   155   val forall_intr_vfs_prf: term -> proof -> proof
       
   156   val app_types: int -> term -> typ list -> proof -> proof
   156   val clean_proof: theory -> proof -> proof
   157   val clean_proof: theory -> proof -> proof
   157 
   158 
   158   val proof_serial: unit -> proof_serial
   159   val proof_serial: unit -> proof_serial
   159   val fulfill_norm_proof: theory -> (serial * proof_body) list -> proof_body -> proof_body
   160   val fulfill_norm_proof: theory -> (serial * proof_body) list -> proof_body -> proof_body
   160   val thm_proof: theory -> string -> sort list -> term list -> term ->
   161   val thm_proof: theory -> string -> sort list -> term list -> term ->
  1590 in
  1591 in
  1591 
  1592 
  1592 fun forall_intr_vfs prop = fold_rev Logic.all (variables_of prop) prop;
  1593 fun forall_intr_vfs prop = fold_rev Logic.all (variables_of prop) prop;
  1593 fun forall_intr_vfs_prf prop prf = fold_rev forall_intr_proof' (variables_of prop) prf;
  1594 fun forall_intr_vfs_prf prop prf = fold_rev forall_intr_proof' (variables_of prop) prf;
  1594 
  1595 
       
  1596 fun app_types shift prop Ts prf =
       
  1597   let
       
  1598     val tvars = rev (Term.add_tvars prop []);
       
  1599     val tfrees = rev (Term.add_tfrees prop []);
       
  1600     val vs = map (fn ((a, i), _) => (a, i + shift)) tvars @ map (fn (a, _) => (a, ~1)) tfrees;
       
  1601     fun varify (v as (a, S)) = if member (op =) tfrees v then TVar ((a, ~1), S) else TFree v;
       
  1602   in map_proof_types (typ_subst_TVars (vs ~~ Ts) o map_type_tfree varify) prf end;
       
  1603 
  1595 end;
  1604 end;
  1596 
  1605 
  1597 fun clean_proof thy prf =
  1606 fun clean_proof thy prf =
  1598   let
  1607   let
  1599     fun clean maxidx prfs (AbsP (s, t, prf)) =
  1608     fun clean maxidx prfs (AbsP (s, t, prf)) =
  1619                     val prf' = forall_intr_vfs_prf prop (join_proof body);
  1628                     val prf' = forall_intr_vfs_prf prop (join_proof body);
  1620                     val (maxidx', prfs', prf) = clean (maxidx_proof prf' ~1) prfs prf';
  1629                     val (maxidx', prfs', prf) = clean (maxidx_proof prf' ~1) prfs prf';
  1621                     val prfs'' = (prop, (maxidx', prf)) :: prfs';
  1630                     val prfs'' = (prop, (maxidx', prf)) :: prfs';
  1622                   in (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs'') end
  1631                   in (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs'') end
  1623               | SOME (maxidx', prf) => (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs));
  1632               | SOME (maxidx', prf) => (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs));
  1624             val tfrees = Term.add_tfrees prop [] |> rev;
  1633           in (maxidx', prfs', app_types (maxidx + 1) prop Ts prf) end
  1625             val tye = map (fn ((s, j), _) => (s, maxidx + 1 + j))
       
  1626               (Term.add_tvars prop [] |> rev) @ map (rpair ~1 o fst) tfrees ~~ Ts;
       
  1627             val varify = map_type_tfree (fn p as (a, S) =>
       
  1628               if member (op =) tfrees p then TVar ((a, ~1), S) else TFree p)
       
  1629           in
       
  1630             (maxidx', prfs', map_proof_types (typ_subst_TVars tye o varify) prf)
       
  1631           end
       
  1632       | clean maxidx prfs prf = (maxidx, prfs, prf);
  1634       | clean maxidx prfs prf = (maxidx, prfs, prf);
  1633 
  1635 
  1634   in rew_proof thy (#3 (clean (maxidx_proof prf ~1) [] prf)) end;
  1636   in rew_proof thy (#3 (clean (maxidx_proof prf ~1) [] prf)) end;
  1635 
  1637 
  1636 
  1638