src/Pure/morphism.ML
changeset 74282 c2ee8d993d6a
parent 74266 612b7e0d6721
child 77902 01d6b2a44df8
--- a/src/Pure/morphism.ML	Thu Sep 09 23:07:02 2021 +0200
+++ b/src/Pure/morphism.ML	Fri Sep 10 14:59:19 2021 +0200
@@ -43,10 +43,8 @@
   val transfer_morphism': Proof.context -> morphism
   val transfer_morphism'': Context.generic -> morphism
   val trim_context_morphism: morphism
-  val instantiate_frees_morphism:
-    ((string * sort) * ctyp) list * ((string * typ) * cterm) list -> morphism
-  val instantiate_morphism:
-    ((indexname * sort) * ctyp) list * ((indexname * typ) * cterm) list -> morphism
+  val instantiate_frees_morphism: ctyp TFrees.table * cterm Frees.table -> morphism
+  val instantiate_morphism: ctyp TVars.table * cterm Vars.table -> morphism
 end;
 
 structure Morphism: MORPHISM =
@@ -134,35 +132,37 @@
 
 (* instantiate *)
 
-fun instantiate_frees_morphism ([], []) = identity
-  | instantiate_frees_morphism (cinstT, cinst) =
-      let
-        val instT = TFrees.build (cinstT |> fold (fn (v, cT) => TFrees.add (v, Thm.typ_of cT)));
-        val inst = Frees.build (cinst |> fold (fn (v, ct) => Frees.add (v, Thm.term_of ct)));
-      in
-        morphism "instantiate_frees"
-          {binding = [],
-           typ =
-            if TFrees.is_empty instT then []
-            else [Term_Subst.instantiateT_frees instT],
-           term = [Term_Subst.instantiate_frees (instT, inst)],
-           fact = [map (Thm.instantiate_frees (cinstT, cinst))]}
-      end;
+fun instantiate_frees_morphism (cinstT, cinst) =
+  if TFrees.is_empty cinstT andalso Frees.is_empty cinst then identity
+  else
+    let
+      val instT = TFrees.map (K Thm.typ_of) cinstT;
+      val inst = Frees.map (K Thm.term_of) cinst;
+    in
+      morphism "instantiate_frees"
+        {binding = [],
+         typ =
+          if TFrees.is_empty instT then []
+          else [Term_Subst.instantiateT_frees instT],
+         term = [Term_Subst.instantiate_frees (instT, inst)],
+         fact = [map (Thm.instantiate_frees (cinstT, cinst))]}
+    end;
 
-fun instantiate_morphism ([], []) = identity
-  | instantiate_morphism (cinstT, cinst) =
-      let
-        val instT = TVars.build (cinstT |> fold (fn (v, cT) => TVars.add (v, Thm.typ_of cT)));
-        val inst = Vars.build (cinst |> fold (fn (v, ct) => Vars.add (v, Thm.term_of ct)));
-      in
-        morphism "instantiate"
-          {binding = [],
-           typ =
-            if TVars.is_empty instT then []
-            else [Term_Subst.instantiateT instT],
-           term = [Term_Subst.instantiate (instT, inst)],
-           fact = [map (Thm.instantiate (cinstT, cinst))]}
-      end;
+fun instantiate_morphism (cinstT, cinst) =
+  if TVars.is_empty cinstT andalso Vars.is_empty cinst then identity
+  else
+    let
+      val instT = TVars.map (K Thm.typ_of) cinstT;
+      val inst = Vars.map (K Thm.term_of) cinst;
+    in
+      morphism "instantiate"
+        {binding = [],
+         typ =
+          if TVars.is_empty instT then []
+          else [Term_Subst.instantiateT instT],
+         term = [Term_Subst.instantiate (instT, inst)],
+         fact = [map (Thm.instantiate (cinstT, cinst))]}
+    end;
 
 end;