(************************************************************************) (* * The Rocq Prover / The Rocq Development Team *) (* v * Copyright INRIA, CNRS and contributors *) (* <O___,, * (see version control and CREDITS file for authors & dates) *) (* \VV/ **************************************************************) (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (* * (see LICENSE file for the text of the license) *) (************************************************************************)
(* Printers for the ocaml toplevel. *)
open Sorts open Util open Pp open Names open Libnames open Univ open UVars open Environ open Printer open Constr open Context open Genarg open Clenv
let with_env_evm f x = let env = Global.env() in let sigma = Evd.from_env env in
f env sigma x
(* std_ppcmds *) let pp x = Pp.pp_with !Topfmt.std_ft x
(* name printers *) let ppid id = pp (Id.print id) let pplab l = pp (Label.print l) let ppmbid mbid = pp (str (MBId.debug_to_string mbid)) let ppdir dir = pp (DirPath.print dir) let ppmp mp = pp(str (ModPath.debug_to_string mp)) let ppcon con = pp(Constant.debug_print con) let ppprojrepr con = pp(Constant.debug_print (Projection.Repr.constant con)) let ppproj p = pp(Projection.debug_print p) let ppkn kn = pp(str (KerName.to_string kn)) let ppmind kn = pp(MutInd.debug_print kn) let ppind (kn,i) = pp(MutInd.debug_print kn ++ str"," ++int i) let ppsp sp = pp(pr_path sp) let ppqualid qid = pp(pr_qualid qid) let ppscheme k = pp (Ind_tables.pr_scheme_kind k)
let pprecarg r = pp (Declareops.pr_recarg r) let ppwf_paths x = pp (Declareops.pr_wf_paths x)
let get_current_context () = try Vernacstate.Declare.get_current_context () with Vernacstate.Declare.NoCurrentProof -> let env = Global.env() in
Evd.from_env env, env
[@@ocaml.warning "-3"]
(* term printers *) let envpp pp = let sigma,env = get_current_context () in pp env sigma let ppevar evk = pp (Evar.print evk) let pr_constr t = let sigma, env = get_current_context () in
Printer.pr_constr_env env sigma t let pr_econstr t = let sigma, env = get_current_context () in
Printer.pr_econstr_env env sigma t let ppconstr x = pp (pr_constr x) let ppeconstr x = pp (pr_econstr x) let ppconstr_expr x = let sigma,env = get_current_context () in pp (Ppconstr.pr_constr_expr env sigma x) let ppconstr_univ x = Constrextern.with_universes ppconstr x let ppglob_constr = (fun x -> pp(with_env_evm pr_lglob_constr_env x)) let pppattern = (fun x -> pp(envpp pr_constr_pattern_env x)) let pptype = (fun x -> try pp(envpp (fun env evm t -> pr_ltype_env env evm t) x) with e -> pp (str (Printexc.to_string e))) let ppfconstr c = ppconstr (CClosure.term_of_fconstr c)
(* XXX we could also try to have a printer which shows which parts are shared, but this is probably better for most uses (ie stepping
through typeops and wanting to print the current constr) *) let pphconstr c = ppconstr (HConstr.self c)
let ppuint63 i = pp (str (Uint63.to_string i))
let pp_parray pr a = let a, def = Parray.to_array a in let a = Array.to_list a in
pp (str "[|" ++ prlist_with_sep (fun () -> str ";" ++ spc()) pr a ++ spc() ++ str "|" ++ spc() ++ pr def ++ str "|]")
let pp_constr_parray = pp_parray pr_constr let pp_fconstr_parray = pp_parray (fun f -> pr_constr (CClosure.term_of_fconstr f))
let ppfsubst s = let (s, k) = Esubst.Internal.repr s in let sep () = str ";" ++ spc () in let pr = function
| Esubst.Internal.REL n -> str "<#" ++ int n ++ str ">"
| Esubst.Internal.VAL (k, x) -> pr_constr (Vars.lift k (CClosure.term_of_fconstr x)) in
pp @@ str "[" ++ prlist_with_sep sep pr s ++ str "| " ++ int k ++ str "]"
let ppnumtokunsigned n = pp (NumTok.Unsigned.print n) let ppnumtokunsignednat n = pp (NumTok.UnsignedNat.print n)
let prset pr l = str "[" ++ hov 0 (prlist_with_sep spc pr l) ++ str "]" let ppintset l = pp (prset int (Int.Set.elements l)) let ppidset l = pp (prset Id.print (Id.Set.elements l))
let prset' pr l = str "[" ++ hov 0 (prlist_with_sep pr_comma pr l) ++ str "]"
let pridmap pr l = let pr (id,b) = Id.print id ++ str "=>" ++ pr id b in
prset' pr (Id.Map.fold (fun a b l -> (a,b)::l) l []) let ppidmap pr l = pp (pridmap pr l)
let prmapgen pr dom = if dom = [] then str "[]"else
str "[domain= " ++ hov 0 (prlist_with_sep spc pr dom) ++ str "]" let pridmapgen l = prmapgen Id.print (Id.Set.elements (Id.Map.domain l)) let ppidmapgen l = pp (pridmapgen l) let printmapgen l = prmapgen int (Int.Set.elements (Int.Map.domain l)) let ppintmapgen l = pp (printmapgen l)
let ppmpmapgen l =
pp (prmapgen
(fun mp -> str (ModPath.debug_to_string mp))
(MPset.elements (MPmap.domain l)))
let ppdpmapgen l =
pp (prmapgen
(fun mp -> str (DirPath.to_string mp))
(DPset.elements (DPmap.domain l)))
let ppconmapenvgen l =
pp (prmapgen
(fun mp -> str (Constant.debug_to_string mp))
(Cset_env.elements (Cmap_env.domain l)))
let ppmindmapenvgen l =
pp (prmapgen
(fun mp -> str (MutInd.debug_to_string mp))
(Mindmap_env.Set.elements (Mindmap_env.domain l)))
let ppevarsubst = ppidmap (fun id0 -> prset (fun (c,copt,id) ->
hov 0
(pr_constr c ++
(match copt with None -> mt () | Some c -> spc () ++ str " ++
pr_constr c ++ str">") ++
(if id = id0 then mt () else spc () ++ str " ++ Id.print id ++ str ">"))))
let prididmap = pridmap (fun _ -> Id.print) let ppididmap = ppidmap (fun _ -> Id.print)
let prconstrunderbindersidmap = pridmap (fun _ (l,c) ->
hov 1 (str"[" ++ prlist_with_sep spc Id.print l ++ str"]")
++ str "," ++ spc () ++ pr_econstr c)
let ppconstrunderbindersidmap l = pp (prconstrunderbindersidmap l)
let ppunbound_ltac_var_map l = ppidmap (fun _ arg ->
str" ++ pr_argument_type(genarg_tag arg) ++ str">") l
open Ltac_pretype let rec pr_closure {idents=idents;typed=typed;untyped=untyped} =
hov 1 (str"{idents=" ++ prididmap idents ++ str";" ++ spc() ++
str"typed=" ++ prconstrunderbindersidmap typed ++ str";" ++ spc() ++
str"untyped=" ++ pr_closed_glob_constr_idmap untyped ++ str"}") and pr_closed_glob_constr_idmap x =
pridmap (fun _ -> pr_closed_glob_constr) x and pr_closed_glob_constr {closure=closure;term=term} =
pr_closure closure ++ with_env_evm pr_lglob_constr_env term
let ppclosure x = pp (pr_closure x) let ppclosedglobconstr x = pp (pr_closed_glob_constr x) let ppclosedglobconstridmap x = pp (pr_closed_glob_constr_idmap x)
let pP s = pp (hov 0 s)
let pp_as_format s = let fmt, args = pp_as_format s in let pr_escaped s = str ("\"" ^ String.escaped s ^ "\"") in
pp
(hov 0
(str "printf" ++ spc() ++ str "\"" ++ str fmt ++ str "\"" ++
pr_non_empty_arg (prlist_with_sep spc pr_escaped) args))
let safe_pr_global = letopen GlobRef in function
| ConstRef kn -> pp (str "CONSTREF(" ++ Constant.debug_print kn ++ str ")")
| IndRef (kn,i) -> pp (str "INDREF(" ++ MutInd.debug_print kn ++ str "," ++
int i ++ str ")")
| ConstructRef ((kn,i),j) -> pp (str "CONSTRUCTREF(" ++ MutInd.debug_print kn ++ str "," ++
int i ++ str "," ++ int j ++ str ")")
| VarRef id -> pp (str "VARREF(" ++ Id.print id ++ str ")")
let ppglobal x = try pp(pr_global x) with _ -> safe_pr_global x
let ppvar ((id,a)) =
pp (str"#" ++ Id.print id ++ str":" ++ envpp pr_lconstr_env a)
let genppj f j = let (c,t) = f j in (c ++ str " : " ++ t)
let ppj j = pp (genppj (envpp pr_ljudge_env) j)
let ppsubst s = pp (Mod_subst.debug_pr_subst s) let ppdelta s = pp (Mod_subst.debug_pr_delta s)
let pp_idpred s = pp (pr_idpred s) let pp_cpred s = pp (pr_cpred s) let pp_transparent_state s = pp (pr_transparent_state s) let pp_estack_t n = pp (Reductionops.Stack.pr pr_econstr n) let pp_state_t n = pp (Reductionops.pr_state Global.(env()) Evd.empty n)
(* proof printers *) let pr_evar ev = Pp.int (Evar.repr ev) let ppmetas metas = pp (Unification.Meta.pr_metaset metas) let ppmetamap metas = let env = Global.env () in let sigma = Evd.from_env env in
pp (Unification.Meta.pr_metamap env sigma metas) let ppevm evd = pp(Termops.pr_evar_map ~with_univs:!Detyping.print_universes (Some 2) (Global.env ()) evd) let ppevmall evd = pp(Termops.pr_evar_map ~with_univs:!Detyping.print_universes None (Global.env ()) evd) let pr_existentialset evars =
prlist_with_sep spc pr_evar (Evar.Set.elements evars) let ppexistentialset evars =
pp (pr_existentialset evars) let ppexistentialfilter filter = match Evd.Filter.repr filterwith
| None -> pp (Pp.str "ø")
| Some f -> pp (prlist_with_sep spc bool f) let pr_goal e = Pp.(str "GOAL:" ++ int (Evar.repr e)) let ppclenv clenv = pp(pr_clenv clenv) let ppgoal g = pp(Printer.Debug.pr_goal g) let ppgoal_with_state g = ppevar (Proofview_monad.drop_state g) let pphintdb db = pp(envpp Hints.pr_hint_db_env db) let ppproofview p = let gls,sigma = Proofview.proofview p in
pp(pr_enum pr_goal gls ++ fnl () ++ Termops.pr_evar_map (Some 1) (Global.env ()) sigma)
let ppseff seff = pp (Safe_typing.debug_print_private_constants seff)
let ppopenconstr (x : Evd.open_constr) = let (evd,c) = x in pp (Termops.pr_evar_map (Some 2) (Global.env ()) evd ++ envpp pr_econstr_env c) (* spiwack: deactivated until a replacement is found let pppftreestate p = pp(print_pftreestate p)
*)
(* let ppgoal g = pp(db_pr_goal g) *) (* let pr_gls gls = *) (* hov 0 (pr_evar_defs (sig_sig gls) ++ fnl () ++ db_pr_goal (sig_it gls)) *)
(* let ppsigmagoal g = pp(pr_goal (sig_it g)) *) (* let prgls gls = pp(pr_gls gls) *) (* let prglls glls = pp(pr_glls glls) *)
let pproof p = pp(Proof.pr_proof p)
let ppuni u = pp(Universe.raw_pr u) let ppuni_level u = pp (Level.raw_pr u) let ppqvar q = pp (QVar.raw_pr q) let ppesorts s = pp (Sorts.debug_print (Evd.MiniEConstr.ESorts.unsafe_to_sorts s))
(* pprelevance not directly useful since it's transparent, but used for pperelevance *) let pprelevance (r:Sorts.relevance) = match r with
| Relevant -> pp (str "Relevant")
| Irrelevant -> pp (str "Irrelevant")
| RelevanceVar q -> pp (surround (str "RelevanceVar " ++ spc() ++ Sorts.QVar.raw_pr q)) let pperelevance r = pprelevance (EConstr.Unsafe.to_relevance r)
let prlev l = UnivNames.pr_level_with_global_universes l let prqvar q = UnivNames.pr_quality_with_global_universes q let ppqvarset l = pp (hov 1 (str "{" ++ prlist_with_sep spc prqvar (QVar.Set.elements l) ++ str "}")) let ppuniverse_set l = pp (Level.Set.pr prlev l) let ppuniverse_instance l = pp (Instance.pr prqvar prlev l) let ppuniverse_context l = pp (pr_universe_context prqvar prlev l) let ppuniverse_context_set l = pp (ContextSet.pr prlev l) let ppuniverse_subst l = pp (UnivSubst.pr_universe_subst Level.raw_pr l) let ppuniverse_opt_subst l = pp (UnivFlex.pr Level.raw_pr l) let ppqvar_subst l = pp (UVars.pr_quality_level_subst QVar.raw_pr l) let ppuniverse_level_subst l = pp (Univ.pr_universe_level_subst Level.raw_pr l) let ppustate l = pp (UState.pr l) let ppconstraints c = pp (Constraints.pr Level.raw_pr c) let ppuniverseconstraints c = pp (UnivProblem.Set.pr c) let ppuniverse_context_future c = let ctx = Future.force c in
ppuniverse_context ctx let ppuniverses u = pp (UGraph.pr_universes Level.raw_pr (UGraph.repr u)) let ppnamedcontextval e = let env = Global.env () in let sigma = Evd.from_env env in
pp (pr_named_context env sigma (named_context_of_val e))
let ppaucontext auctx = let {quals = qnas; univs = unas} = AbstractContext.names auctx in let prgen pr var_index nas l = match var_index l with
| Some n -> (match nas.(n) with
| Anonymous -> pr l
| Name id -> Id.print id)
| None -> pr l in let prqvar l = prgen prqvar Sorts.QVar.var_index qnas l in let prlev l = prgen prlev Level.var_index unas l in
pp (pr_universe_context prqvar prlev (AbstractContext.repr auctx))
let pp_partialfsubst psubst =
pp (Partial_subst.pr (fun f -> pr_constr (CClosure.term_of_fconstr f)) (Quality.pr prqvar) (Universe.pr prlev) psubst)
and level_display u =
incr cnt; pp (str "with " ++ int !cnt ++ str" " ++ Level.raw_pr u ++ fnl ())
and sort_display = function
| SProp -> "SProp"
| Set -> "Set"
| Prop -> "Prop"
| Type u -> univ_display u; "Type("^(string_of_int !cnt)^")"
| QSort (q, u) -> univ_display u; Printf.sprintf "QSort(%s, %i)" (Sorts.QVar.to_string q) !cnt
and universes_display l = let qs, us = Instance.to_array l in let qs = Array.fold_right (fun x i ->
quality_display x;
(string_of_int !cnt)^
(ifnot(i="") then (" "^i) else""))
qs "" in
Array.fold_right (fun x i -> level_display x; (string_of_int !cnt)^(ifnot(i="") then (" "^i) else"")) us (if qs = ""then""else (qs^" | "))
and name_display x = match x.binder_name with
| Name id -> "Name("^(Id.to_string id)^")"
| Anonymous -> "Anonymous"
in
pp (str (term_display csr) ++fnl ())
let econstr_display c = constr_display EConstr.Unsafe.(to_constr c) ;;
and box_display c = open_hovbox 1; term_display c; close_box()
and universes_display u = let qs, us = Instance.to_array u in
Array.iter (fun u -> print_space (); pp (Sorts.Quality.raw_pr u)) qs;
Array.iter (fun u -> print_space (); pp (Level.raw_pr u)) us
and name_display x = match x.binder_name with
| Name id -> print_string (Id.to_string id)
| Anonymous -> print_string "_" (* Remove the top names for library and Scratch to avoid long names *) and sp_display sp = (* let dir,l = decode_kn sp in let ls = match List.rev_map Id.to_string (DirPath.repr dir) with ("Top"::l)-> l | ("Stdlib"::_::l) -> l | l -> l
in List.iter (fun x -> print_string x; print_string ".") ls;*)
print_string (MutInd.debug_to_string sp) and sp_con_display sp = (* let dir,l = decode_kn sp in let ls = match List.rev_map Id.to_string (DirPath.repr dir) with ("Top"::l)-> l | ("Stdlib"::_::l) -> l | l -> l
in List.iter (fun x -> print_string x; print_string ".") ls;*)
print_string (Constant.debug_to_string sp) and sp_prj_display sp =
print_string (Projection.debug_to_string sp) in try
box_display csr; print_flush() with e ->
print_string (Printexc.to_string e);print_flush (); raise e
let print_pure_econstr c = print_pure_constr EConstr.Unsafe.(to_constr c) ;;
let pploc x = let (l,r) = Loc.unloc x in
print_string"(";print_int l;print_string",";print_int r;print_string")"
let pp_argument_type t = pp (pr_argument_type t)
let pp_generic_argument arg =
pp(str"++pr_argument_type(genarg_tag arg)++str">")
let prgenarginfo arg = let Geninterp.Val.Dyn (tag, _) = arg in let tpe = Geninterp.Val.pr tag in (* FIXME *) (* try *) (* let data = Pptactic.pr_top_generic (Global.env ()) arg in *) (* str "<genarg:" ++ tpe ++ str " := [ " ++ data ++ str " ] >" *) (* with _any -> *)
str " ++ tpe ++ str ">"
let ppgenarginfo arg = pp (prgenarginfo arg)
let ppgenargargt arg = pp (str (Genarg.ArgT.repr arg))
let ppist ist = let pr id arg = prgenarginfo arg in
pp (pridmap pr ist.Geninterp.lfun)
let in_current_context f c = let (evmap,sign) = get_current_context () in
f (fst (Constrintern.interp_constr sign evmap c))(*FIXME*)
(* We expand the result of preprocessing to be independent of camlp5
VERNAC COMMAND EXTEND PrintPureConstr | [ "PrintPureConstr" constr(c) ] -> [ in_current_context print_pure_constr c ] END VERNAC COMMAND EXTEND PrintConstr [ "PrintConstr" constr(c) ] -> [ in_current_context constr_display c ] END
*)
let () = letopen Vernacextend in letopen Vernactypes in let ty_constr = Extend.TUentry (get_arg_tag Stdarg.wit_constr) in let cmd_sig = TyTerminal("PrintConstr", TyNonTerminal(ty_constr, TyNil)) in let cmd_fn c ?loc:_ ~atts () = vtdefault (fun () -> in_current_context econstr_display c) in let cmd_class _ ~atts:_ = VtQuery in let cmd : ty_ml = TyML (false, cmd_sig, cmd_fn, Some cmd_class) in
static_vernac_extend ~plugin:None ~command:"PrintConstr" [cmd]
let () = letopen Vernacextend in letopen Vernactypes in let ty_constr = Extend.TUentry (get_arg_tag Stdarg.wit_constr) in let cmd_sig = TyTerminal("PrintPureConstr", TyNonTerminal(ty_constr, TyNil)) in let cmd_fn c ?loc:_ ~atts () = vtdefault (fun () -> in_current_context print_pure_econstr c) in let cmd_class _ ~atts:_ = VtQuery in let cmd : ty_ml = TyML (false, cmd_sig, cmd_fn, Some cmd_class) in
static_vernac_extend ~plugin:None ~command:"PrintPureConstr" [cmd]
(* Setting printer of unbound global reference *) open Names open Libnames
let encode_path ?loc prefix mpdir suffix id = let dir = match mpdir with
| None -> []
| Some mp -> DirPath.repr (dirpath_of_string (ModPath.to_string mp)) in
make_qualid ?loc
(DirPath.make (List.rev (Id.of_string prefix::dir@suffix))) id
let raw_string_of_ref ?loc _ = letopen GlobRef in function
| ConstRef cst -> let (mp,id) = KerName.repr (Constant.user cst) in
encode_path ?loc "CST" (Some mp) [] (Label.to_id id)
| IndRef (kn,i) -> let (mp,id) = KerName.repr (MutInd.user kn) in
encode_path ?loc "IND" (Some mp) [Label.to_id id]
(Id.of_string ("_"^string_of_int i))
| ConstructRef ((kn,i),j) -> let (mp,id) = KerName.repr (MutInd.user kn) in
encode_path ?loc "CSTR" (Some mp)
[Label.to_id id;Id.of_string ("_"^string_of_int i)]
(Id.of_string ("_"^string_of_int j))
| VarRef id ->
encode_path ?loc "SECVAR" None [] id
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.17Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.