* http://cs.unibo.it/helm/.
*)
-type sort_kind = [ `Prop | `Set | `Type | `CProp ]
-
-let sort_of_string = function
- | "Prop" -> `Prop
- | "Set" -> `Set
- | "Type" -> `Type
- | "CProp" -> `CProp
- | _ -> assert false
+type sort_kind = [ `Prop | `Set | `Type of CicUniv.universe | `CProp ]
let string_of_sort = function
| `Prop -> "Prop"
| `Set -> "Set"
- | `Type -> "Type"
+ | `Type u -> "Type:" ^ string_of_int (CicUniv.univno u)
| `CProp -> "CProp"
let sort_of_sort = function
| Cic.Prop -> `Prop
| Cic.Set -> `Set
- | Cic.Type _ -> `Type
+ | Cic.Type u -> `Type u
| Cic.CProp -> `CProp
(* let hashtbl_add_time = ref 0.0;; *)
let xxx_type_of_aux' m c t =
(* let t1 = Sys.time () in *)
- let res,_ = CicTypeChecker.type_of_aux' m c t CicUniv.empty_ugraph in
+ let res,_ =
+ try
+ CicTypeChecker.type_of_aux' m c t CicUniv.empty_ugraph
+ with
+ | CicTypeChecker.AssertFailure _
+ | CicTypeChecker.TypeCheckerFailure _ ->
+ Cic.Sort Cic.Prop, CicUniv.empty_ugraph
+ in
(* let t2 = Sys.time () in
type_of_aux'_add_time := !type_of_aux'_add_time +. t2 -. t1 ; *)
res
| (_,_) -> raise NotEnoughElements
;;
-let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
- ids_to_inner_types metasenv context idrefs t expectedty
+let acic_of_cic_context' ~computeinnertypes:global_computeinnertypes
+ seed ids_to_terms ids_to_father_ids ids_to_inner_sorts ids_to_inner_types
+ metasenv context idrefs t expectedty
=
let module D = DoubleTypeInference in
let module C = Cic in
prerr_endline ("*** Fine double_type_inference:" ^ (string_of_float (time2 -. time1)));
res
*)
- D.double_type_of metasenv context t expectedty
+ if global_computeinnertypes then
+ D.double_type_of metasenv context t expectedty
+ else
+ D.CicHash.empty ()
in
(*
let time2 = Sys.time () in
match CicReduction.whd context t with
C.Sort C.Prop -> `Prop
| C.Sort C.Set -> `Set
- | C.Sort (C.Type _)
- | C.Meta _ -> `Type
+ | C.Sort (C.Type u) -> `Type u
+ | C.Meta _ -> `Type (CicUniv.fresh())
| C.Sort C.CProp -> `CProp
| t ->
prerr_endline ("Cic2acic.sort_of applied to: " ^ CicPp.ppterm t) ;
else
(* We are already in an inner-type and Coscoy's double *)
(* type inference algorithm has not been applied. *)
- {D.synthesized =
+ { D.synthesized =
(***CSC: patch per provare i tempi
CicReduction.whd context (xxx_type_of_aux' metasenv context tt) ; *)
-Cic.Sort (Cic.Type (CicUniv.fresh())); (* TASSI: non dovrebbe fare danni *)
+ if global_computeinnertypes then
+ Cic.Sort (Cic.Type (CicUniv.fresh()))
+ else
+ CicReduction.whd context (xxx_type_of_aux' metasenv context tt);
D.expected = None}
in
(* incr number_new_type_of_aux' ; *)
with
Not_found -> (* l'inner-type non e' nella tabella ==> sort <> Prop *)
(* CSC: Type or Set? I can not tell *)
- None,Cic.Sort (Cic.Type (CicUniv.fresh())),`Type,false
+ let u = CicUniv.fresh() in
+ None,Cic.Sort (Cic.Type u),`Type u,false
(* TASSI non dovrebbe fare danni *)
(* *)
in
("+++++++++++++ Tempi della aux dentro alla acic_of_cic: "^ string_of_float (timeb -. timea)) ;
res
*)
- aux true None context idrefs t
+ aux global_computeinnertypes None context idrefs t
;;
-let acic_of_cic_context metasenv context idrefs t =
+let acic_of_cic_context ~computeinnertypes metasenv context idrefs t =
let ids_to_terms = Hashtbl.create 503 in
let ids_to_father_ids = Hashtbl.create 503 in
let ids_to_inner_sorts = Hashtbl.create 503 in
let ids_to_inner_types = Hashtbl.create 503 in
let seed = ref 0 in
- acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
+ acic_of_cic_context' ~computeinnertypes seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
ids_to_inner_types metasenv context idrefs t,
ids_to_terms, ids_to_father_ids, ids_to_inner_sorts, ids_to_inner_types
;;
let aconjecture_of_conjecture seed ids_to_terms ids_to_father_ids
ids_to_inner_sorts ids_to_inner_types ids_to_hypotheses hypotheses_seed
- metasenv (metano,context,goal) =
+ metasenv (metano,context,goal)
+=
+ let computeinnertypes = false in
let acic_of_cic_context =
acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
ids_to_inner_types metasenv in
Hashtbl.add ids_to_hypotheses hid binding ;
incr hypotheses_seed ;
match binding with
- Some (n,Cic.Def (t,None)) ->
- let acic = acic_of_cic_context context idrefs t None in
+ Some (n,Cic.Def (t,_)) ->
+ let acic = acic_of_cic_context ~computeinnertypes context idrefs t None in
(binding::context),
((hid,Some (n,Cic.ADef acic))::acontext),(hid::idrefs)
| Some (n,Cic.Decl t) ->
- let acic = acic_of_cic_context context idrefs t None in
+ let acic = acic_of_cic_context ~computeinnertypes context idrefs t None in
(binding::context),
((hid,Some (n,Cic.ADecl acic))::acontext),(hid::idrefs)
| None ->
(* Invariant: "" is never looked up *)
(None::context),((hid,None)::acontext),""::idrefs
- | Some (_,Cic.Def (_,Some _)) -> assert false
) context ([],[],[])
)
in
- let agoal = acic_of_cic_context context final_idrefs goal None in
+ let agoal = acic_of_cic_context ~computeinnertypes context final_idrefs goal None in
(metano,acontext,agoal)
;;
let ids_to_hypotheses = Hashtbl.create 23 in
let hypotheses_seed = ref 0 in
let seed = ref 1 in (* 'i0' is used for the whole sequent *)
+ let unsh_sequent =
+ let i,canonical_context,term = sequent in
+ let canonical_context' =
+ List.fold_right
+ (fun d canonical_context' ->
+ let d =
+ match d with
+ None -> None
+ | Some (n, Cic.Decl t)->
+ Some (n, Cic.Decl (Unshare.unshare t))
+ | Some (n, Cic.Def (t,None)) ->
+ Some (n, Cic.Def ((Unshare.unshare t),None))
+ | Some (n,Cic.Def (bo,Some ty)) ->
+ Some (n, Cic.Def (Unshare.unshare bo,Some (Unshare.unshare ty)))
+ in
+ d::canonical_context'
+ ) canonical_context []
+ in
+ let term' = Unshare.unshare term in
+ (i,canonical_context',term')
+ in
let (metano,acontext,agoal) =
aconjecture_of_conjecture seed ids_to_terms ids_to_father_ids
ids_to_inner_sorts ids_to_inner_types ids_to_hypotheses hypotheses_seed
- metasenv sequent in
- ("i0",metano,acontext,agoal),
- ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,ids_to_hypotheses
+ metasenv unsh_sequent in
+ (unsh_sequent,
+ (("i0",metano,acontext,agoal),
+ ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,ids_to_hypotheses))
;;
let acic_object_of_cic_object ?(eta_fix=true) obj =
C.Constant (id,Some bo,ty,params,attrs) ->
let bo' = eta_fix [] [] bo in
let ty' = eta_fix [] [] ty in
- let abo = acic_term_of_cic_term' bo' (Some ty') in
- let aty = acic_term_of_cic_term' ty' None in
+ let abo = acic_term_of_cic_term' ~computeinnertypes:true bo' (Some ty') in
+ let aty = acic_term_of_cic_term' ~computeinnertypes:false ty' None in
C.AConstant
("mettereaposto",Some "mettereaposto2",id,Some abo,aty,params,attrs)
| C.Constant (id,None,ty,params,attrs) ->
let ty' = eta_fix [] [] ty in
- let aty = acic_term_of_cic_term' ty' None in
+ let aty = acic_term_of_cic_term' ~computeinnertypes:false ty' None in
C.AConstant
("mettereaposto",None,id,None,aty,params,attrs)
| C.Variable (id,bo,ty,params,attrs) ->
None -> None
| Some bo ->
let bo' = eta_fix [] [] bo in
- Some (acic_term_of_cic_term' bo' (Some ty'))
+ Some (acic_term_of_cic_term' ~computeinnertypes:true bo' (Some ty'))
in
- let aty = acic_term_of_cic_term' ty' None in
+ let aty = acic_term_of_cic_term' ~computeinnertypes:false ty' None in
C.AVariable
("mettereaposto",id,abo,aty,params,attrs)
| C.CurrentProof (id,conjectures,bo,ty,params,attrs) ->
let canonical_context' =
List.fold_right
(fun d canonical_context' ->
- let d' =
+ let d =
match d with
None -> None
| Some (n, C.Decl t)->
| Some (_,C.Def (_,Some _)) -> assert false
in
d::canonical_context'
- ) [] canonical_context
+ ) canonical_context []
in
let term' = eta_fix conjectures canonical_context' term in
(i,canonical_context',term')
DoubleTypeInference.syntactic_equality_add_time := 0.0 ;
*)
let abo =
- acic_term_of_cic_term_context' conjectures' [] [] bo' (Some ty') in
- let aty = acic_term_of_cic_term_context' conjectures' [] [] ty' None in
+ acic_term_of_cic_term_context' ~computeinnertypes:true conjectures' [] [] bo' (Some ty') in
+ let aty = acic_term_of_cic_term_context' ~computeinnertypes:false conjectures' [] [] ty' None in
(*
let time3 = Sys.time () in
prerr_endline
List.map (fun (name,ty) -> name,Unshare.unshare ty) cl)) tys in
let context =
List.map
- (fun (name,_,arity,_) -> Some (C.Name name, C.Decl (Unshare.unshare arity))) tys in
+ (fun (name,_,arity,_) ->
+ Some (C.Name name, C.Decl (Unshare.unshare arity))) tys in
let idrefs = List.map (function _ -> gen_id seed) tys in
let atys =
List.map2
List.map
(function (name,ty) ->
(name,
- acic_term_of_cic_term_context' [] context idrefs ty None)
+ acic_term_of_cic_term_context' ~computeinnertypes:false [] context idrefs ty None)
) cons
in
- (id,name,inductive,acic_term_of_cic_term' ty None,acons)
+ (id,name,inductive,
+ acic_term_of_cic_term' ~computeinnertypes:false ty None,acons)
) (List.rev idrefs) tys
in
C.AInductiveDefinition ("mettereaposto",atys,params,paramsno,attrs)
aobj,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,ids_to_inner_types,
ids_to_conjectures,ids_to_hypotheses
;;
+
+let plain_acic_term_of_cic_term =
+ let module C = Cic in
+ let mk_fresh_id =
+ let id = ref 0 in
+ function () -> incr id; "i" ^ string_of_int !id in
+ let rec aux context t =
+ let fresh_id = mk_fresh_id () in
+ match t with
+ C.Rel n ->
+ let idref,id =
+ match get_nth context n with
+ idref,(Some (C.Name s,_)) -> idref,s
+ | idref,_ -> idref,"__" ^ string_of_int n
+ in
+ C.ARel (fresh_id, idref, n, id)
+ | C.Var (uri,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map
+ (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.AVar (fresh_id,uri,exp_named_subst')
+ | C.Implicit _
+ | C.Meta _ -> assert false
+ | C.Sort s -> C.ASort (fresh_id, s)
+ | C.Cast (v,t) ->
+ C.ACast (fresh_id, aux context v, aux context t)
+ | C.Prod (n,s,t) ->
+ C.AProd
+ (fresh_id, n, aux context s,
+ aux ((fresh_id, Some (n, C.Decl s))::context) t)
+ | C.Lambda (n,s,t) ->
+ C.ALambda
+ (fresh_id,n, aux context s,
+ aux ((fresh_id, Some (n, C.Decl s))::context) t)
+ | C.LetIn (n,s,t) ->
+ C.ALetIn
+ (fresh_id, n, aux context s,
+ aux ((fresh_id, Some (n, C.Def(s,None)))::context) t)
+ | C.Appl l ->
+ C.AAppl (fresh_id, List.map (aux context) l)
+ | C.Const (uri,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map
+ (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.AConst (fresh_id, uri, exp_named_subst')
+ | C.MutInd (uri,tyno,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map
+ (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.AMutInd (fresh_id, uri, tyno, exp_named_subst')
+ | C.MutConstruct (uri,tyno,consno,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map
+ (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.AMutConstruct (fresh_id, uri, tyno, consno, exp_named_subst')
+ | C.MutCase (uri, tyno, outty, term, patterns) ->
+ C.AMutCase (fresh_id, uri, tyno, aux context outty,
+ aux context term, List.map (aux context) patterns)
+ | C.Fix (funno, funs) ->
+ let tys =
+ List.map
+ (fun (name,_,ty,_) -> mk_fresh_id (), Some (C.Name name, C.Decl ty)) funs
+ in
+ C.AFix (fresh_id, funno,
+ List.map2
+ (fun (id,_) (name, indidx, ty, bo) ->
+ (id, name, indidx, aux context ty, aux (tys@context) bo)
+ ) tys funs
+ )
+ | C.CoFix (funno, funs) ->
+ let tys =
+ List.map (fun (name,ty,_) ->
+ mk_fresh_id (),Some (C.Name name, C.Decl ty)) funs
+ in
+ C.ACoFix (fresh_id, funno,
+ List.map2
+ (fun (id,_) (name, ty, bo) ->
+ (id, name, aux context ty, aux (tys@context) bo)
+ ) tys funs
+ )
+ in
+ aux
+;;
+
+let plain_acic_object_of_cic_object obj =
+ let module C = Cic in
+ let mk_fresh_id =
+ let id = ref 0 in
+ function () -> incr id; "it" ^ string_of_int !id
+ in
+ match obj with
+ C.Constant (id,Some bo,ty,params,attrs) ->
+ let abo = plain_acic_term_of_cic_term [] bo in
+ let aty = plain_acic_term_of_cic_term [] ty in
+ C.AConstant
+ ("mettereaposto",Some "mettereaposto2",id,Some abo,aty,params,attrs)
+ | C.Constant (id,None,ty,params,attrs) ->
+ let aty = plain_acic_term_of_cic_term [] ty in
+ C.AConstant
+ ("mettereaposto",None,id,None,aty,params,attrs)
+ | C.Variable (id,bo,ty,params,attrs) ->
+ let abo =
+ match bo with
+ None -> None
+ | Some bo -> Some (plain_acic_term_of_cic_term [] bo)
+ in
+ let aty = plain_acic_term_of_cic_term [] ty in
+ C.AVariable
+ ("mettereaposto",id,abo,aty,params,attrs)
+ | C.CurrentProof _ -> assert false
+ | C.InductiveDefinition (tys,params,paramsno,attrs) ->
+ let context =
+ List.map
+ (fun (name,_,arity,_) ->
+ mk_fresh_id (), Some (C.Name name, C.Decl arity)) tys in
+ let atys =
+ List.map2
+ (fun (id,_) (name,inductive,ty,cons) ->
+ let acons =
+ List.map
+ (function (name,ty) ->
+ (name,
+ plain_acic_term_of_cic_term context ty)
+ ) cons
+ in
+ (id,name,inductive,plain_acic_term_of_cic_term [] ty,acons)
+ ) context tys
+ in
+ C.AInductiveDefinition ("mettereaposto",atys,params,paramsno,attrs)
+;;