]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/cic_disambiguation/disambiguateChoices.ml
λδ site update
[helm.git] / helm / software / components / cic_disambiguation / disambiguateChoices.ml
index bdbc9317908efe7dc29a9f3e11637a7761923ed0..6d4d63b704e367c0c64cf3f0989d8c68de527031 100644 (file)
@@ -32,8 +32,10 @@ open DisambiguateTypes
 exception Choice_not_found of string Lazy.t
 
 let num_choices = ref []
+let nnum_choices = ref []
 
 let add_num_choice choice = num_choices := choice :: !num_choices
+let nadd_num_choice choice = nnum_choices := choice :: !nnum_choices
 
 let has_description dsc = (fun x -> fst x = dsc)
 
@@ -44,26 +46,53 @@ let lookup_num_by_dsc dsc =
     List.find (has_description dsc) !num_choices
   with Not_found -> raise (Choice_not_found (lazy ("Num with dsc " ^  dsc)))
 
-let mk_choice (dsc, args, appl_pattern) =
+let nlookup_num_by_dsc dsc =
+  try
+    List.find (has_description dsc) !nnum_choices
+  with Not_found -> raise (Choice_not_found (lazy ("Num with dsc " ^  dsc)))
+
+let mk_choice  ~mk_appl ~mk_implicit ~term_of_uri ~term_of_nref (dsc, args, appl_pattern)=
   dsc,
-  (fun env _ cic_args ->
-    let env' =
+  `Sym_interp
+  (fun cic_args ->
+    let env',rest =
       let names =
         List.map (function CicNotationPt.IdentArg (_, name) -> name) args
       in
-      try
-        List.combine names cic_args
-      with Invalid_argument _ ->
-       raise (Invalid_choice (lazy "The notation expects a different number of arguments"))
+       let rec combine_with_rest l1 l2 =
+        match l1,l2 with
+           _::_,[] -> raise (Invalid_argument "combine_with_rest")
+         | [],rest -> [],rest
+         | he1::tl1,he2::tl2 ->
+            let l,rest = combine_with_rest tl1 tl2 in
+             (he1,he2)::l,rest
+       in
+        try
+         combine_with_rest names cic_args
+        with Invalid_argument _ ->
+         raise (Invalid_choice (lazy (Stdpp.dummy_loc, 
+           "The notation " ^ dsc ^ " expects more arguments")))
     in
-    TermAcicContent.instantiate_appl_pattern env' appl_pattern)
+     let combined =
+      TermAcicContent.instantiate_appl_pattern 
+        ~mk_appl ~mk_implicit ~term_of_uri ~term_of_nref env' appl_pattern
+     in
+      match rest with
+         [] -> combined
+       | _::_ -> mk_appl (combined::rest))
 
-let lookup_symbol_by_dsc symbol dsc =
+let lookup_symbol_by_dsc ~mk_appl ~mk_implicit ~term_of_uri ~term_of_nref symbol dsc =
+  let interpretations = TermAcicContent.lookup_interpretations ~sorted:false symbol in
   try
-    mk_choice
-      (List.find
-        (fun (dsc', _, _) -> dsc = dsc')
-        (TermAcicContent.lookup_interpretations symbol))
+    mk_choice ~mk_appl ~mk_implicit ~term_of_uri ~term_of_nref
+      (List.find (fun (dsc', _, _) -> dsc = dsc') interpretations)
   with TermAcicContent.Interpretation_not_found | Not_found ->
     raise (Choice_not_found (lazy (sprintf "Symbol %s, dsc %s" symbol dsc)))
 
+let cic_lookup_symbol_by_dsc = lookup_symbol_by_dsc
+  ~mk_implicit:(function 
+     | true -> Cic.Implicit (Some `Type)
+     | false -> Cic.Implicit None)
+  ~mk_appl:(function (Cic.Appl l)::tl -> Cic.Appl (l@tl) | l -> Cic.Appl l)
+  ~term_of_uri:CicUtil.term_of_uri ~term_of_nref:(fun _ -> assert false)
+;;