let analyze_type context t =
let rec aux =
function
- Cic.Sort _ -> `Sort
+ Cic.Sort s -> `Sort s
| Cic.Prod (_,_,t) -> aux t
| _ -> `SomethingElse
in
match aux t with
- `Sort -> `Sort
+ `Sort _ as res -> res
| `SomethingElse ->
match
fst(CicTypeChecker.type_of_aux' [] context t CicUniv.oblivion_ugraph)
| (_,_) -> raise NotEnoughElements
;;
+let qualified_name_of_uri current_module_name ?(capitalize=false) uri =
+ let name =
+ if capitalize then
+ String.capitalize (UriManager.name_of_uri uri)
+ else
+ ppid (UriManager.name_of_uri uri) in
+ let buri = UriManager.buri_of_uri uri in
+ let index = String.rindex buri '/' in
+ let filename = String.sub buri (index + 1) (String.length buri - index - 1) in
+ if current_module_name = filename then
+ name
+ else
+ String.capitalize filename ^ "." ^ name
+;;
+
(* pp t l *)
(* pretty-prints a term t of cic in an environment l where l is a list of *)
(* identifier names used to resolve DeBrujin indexes. The head of l is the *)
(* name associated to the greatest DeBrujin index in t *)
-let pp ?metasenv =
+let pp current_module_name ?metasenv =
let rec pp t context =
let module C = Cic in
match t with
NotEnoughElements -> string_of_int (List.length context - n)
end
| C.Var (uri,exp_named_subst) ->
- UriManager.name_of_uri uri ^ pp_exp_named_subst exp_named_subst context
+ qualified_name_of_uri current_module_name uri ^
+ pp_exp_named_subst exp_named_subst context
| C.Meta (n,l1) ->
(match metasenv with
None ->
| C.Cast (v,t) -> pp v context
| C.Lambda (b,s,t) ->
(match analyze_type context s with
- `Sort
+ `Sort _
| `Statement -> pp t ((Some (b,Cic.Decl s))::context)
| `Type -> "(function " ^ ppname b ^ " -> " ^ pp t ((Some (b,Cic.Decl s))::context) ^ ")")
| C.LetIn (b,s,t) ->
| C.Appl li ->
"(" ^ String.concat " " (clean_args context li) ^ ")"
| C.Const (uri,exp_named_subst) ->
- ppid (UriManager.name_of_uri uri) ^ pp_exp_named_subst exp_named_subst context
+ qualified_name_of_uri current_module_name uri ^
+ pp_exp_named_subst exp_named_subst context
| C.MutInd (uri,n,exp_named_subst) ->
(try
match fst(CicEnvironment.get_obj CicUniv.empty_ugraph uri) with
C.InductiveDefinition (dl,_,_,_) ->
let (name,_,_,_) = get_nth dl (n+1) in
- ppid name ^ pp_exp_named_subst exp_named_subst context
+ qualified_name_of_uri current_module_name
+ (UriManager.uri_of_string
+ (UriManager.buri_of_uri uri ^ "/" ^ name ^ ".con")) ^
+ pp_exp_named_subst exp_named_subst context
| _ -> raise CicExportationInternalError
with
Sys.Break as exn -> raise exn
(try
match fst(CicEnvironment.get_obj CicUniv.empty_ugraph uri) with
C.InductiveDefinition (dl,_,_,_) ->
- let (_,_,_,cons) = get_nth dl (n1+1) in
- let (id,_) = get_nth cons n2 in
- String.capitalize id ^ pp_exp_named_subst exp_named_subst context
+ let _,_,_,cons = get_nth dl (n1+1) in
+ let id,_ = get_nth cons n2 in
+ qualified_name_of_uri current_module_name ~capitalize:true
+ (UriManager.uri_of_string
+ (UriManager.buri_of_uri uri ^ "/" ^ id ^ ".con")) ^
+ pp_exp_named_subst exp_named_subst context
| _ -> raise CicExportationInternalError
with
Sys.Break as exn -> raise exn
| C.Prod (_,_,bo) -> 1 + count_prods 0 bo
| _ -> 0
in
- String.capitalize id, count_prods paramsno ty
+ qualified_name_of_uri current_module_name ~capitalize:true
+ (UriManager.uri_of_string
+ (UriManager.buri_of_uri uri ^ "/" ^ id ^ ".con")),
+ count_prods paramsno ty
) cons
| _ -> raise CicExportationInternalError
)
(* ppinductiveType (typename, inductive, arity, cons) *)
(* pretty-prints a single inductive definition *)
(* (typename, inductive, arity, cons) *)
-let ppinductiveType (typename, inductive, arity, cons) =
+let ppinductiveType current_module_name (typename, inductive, arity, cons) =
let abstr,scons =
List.fold_right
(fun (id,ty) (abstr,i) ->
function
Cic.Prod (n,s,t) ->
(match analyze_type context s with
- `Statement
- | `Sort ->
+ `Sort Cic.Prop -> args ((Some (n,Cic.Decl s))::context) t
+ | `Statement
+ | `Sort _ ->
let n =
match n with
Cic.Anonymous -> Cic.Anonymous
args
| `Type ->
let abstr,args = args ((Some (n,Cic.Decl s))::context) t in
- abstr,pp s context::args)
+ abstr,pp current_module_name s context::args)
| _ -> [],[]
in
let abstr',sargs = args [] ty in
"type " ^ abstr ^ typename ^ " =\n" ^ scons
;;
-(* ppobj obj returns a string with describing the cic object obj in a syntax *)
-(* similar to the one used by Coq *)
-let ppobj obj =
+let ppobj current_module_name obj =
let module C = Cic in
let module U = UriManager in
+ let pp = pp current_module_name in
match obj with
C.Constant (name, Some t1, t2, params, _) ->
(match analyze_type [] t2 with
- `Statement -> ""
+ `Sort Cic.Prop
+ | `Statement -> ""
| `Type
- | `Sort -> "let " ^ ppid name ^ " =\n" ^ pp t1 [] ^ "\n")
+ | `Sort _ -> "let " ^ ppid name ^ " =\n" ^ pp t1 [] ^ "\n")
| C.Constant (name, None, ty, params, _) ->
(match analyze_type [] ty with
- `Statement -> ""
- | `Sort -> "type " ^ ppid name ^ "\n"
+ `Sort Cic.Prop
+ | `Statement -> ""
+ | `Sort _ -> "type " ^ ppid name ^ "\n"
| `Type -> "let " ^ ppid name ^ " = assert false\n")
| C.Variable (name, bo, ty, params, _) ->
"Variable " ^ name ^
"\n" ^ pp ~metasenv:conjectures value [] ^ " : " ^
pp ~metasenv:conjectures ty []
| C.InductiveDefinition (l, params, nparams, _) ->
- List.fold_right (fun x i -> ppinductiveType x ^ i) l "\n"
+ List.fold_right
+ (fun x i -> ppinductiveType current_module_name x ^ i) l "\n"
;;
-let ppobj obj =
- let res = ppobj obj in
+let ppobj current_module_name obj =
+ let res = ppobj current_module_name obj in
if res = "" then "" else res ^ ";;\n"
;;