let set_ppterm f = ppterm := f;;
-let ppterm ?(context=[]) ?(subst=[]) ?(metasenv=[]) t =
+let ppterm ~context ~subst ~metasenv t =
!ppterm ~context ~subst ~metasenv t
;;
+
+module C = NCic
+module R = NReference
+
+let trivial_pp_term ~context ~subst ~metasenv =
+ let rec aux ctx = function
+ | C.Rel m ->
+ (try List.nth ctx (m-1)
+ with Failure _ -> " -" ^ string_of_int (m - List.length context))
+ | C.Const r -> R.string_of_reference r
+ | C.Prod (name,s,t) -> "(\Pi "^name^":"^aux ctx s^"."^aux (name::ctx) t^")"
+ | C.Lambda (name,s,t) ->
+ "(\lambda "^name^":"^aux ctx s^"."^aux (name::ctx) t^")"
+ | C.LetIn (name,ty,t,b) ->
+ "(let "^name^":"^aux ctx ty^":="^aux ctx t^" in "^aux (name::ctx) b^")"
+ | C.Match (_,oty,t,pl) ->
+ " match " ^ aux ctx t ^ " return " ^ aux ctx oty ^ "[" ^
+ String.concat "|" (List.map (aux ctx) pl) ^ "]"
+ | C.Appl l -> "("^String.concat " " (List.map (aux ctx) l) ^")"
+ | C.Implicit _ -> "?"
+ | C.Meta (n,_) -> "?"^string_of_int n
+ | C.Sort C.Prop -> "Prop"
+ | C.Sort C.CProp -> "CProp"
+ | C.Sort (C.Type n) -> "Type"^string_of_int n
+ in
+ aux (List.map fst context)
+;;
+
+let ppobj = function
+ | (u,_,metasenv,subst,NCic.Fixpoint (b, fl, _)) ->
+ "let rec "^NUri.string_of_uri u^"\n"^
+ 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:[] bo) fl)
+ | (u,_,_,_,NCic.Inductive (b, _,tl, _)) -> "inductive"
+ | (u,_,_,_,NCic.Constant (_,_,_, _, _)) -> "constant"
+;;
+
+
+