| _ -> assert false
;;
+let rec mk_rels howmany from =
+ match howmany with
+ | 0 -> []
+ | _ -> (NCic.Rel (howmany + from)) :: (mk_rels (howmany-1) from)
+;;
+
let refine_term
metasenv subst context uri ~coercion_db ~use_coercions term expty _ ~localization_tbl=
assert (uri=None);
let localise t =
try NCicUntrusted.NCicHash.find localization_tbl t
with Not_found ->
- prerr_endline (NCicPp.ppterm ~metasenv ~subst ~context t);
- assert false
+ prerr_endline ("NOT LOCALISED" ^ NCicPp.ppterm ~metasenv ~subst ~context t);
+ (*assert false*) HExtlib.dummy_floc
in
let metasenv, subst, term, _ =
NCicRefiner.typeof
;;
let refine_obj
- ~coercion_db metasenv subst context uri
- ~use_coercions obj _ ugraph ~localization_tbl
+ ~coercion_db metasenv subst context _uri
+ ~use_coercions obj _ _ugraph ~localization_tbl
=
assert (metasenv=[]);
assert (subst=[]);
with NRef.IllFormedReference _ ->
CicNotationPt.fail loc "Ill formed reference")
| CicNotationPt.Implicit -> NCic.Implicit `Term
- | CicNotationPt.UserInput -> assert false (*NCic.Implicit (Some `Hole)
-patterns not implemented *)
+ | CicNotationPt.UserInput -> NCic.Implicit `Hole
| CicNotationPt.Num (num, i) ->
Disambiguate.resolve ~env ~mk_choice (Num i) (`Num_arg num)
| CicNotationPt.Meta (index, subst) ->
~context
;;
+let disambiguate_path path =
+ let localization_tbl = NCicUntrusted.NCicHash.create 23 in
+ fst
+ (interpretate_term_and_interpretate_term_option
+ ~obj_context:[] ~mk_choice:(fun _ -> assert false)
+ ~create_dummy_ids:true ~env:DisambiguateTypes.Environment.empty
+ ~uri:None ~is_path:true ~localization_tbl) ~context:[] path
+;;
+
let new_flavour_of_flavour = function
| `Definition -> `Definition
| `MutualDefinition -> `Definition
let attrs = `Provided, new_flavour_of_flavour flavour, `Regular in
NCic.Constant ([],name,Some (NCic.Implicit `Term),ty',attrs)
| Some bo,_ ->
- match bo with
+ (match bo with
| CicNotationPt.LetRec (kind, defs, _) ->
let inductive = kind = `Inductive in
let _,obj_context =
~obj_context:[] ~context:[] ~env ~uri:None ~is_path:false bo
in
let attrs = `Provided, new_flavour_of_flavour flavour, `Regular in
- NCic.Constant ([],name,Some bo,ty',attrs))
- | _ -> raise (MultiPassDisambiguator.DisambiguationError (0, []))
-(*
- | CicNotationPt.Inductive (params,tyl) ->
- let uri = match uri with Some uri -> uri | None -> assert false in
- let context,params =
- let context,res =
- List.fold_left
- (fun (context,res) (name,t) ->
- let t =
- match t with
- None -> CicNotationPt.Implicit
- | Some t -> t in
- let name = CicNotationUtil.cic_name_of_name name in
- name::context,(name, interpretate_term context env None false t)::res
- ) ([],[]) params
- in
- context,List.rev res in
- let add_params =
- List.fold_right (fun (name,ty) t -> Cic.Prod (name,ty,t)) params in
- let obj_context =
- snd (
- List.fold_left
- (*here the explicit_named_substituion is assumed to be of length 0 *)
- (fun (i,res) (name,_,_,_) -> i + 1,(name,Cic.MutInd (uri,i,[]))::res)
- (0,[]) tyl) in
- let tyl =
- List.map
- (fun (name,b,ty,cl) ->
- let ty' = add_params (interpretate_term context env None false ty) in
- let cl' =
- List.map
- (fun (name,ty) ->
- let ty' =
- add_params
- (interpretate_term ~obj_context ~context ~env ~uri:None
- ~is_path:false ty)
- in
- name,ty'
- ) cl
+ NCic.Constant ([],name,Some bo,ty',attrs)))
+ | CicNotationPt.Inductive (params,tyl) ->
+ let context,params =
+ let context,res =
+ List.fold_left
+ (fun (context,res) (name,t) ->
+ let t =
+ match t with
+ None -> CicNotationPt.Implicit
+ | Some t -> t in
+ let name = cic_name_of_name name in
+ let t =
+ interpretate_term ~obj_context:[] ~context ~env ~uri:None
+ ~is_path:false t
in
- name,b,ty',cl'
- ) tyl
+ (name,NCic.Decl t)::context,(name,t)::res
+ ) ([],[]) params
in
- Cic.InductiveDefinition (tyl,[],List.length params,[])
- | CicNotationPt.Record (params,name,ty,fields) ->
- let uri = match uri with Some uri -> uri | None -> assert false in
- let context,params =
- let context,res =
- List.fold_left
- (fun (context,res) (name,t) ->
- let t =
- match t with
- None -> CicNotationPt.Implicit
- | Some t -> t in
- let name = CicNotationUtil.cic_name_of_name name in
- name::context,(name, interpretate_term context env None false t)::res
- ) ([],[]) params
- in
- context,List.rev res in
- let add_params =
- List.fold_right
- (fun (name,ty) t -> Cic.Prod (name,ty,t)) params in
- let ty' = add_params (interpretate_term context env None false ty) in
- let fields' =
- snd (
- List.fold_left
- (fun (context,res) (name,ty,_coercion,arity) ->
- let context' = Cic.Name name :: context in
- context',(name,interpretate_term context env None false ty)::res
- ) (context,[]) fields) in
- let concl =
- (*here the explicit_named_substituion is assumed to be of length 0 *)
- let mutind = Cic.MutInd (uri,0,[]) in
- if params = [] then mutind
- else
- Cic.Appl
- (mutind::CicUtil.mk_rels (List.length params) (List.length fields)) in
- let con =
+ context,List.rev res in
+ let add_params =
+ List.fold_right (fun (name,ty) t -> NCic.Prod (name,ty,t)) params in
+ let leftno = List.length params in
+ let obj_context =
+ snd (
List.fold_left
- (fun t (name,ty) -> Cic.Prod (Cic.Name name,ty,t))
- concl fields' in
- let con' = add_params con in
- let tyl = [name,true,ty',["mk_" ^ name,con']] in
- let field_names = List.map (fun (x,_,y,z) -> x,y,z) fields in
- Cic.InductiveDefinition
- (tyl,[],List.length params,[`Class (`Record field_names)])
-*)
+ (fun (i,res) (name,_,_,_) ->
+ let _,inductive,_,_ =
+ (* ??? *)
+ try List.hd tyl with Failure _ -> assert false in
+ let nref =
+ NReference.reference_of_spec uri (NReference.Ind (inductive,i,leftno))
+ in
+ i+1,(name,nref)::res)
+ (0,[]) tyl) in
+ let tyl =
+ List.map
+ (fun (name,_,ty,cl) ->
+ let ty' =
+ add_params
+ (interpretate_term ~obj_context:[] ~context ~env ~uri:None
+ ~is_path:false ty) in
+ let cl' =
+ List.map
+ (fun (name,ty) ->
+ let ty' =
+ add_params
+ (interpretate_term ~obj_context ~context ~env ~uri:None
+ ~is_path:false ty) in
+ let relevance = [] in
+ relevance,name,ty'
+ ) cl in
+ let relevance = [] in
+ relevance,name,ty',cl'
+ ) tyl
+ in
+ let height = (* XXX calculate *) 0 in
+ let attrs = `Provided, `Regular in
+ uri, height, [], [],
+ NCic.Inductive (true,leftno,tyl,attrs)
+ | CicNotationPt.Record (params,name,ty,fields) ->
+ let context,params =
+ let context,res =
+ List.fold_left
+ (fun (context,res) (name,t) ->
+ let t =
+ match t with
+ None -> CicNotationPt.Implicit
+ | Some t -> t in
+ let name = cic_name_of_name name in
+ let t =
+ interpretate_term ~obj_context:[] ~context ~env ~uri:None
+ ~is_path:false t
+ in
+ (name,NCic.Decl t)::context,(name,t)::res
+ ) ([],[]) params
+ in
+ context,List.rev res in
+ let add_params =
+ List.fold_right (fun (name,ty) t -> NCic.Prod (name,ty,t)) params in
+ let leftno = List.length params in
+ let ty' =
+ add_params
+ (interpretate_term ~obj_context:[] ~context ~env ~uri:None
+ ~is_path:false ty) in
+ let fields' =
+ snd (
+ List.fold_left
+ (fun (context,res) (name,ty,_coercion,_arity) ->
+ let ty =
+ interpretate_term ~obj_context:[] ~context ~env ~uri:None
+ ~is_path:false ty in
+ let context' = (name,NCic.Decl ty)::context in
+ context',(name,ty)::res
+ ) (context,[]) fields) in
+ let concl =
+ let nref =
+ NReference.reference_of_spec uri (NReference.Ind (true,0,leftno)) in
+ let mutind = NCic.Const nref in
+ if params = [] then mutind
+ else
+ NCic.Appl
+ (mutind::mk_rels (List.length params) (List.length fields)) in
+ let con =
+ List.fold_left (fun t (name,ty) -> NCic.Prod (name,ty,t)) concl fields' in
+ let con' = add_params con in
+ let relevance = [] in
+ let tyl = [relevance,name,ty',[relevance,"mk_" ^ name,con']] in
+ let field_names = List.map (fun (x,_,y,z) -> x,y,z) fields in
+ let height = (* XXX calculate *) 0 in
+ let attrs = `Provided, `Record field_names in
+ uri, height, [], [],
+ NCic.Inductive (true,leftno,tyl,attrs)
;;
let disambiguate_term ~context ~metasenv ~subst ~expty