let ppid =
let reserved =
[ "to";
- "mod"
+ "mod";
+ "val"
]
in
function n ->
| (_,_) -> raise NotEnoughElements
;;
-let qualified_name_of_uri current_module_name ?(capitalize=false) uri =
+let qualified_name_of_uri current_module_uri ?(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
+ let filename =
+ let suri = UriManager.buri_of_uri uri in
+ let s = String.sub suri 5 (String.length suri - 5) in
+ let s = Pcre.replace ~pat:"/" ~templ:"_" s in
+ String.uncapitalize s in
+ if current_module_uri = UriManager.buri_of_uri uri then
name
else
String.capitalize filename ^ "." ^ name
(* 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 current_module_name ?metasenv =
+let pp current_module_uri ?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) ->
- qualified_name_of_uri current_module_name uri ^
+ qualified_name_of_uri current_module_uri uri ^
pp_exp_named_subst exp_named_subst context
| C.Meta (n,l1) ->
(match metasenv with
| C.Implicit _ -> "?"
| C.Prod (b,s,t) ->
(match b with
- C.Name n -> "(\\forall " ^ n ^ ":" ^ pp s context ^ "." ^ pp t ((Some (b,Cic.Decl s))::context) ^ ")"
- | C.Anonymous -> "(" ^ pp s context ^ "\\to " ^ pp t ((Some (b,Cic.Decl s))::context) ^ ")"
+ C.Name n ->
+ let n = "'" ^ String.uncapitalize n in
+ "(" ^ pp s context ^ " -> " ^ pp t ((Some (Cic.Name n,Cic.Decl s))::context) ^ ")"
+ | C.Anonymous -> "(" ^ pp s context ^ " -> " ^ pp t ((Some (b,Cic.Decl s))::context) ^ ")"
)
| C.Cast (v,t) -> pp v context
| C.Lambda (b,s,t) ->
| C.LetIn (b,s,t) ->
let ty,_ = CicTypeChecker.type_of_aux' [] context t CicUniv.oblivion_ugraph in
"(let " ^ ppname b ^ " = " ^ pp s context ^ " in " ^ pp t ((Some (b,Cic.Def (s,Some ty)))::context) ^ ")"
- | C.Appl (C.MutConstruct _ as he::tl) ->
+ | C.Appl (C.MutInd _ as he::tl) ->
let hes = pp he context in
- let stl = String.concat "," (clean_args context tl) in
+ let stl = String.concat "," (clean_args_for_ty context tl) in
+ (if stl = "" then "" else "(" ^ stl ^ ") ") ^ hes
+ | C.Appl (C.MutConstruct (uri,n,_,_) as he::tl) ->
+ let nparams =
+ match fst(CicEnvironment.get_obj CicUniv.empty_ugraph uri) with
+ C.InductiveDefinition (_,_,nparams,_) -> nparams
+ | _ -> assert false in
+ let hes = pp he context in
+ let stl = String.concat "," (clean_args nparams context tl) in
"(" ^ hes ^ (if stl = "" then "" else "(" ^ stl ^ ")") ^ ")"
| C.Appl li ->
- "(" ^ String.concat " " (clean_args context li) ^ ")"
+ "(" ^ String.concat " " (clean_args 0 context li) ^ ")"
| C.Const (uri,exp_named_subst) ->
- qualified_name_of_uri current_module_name uri ^
+ qualified_name_of_uri current_module_uri 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
- qualified_name_of_uri current_module_name
+ qualified_name_of_uri current_module_uri
(UriManager.uri_of_string
(UriManager.buri_of_uri uri ^ "/" ^ name ^ ".con")) ^
pp_exp_named_subst exp_named_subst context
C.InductiveDefinition (dl,_,_,_) ->
let _,_,_,cons = get_nth dl (n1+1) in
let id,_ = get_nth cons n2 in
- qualified_name_of_uri current_module_name ~capitalize:true
+ qualified_name_of_uri current_module_uri ~capitalize:true
(UriManager.uri_of_string
(UriManager.buri_of_uri uri ^ "/" ^ id ^ ".con")) ^
pp_exp_named_subst exp_named_subst context
string_of_int n2
)
| C.MutCase (uri,n1,ty,te,patterns) ->
+ let paramsno =
+ match fst(CicEnvironment.get_obj CicUniv.empty_ugraph uri) with
+ C.InductiveDefinition (_,_,paramsno,_) -> paramsno
+ | _ -> assert false in
(match analyze_term context te with
`Type -> assert false
| `Proof ->
| C.Prod (_,_,bo) -> 1 + count_prods 0 bo
| _ -> 0
in
- qualified_name_of_uri current_module_name
+ qualified_name_of_uri current_module_uri
~capitalize:true
(UriManager.uri_of_string
(UriManager.buri_of_uri uri ^ "/" ^ id ^ ".con")),
let rec combine =
function
[],[] -> []
- | [],l -> List.map (fun x -> "???",0,Some x) l
- | l,[] -> List.map (fun (x,no) -> x,no,None) l
- | (x,no)::tlx,y::tly -> (x,no,Some y)::(combine (tlx,tly))
+ | (x,no)::tlx,y::tly -> (x,no,y)::(combine (tlx,tly))
+ | _,_ -> assert false
in
combine (connames_and_argsno,patterns)
in
- "\n(match " ^ pp te context ^ " with \n" ^
+ "\n(match " ^ pp te context ^ " with \n " ^
(String.concat "\n | "
(List.map
(fun (x,argsno,y) ->
aux (argsno - 1) (Some (name,Cic.Decl ty)::context)
bo
in
- (match name with C.Anonymous -> "_" | C.Name s -> s)
- ::args,
- res
+ (match analyze_type context ty with
+ `Statement
+ | `Sort _ -> args,res
+ | `Type ->
+ (match name with
+ C.Anonymous -> "_"
+ | C.Name s -> s)::args,res)
| t when argsno = 0 -> [],pp t context
| t ->
["{" ^ string_of_int argsno ^ " args missing}"],
pp t context
in
let pattern,body =
- match y with
- None -> x,""
- | Some y when argsno = 0 -> x,pp y context
- | Some y ->
- let args,body = aux argsno context y in
- let sargs = String.concat "," args in
- x ^ (if sargs = "" then "" else "(" ^ sargs^ ")"),
- body
+ if argsno = 0 then x,pp y context
+ else
+ let args,body = aux argsno context y in
+ let sargs = String.concat "," args in
+ x ^ (if sargs = "" then "" else "(" ^ sargs^ ")"),
+ body
in
pattern ^ " -> " ^ body
) connames_and_argsno_and_patterns)) ^
(function (name,_,ty,_) ->
Some (C.Name name,Cic.Decl ty)) funs)
in
- "\nlet rec " ^
+ "let rec " ^
List.fold_right
(fun (name,ind,ty,bo) i -> name ^ " = \n" ^
pp bo (names@context) ^ i)
" in " ^
(match get_nth names (no + 1) with
Some (Cic.Name n,_) -> n
- | _ -> assert false) ^ "\n"
+ | _ -> assert false)
| C.CoFix (no,funs) ->
let names =
List.rev
(function (uri,t) -> UriManager.name_of_uri uri ^ " \\Assign " ^ pp t context)
exp_named_subst
) ^ "]"
-and clean_args context =
+and clean_args nparams context =
+ let nparams = ref nparams in
+ HExtlib.filter_map
+ (function t ->
+ decr nparams;
+ match analyze_term context t with
+ `Term when !nparams < 0 -> Some pp t context
+ | `Term
+ | `Type
+ | `Proof -> None)
+and clean_args_for_ty context =
HExtlib.filter_map
(function t ->
match analyze_term context t with
- `Type -> None
+ `Type -> Some pp t context
| `Proof -> None
- | `Term -> Some pp t context)
+ | `Term -> None)
in
pp
;;
-let ppty current_module_name =
- let rec args context =
+let ppty current_module_uri =
+ (* nparams is the number of left arguments
+ left arguments should either become parameters or be skipped altogether *)
+ let rec args nparams context =
function
Cic.Prod (n,s,t) ->
+ let n =
+ match n with
+ Cic.Anonymous -> Cic.Anonymous
+ | Cic.Name n -> Cic.Name (String.uncapitalize n)
+ in
(match analyze_type context s with
- `Sort Cic.Prop -> args ((Some (n,Cic.Decl s))::context) t
- | `Statement
+ `Statement
+ | `Sort Cic.Prop ->
+ args (nparams - 1) ((Some (n,Cic.Decl s))::context) t
+ | `Type when nparams > 0 ->
+ args (nparams - 1) ((Some (n,Cic.Decl s))::context) t
+ | `Type ->
+ let abstr,args =
+ args (nparams - 1) ((Some (n,Cic.Decl s))::context) t in
+ abstr,pp current_module_uri s context::args
| `Sort _ ->
let n =
match n with
Cic.Anonymous -> Cic.Anonymous
| Cic.Name name -> Cic.Name ("'" ^ name) in
- let abstr,args = args ((Some (n,Cic.Decl s))::context) t in
+ let abstr,args =
+ args (nparams - 1) ((Some (n,Cic.Decl s))::context) t
+ in
(match n with
Cic.Anonymous -> abstr
| Cic.Name name -> name::abstr),
- args
- | `Type ->
- let abstr,args = args ((Some (n,Cic.Decl s))::context) t in
- abstr,pp current_module_name s context::args)
+ args)
| _ -> [],[]
in
args
(* ppinductiveType (typename, inductive, arity, cons) *)
(* pretty-prints a single inductive definition *)
(* (typename, inductive, arity, cons) *)
-let ppinductiveType current_module_name (typename, inductive, arity, cons) =
+let ppinductiveType current_module_uri nparams (typename, inductive, arity, cons)
+=
match analyze_type [] arity with
`Sort Cic.Prop -> ""
| `Statement
else (
let abstr,scons =
List.fold_right
- (fun (id,ty) (abstr,i) ->
- let abstr',sargs = ppty current_module_name [] ty in
+ (fun (id,ty) (_abstr,i) -> (* we should verify _abstr = abstr' *)
+ let abstr',sargs = ppty current_module_uri nparams [] ty in
let sargs = String.concat " * " sargs in
- abstr'@abstr,
+ abstr',
String.capitalize id ^
(if sargs = "" then "" else " of " ^ sargs) ^
(if i = "" then "" else "\n | ") ^ i)
"type " ^ abstr ^ String.uncapitalize typename ^ " =\n" ^ scons ^ "\n")
;;
-let ppobj current_module_name obj =
+let ppobj current_module_uri obj =
let module C = Cic in
let module U = UriManager in
- let pp = pp current_module_name in
+ let pp = pp current_module_uri in
match obj with
C.Constant (name, Some t1, t2, params, _) ->
(match analyze_type [] t2 with
match analyze_type [] t1 with
`Sort Cic.Prop -> ""
| _ ->
- let abstr,args = ppty current_module_name [] t1 in
+ let abstr,args = ppty current_module_uri 0 [] t1 in
let abstr =
let s = String.concat "," abstr in
if s = "" then "" else "(" ^ s ^ ") "
pp ~metasenv:conjectures ty []
| C.InductiveDefinition (l, params, nparams, _) ->
List.fold_right
- (fun x i -> ppinductiveType current_module_name x ^ i) l ""
+ (fun x i -> ppinductiveType current_module_uri nparams x ^ i) l ""
;;
-let ppobj current_module_name obj =
- let res = ppobj current_module_name obj in
+let ppobj current_module_uri obj =
+ let res = ppobj current_module_uri obj in
if res = "" then "" else res ^ ";;\n\n"
;;