+ aux ~toplevel:true (List.map fst context) t;
+ F.fprintf f "@?";
+ Buffer.contents buff
+;;
+
+let ppobj = function
+ | (u,_,metasenv,subst,NCic.Fixpoint (b, fl, _)) ->
+ "{"^NUri.string_of_uri u^"}\n"^
+ (if b then "let rec " else "let corec ") ^
+ String.concat "\nand "
+ (List.map (fun (_,name,n,ty,bo) ->
+ name^ " on " ^ string_of_int n ^ " : " ^
+ ppterm ~metasenv ~subst ~context:[] ty ^ " :=\n"^
+ ppterm ~metasenv ~subst ~context:[] ~inside_fix:true bo) fl)
+ | (u,_,metasenv,subst,NCic.Inductive (b, leftno,tyl, _)) ->
+ "{"^NUri.string_of_uri u^"} with "^string_of_int leftno^" fixed params\n"^
+ (if b then "inductive " else "coinductive ")^
+ String.concat "\nand "
+ (List.map (fun (_,name,ty,cl) ->
+ name^": "^ppterm ~metasenv ~subst ~context:[] ty^ " :=\n"^
+ String.concat "\n"
+ (List.map (fun (_,name,ty) ->
+ " | "^name^": "^ppterm ~metasenv ~subst ~context:[] ty)
+ cl)) tyl) ^ "."
+ | (u,_,metasenv,subst,NCic.Constant (_,name,None,ty, _)) ->
+ "{"^NUri.string_of_uri u^"}\n"^
+ "axiom " ^ name ^ " : " ^
+ ppterm ~metasenv ~subst ~context:[] ty ^ "\n"
+ | (u,_,metasenv,subst,NCic.Constant (_,name,Some bo,ty, _)) ->
+ "{"^NUri.string_of_uri u^"}\n"^
+ "definition " ^ name ^ " : " ^
+ ppterm ~metasenv ~subst ~context:[] ty ^ " := \n"^
+ ppterm ~metasenv ~subst ~context:[] bo ^ "\n"
+;;
+
+let rec ppcontext ?(sep="\n") ~subst ~metasenv = function
+ | [] -> ""
+ | (name, NCic.Decl t) :: tl ->
+ ppcontext ~sep ~subst ~metasenv tl ^
+ name ^ ": " ^ ppterm ~subst ~metasenv ~context:tl t ^ sep
+ | (name, NCic.Def (bo,ty)) :: tl->
+ ppcontext ~sep ~subst ~metasenv tl ^
+ name ^ ": " ^ ppterm ~subst ~metasenv ~context:tl ty ^
+ " := " ^ ppterm ~subst ~metasenv ~context:tl bo ^ sep
+;;
+
+let rec ppmetasenv ~subst metasenv = function
+ | [] -> ""
+ | (i,(name, ctx, ty)) :: tl ->
+ let name = match name with Some n -> "(\""^n^"\")" | _ -> "" in
+ ppcontext ~sep:"; " ~subst ~metasenv ctx ^
+ " ⊢ ?"^string_of_int i^name^" : " ^
+ ppterm ~metasenv ~subst ~context:ctx ty ^ "\n" ^
+ ppmetasenv ~subst metasenv tl
+;;
+
+let ppmetasenv ~subst metasenv = ppmetasenv ~subst metasenv metasenv;;
+
+let rec ppsubst ~subst ~metasenv = function
+ | [] -> ""
+ | (i,(name, ctx, t, ty)) :: tl ->
+
+ let name = match name with Some n -> "("^n^")" | _ -> "" in
+ ppcontext ~sep:"; " ~subst ~metasenv ctx ^
+ " ⊢ ?"^string_of_int i^name^" := " ^
+ ppterm ~metasenv ~subst ~context:ctx t ^ " : " ^
+ ppterm ~metasenv ~subst ~context:ctx ty ^ "\n" ^
+ ppsubst ~subst ~metasenv tl
+;;
+
+let ppsubst ~metasenv subst = ppsubst ~metasenv ~subst subst;;
+
+let _ = NCicSubstitution.set_ppterm ppterm;;