src/Pure/variable.ML
changeset 59796 f05ef8c62e4f
parent 59790 85c572d089fc
child 59798 45c89526208f
equal deleted inserted replaced
59795:d453c69596cc 59796:f05ef8c62e4f
    50   val add_frees: Proof.context -> term -> (string * typ) list -> (string * typ) list
    50   val add_frees: Proof.context -> term -> (string * typ) list -> (string * typ) list
    51   val add_fixes_binding: binding list -> Proof.context -> string list * Proof.context
    51   val add_fixes_binding: binding list -> Proof.context -> string list * Proof.context
    52   val add_fixes: string list -> Proof.context -> string list * Proof.context
    52   val add_fixes: string list -> Proof.context -> string list * Proof.context
    53   val add_fixes_direct: string list -> Proof.context -> Proof.context
    53   val add_fixes_direct: string list -> Proof.context -> Proof.context
    54   val auto_fixes: term -> Proof.context -> Proof.context
    54   val auto_fixes: term -> Proof.context -> Proof.context
       
    55   val fix_dummy_patterns: term -> Proof.context -> term * Proof.context
    55   val variant_fixes: string list -> Proof.context -> string list * Proof.context
    56   val variant_fixes: string list -> Proof.context -> string list * Proof.context
    56   val dest_fixes: Proof.context -> (string * string) list
    57   val dest_fixes: Proof.context -> (string * string) list
    57   val invent_types: sort list -> Proof.context -> (string * sort) list * Proof.context
       
    58   val export_terms: Proof.context -> Proof.context -> term list -> term list
    58   val export_terms: Proof.context -> Proof.context -> term list -> term list
    59   val exportT_terms: Proof.context -> Proof.context -> term list -> term list
    59   val exportT_terms: Proof.context -> Proof.context -> term list -> term list
    60   val exportT: Proof.context -> Proof.context -> thm list -> thm list
    60   val exportT: Proof.context -> Proof.context -> thm list -> thm list
    61   val export_prf: Proof.context -> Proof.context -> Proofterm.proof -> Proofterm.proof
    61   val export_prf: Proof.context -> Proof.context -> Proofterm.proof -> Proofterm.proof
    62   val export: Proof.context -> Proof.context -> thm list -> thm list
    62   val export: Proof.context -> Proof.context -> thm list -> thm list
    63   val export_morphism: Proof.context -> Proof.context -> morphism
    63   val export_morphism: Proof.context -> Proof.context -> morphism
       
    64   val invent_types: sort list -> Proof.context -> (string * sort) list * Proof.context
    64   val importT_inst: term list -> Proof.context -> ((indexname * sort) * typ) list * Proof.context
    65   val importT_inst: term list -> Proof.context -> ((indexname * sort) * typ) list * Proof.context
    65   val import_inst: bool -> term list -> Proof.context ->
    66   val import_inst: bool -> term list -> Proof.context ->
    66     (((indexname * sort) * typ) list * ((indexname * typ) * term) list) * Proof.context
    67     (((indexname * sort) * typ) list * ((indexname * typ) * term) list) * Proof.context
    67   val importT_terms: term list -> Proof.context -> term list * Proof.context
    68   val importT_terms: term list -> Proof.context -> term list * Proof.context
    68   val import_terms: bool -> term list -> Proof.context -> term list * Proof.context
    69   val import_terms: bool -> term list -> Proof.context -> term list * Proof.context
   458 
   459 
   459 fun auto_fixes t ctxt = ctxt
   460 fun auto_fixes t ctxt = ctxt
   460   |> not (is_body ctxt) ? add_fixes_direct (rev (add_free_names ctxt t []))
   461   |> not (is_body ctxt) ? add_fixes_direct (rev (add_free_names ctxt t []))
   461   |> declare_term t;
   462   |> declare_term t;
   462 
   463 
   463 fun invent_types Ss ctxt =
   464 
   464   let
   465 (* dummy patterns *)
   465     val tfrees = Name.invent (names_of ctxt) Name.aT (length Ss) ~~ Ss;
   466 
   466     val ctxt' = fold (declare_constraints o Logic.mk_type o TFree) tfrees ctxt;
   467 fun fix_dummy_patterns (Const ("Pure.dummy_pattern", T)) ctxt =
   467   in (tfrees, ctxt') end;
   468       let val ([x], ctxt') = add_fixes [Name.uu_] ctxt
       
   469       in (Free (x, T), ctxt') end
       
   470   | fix_dummy_patterns (Abs (x, T, b)) ctxt =
       
   471       let val (b', ctxt') = fix_dummy_patterns b ctxt
       
   472       in (Abs (x, T, b'), ctxt') end
       
   473   | fix_dummy_patterns (t $ u) ctxt =
       
   474       let
       
   475         val (t', ctxt') = fix_dummy_patterns t ctxt;
       
   476         val (u', ctxt'') = fix_dummy_patterns u ctxt';
       
   477       in (t' $ u', ctxt'') end
       
   478   | fix_dummy_patterns a ctxt = (a, ctxt);
   468 
   479 
   469 
   480 
   470 
   481 
   471 (** export -- generalize type/term variables (beware of closure sizes) **)
   482 (** export -- generalize type/term variables (beware of closure sizes) **)
   472 
   483 
   538   end;
   549   end;
   539 
   550 
   540 
   551 
   541 
   552 
   542 (** import -- fix schematic type/term variables **)
   553 (** import -- fix schematic type/term variables **)
       
   554 
       
   555 fun invent_types Ss ctxt =
       
   556   let
       
   557     val tfrees = Name.invent (names_of ctxt) Name.aT (length Ss) ~~ Ss;
       
   558     val ctxt' = fold (declare_constraints o Logic.mk_type o TFree) tfrees ctxt;
       
   559   in (tfrees, ctxt') end;
   543 
   560 
   544 fun importT_inst ts ctxt =
   561 fun importT_inst ts ctxt =
   545   let
   562   let
   546     val tvars = rev (fold Term.add_tvars ts []);
   563     val tvars = rev (fold Term.add_tvars ts []);
   547     val (tfrees, ctxt') = invent_types (map #2 tvars) ctxt;
   564     val (tfrees, ctxt') = invent_types (map #2 tvars) ctxt;