let rec aux =
function
Cic.Sort s -> `Sort s
- | Cic.Prod (_,_,t)
- | Cic.Lambda (_,_,t) -> aux t
+ | Cic.Prod (_,_,t) -> aux t
| _ -> `SomethingElse
in
match aux t with
let reserved =
[ "to";
"mod";
- "val"
+ "val";
+ "in";
+ "function"
]
in
function n ->
"(function " ^ ppname b ^ " -> " ^
pp ~in_type t ((Some (b,Cic.Decl s))::context) ^ ")")
| C.LetIn (b,s,t) ->
- let ty,_ = CicTypeChecker.type_of_aux' [] context s CicUniv.oblivion_ugraph in
- "(let " ^ ppname b ^ " = " ^ pp ~in_type:false s context ^ " in " ^
- pp ~in_type t ((Some (b,Cic.Def (s,Some ty)))::context) ^ ")"
+ (match analyze_term context s with
+ `Type
+ | `Proof ->
+ let ty,_ =
+ CicTypeChecker.type_of_aux' [] context s CicUniv.oblivion_ugraph
+ in
+ pp ~in_type t ((Some (b,Cic.Def (s,Some ty)))::context)
+ | `Term ->
+ let ty,_ =
+ CicTypeChecker.type_of_aux' [] context s CicUniv.oblivion_ugraph
+ in
+ "(let " ^ ppname b ^ " = " ^ pp ~in_type:false s context ^ " in " ^
+ pp ~in_type t ((Some (b,Cic.Def (s,Some ty)))::context) ^ ")")
+ | C.Appl (he::tl) when in_type ->
+ let hes = pp ~in_type he context in
+ let stl = String.concat "," (clean_args_for_ty context tl) in
+ (if stl = "" then "" else "(" ^ stl ^ ") ") ^ hes
| C.Appl (C.MutInd _ as he::tl) ->
let hes = pp ~in_type he context in
let stl = String.concat "," (clean_args_for_ty context tl) in
) connames_and_argsno_and_patterns)) ^
")\n")))
| C.Fix (no, funs) ->
- let names =
- List.rev
- (List.map
- (function (name,_,ty,_) ->
- Some (C.Name name,Cic.Decl ty)) funs)
+ let names,_ =
+ List.fold_left
+ (fun (types,len) (n,_,ty,_) ->
+ (Some (C.Name n,(C.Decl (CicSubstitution.lift len ty)))::types,
+ len+1)
+ ) ([],0) funs
in
"let rec " ^
List.fold_right
Some (Cic.Name n,_) -> n
| _ -> assert false)
| C.CoFix (no,funs) ->
- let names =
- List.rev
- (List.map
- (function (name,ty,_) ->
- Some (C.Name name,Cic.Decl ty)) funs)
+ let names,_ =
+ List.fold_left
+ (fun (types,len) (n,ty,_) ->
+ (Some (C.Name n,(C.Decl (CicSubstitution.lift len ty)))::types,
+ len+1)
+ ) ([],0) funs
in
"\nCoFix " ^ " {" ^
List.fold_right
let abstr,args =
args (nparams - 1) ((Some (n,Cic.Decl s))::context) t in
abstr,pp ~in_type:true current_module_uri s context::args
+ | `Sort _ when nparams <= 0 ->
+ let n = Cic.Name "unit (* EXISTENTIAL TYPE *)" in
+ args (nparams - 1) ((Some (n,Cic.Decl s))::context) t
| `Sort _ ->
let n =
match n with
args
;;
+exception DoNotExtract;;
+
+let pp_abstracted_ty current_module_uri =
+ let rec args context =
+ function
+ Cic.Lambda (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
+ `Statement
+ | `Type
+ | `Sort Cic.Prop ->
+ args ((Some (n,Cic.Decl s))::context) t
+ | `Sort _ ->
+ let n =
+ match n with
+ Cic.Anonymous -> Cic.Anonymous
+ | Cic.Name name -> Cic.Name ("'" ^ name) in
+ let abstr,res =
+ args ((Some (n,Cic.Decl s))::context) t
+ in
+ (match n with
+ Cic.Anonymous -> abstr
+ | Cic.Name name -> name::abstr),
+ res)
+ | ty ->
+ match analyze_type context ty with
+ ` Sort _
+ | `Statement -> raise DoNotExtract
+ | `Type ->
+ (* BUG HERE: this can be a real System F type *)
+ let head = pp ~in_type:true current_module_uri ty context in
+ [],head
+ in
+ args
+;;
+
+
(* ppinductiveType (typename, inductive, arity, cons) *)
(* pretty-prints a single inductive definition *)
(* (typename, inductive, arity, cons) *)
match analyze_type [] t1 with
`Sort Cic.Prop -> ""
| _ ->
- let abstr,args = ppty current_module_uri 0 [] t1 in
- let abstr =
- let s = String.concat "," abstr in
- if s = "" then "" else "(" ^ s ^ ") "
- in
- "type " ^ abstr ^ ppid name ^ " = " ^ String.concat "->" args ^
- "\n")
+ (try
+ let abstr,res = pp_abstracted_ty current_module_uri [] t1 in
+ let abstr =
+ let s = String.concat "," abstr in
+ if s = "" then "" else "(" ^ s ^ ") "
+ in
+ "type " ^ abstr ^ ppid name ^ " = " ^ res ^ "\n"
+ with
+ DoNotExtract -> ""))
| C.Constant (name, None, ty, params, _) ->
(match analyze_type [] ty with
`Sort Cic.Prop