| Ast.Binder (`Pi, (Ast.Ident ("_", None), typ), body) ->
sprintf "%s \\to %s"
(match typ with None -> "?" | Some typ -> pp_term typ)
- (pp_term body)
+ (pp_term ~pp_parens:true body)
| Ast.Binder (kind, var, body) ->
sprintf "\\%s %s.%s" (pp_binder kind) (pp_capture_variable var)
- (pp_term body)
+ (pp_term ~pp_parens:true body)
| Ast.Case (term, indtype, typ, patterns) ->
- sprintf "%smatch %s%s with %s"
- (match typ with None -> "" | Some t -> sprintf "[%s]" (pp_term t))
+ sprintf "match %s%s%s with %s"
(pp_term term)
(match indtype with
| None -> ""
(match debug_printing, href_opt with
| true, Some uri ->
sprintf "(i.e.%s)" (UriManager.string_of_uri uri)
- | _ -> ""))
+ | _ -> ""))
+ (match typ with None -> "" | Some t -> sprintf " return %s" (pp_term t))
(pp_patterns patterns)
- | Ast.Cast (t1, t2) -> sprintf "(%s: %s)" (pp_term t1) (pp_term t2)
+ | Ast.Cast (t1, t2) -> sprintf "(%s: %s)" (pp_term ~pp_parens:true t1) (pp_term ~pp_parens:true t2)
| Ast.LetIn (var, t1, t2) ->
- sprintf "let %s = %s in %s" (pp_capture_variable var) (pp_term t1)
- (pp_term t2)
+ sprintf "let %s \\def %s in %s" (pp_capture_variable var) (pp_term ~pp_parens:true t1)
+ (pp_term ~pp_parens:true t2)
| Ast.LetRec (kind, definitions, term) ->
- sprintf "let %s %s in %s"
+ let rec get_guard i = function
+ | [] -> (*assert false*) Ast.Implicit
+ | [term, _] when i = 1 -> term
+ | _ :: tl -> get_guard (pred i) tl
+ in
+ let map (params, (id,typ), body, i) =
+ let typ =
+ match typ with
+ None -> Ast.Implicit
+ | Some typ -> typ
+ in
+ sprintf "%s %s on %s: %s \\def %s"
+ (pp_term ~pp_parens:false term)
+ (String.concat " " (List.map pp_capture_variable params))
+ (pp_term ~pp_parens:false (get_guard i params))
+ (pp_term typ) (pp_term body)
+ in
+ sprintf "let %s %s in %s"
(match kind with `Inductive -> "rec" | `CoInductive -> "corec")
- (String.concat " and "
- (List.map
- (fun (var, body, _) ->
- sprintf "%s = %s" (pp_capture_variable var) (pp_term body))
- definitions))
+ (String.concat " and " (List.map map definitions))
(pp_term term)
| Ast.Ident (name, Some []) | Ast.Ident (name, None)
| Ast.Uri (name, Some []) | Ast.Uri (name, None) ->
| Ast.Magic m -> pp_magic m
| Ast.Variable v -> pp_variable v
in
- if pp_parens then sprintf "(%s)" t_pp
- else t_pp
+ match pp_parens, t with
+ | false, _
+ | true, Ast.Implicit
+ | true, Ast.Sort _
+ | true, Ast.Ident (_, Some [])
+ | true, Ast.Ident (_, None) -> t_pp
+ | _ -> sprintf "(%s)" t_pp
and pp_subst (name, term) = sprintf "%s \\Assign %s" name (pp_term term)
and pp_substs substs = String.concat "; " (List.map pp_subst substs)
sprintf "[%s]" (String.concat " | " (List.map pp_pattern patterns))
and pp_capture_variable =
- let clean s =
- let s = String.sub s 1 (String.length s - 1) in
- String.sub s 0 (String.length s - 1)
- in
function
- | term, None -> pp_term term
- | term, Some typ -> "(" ^ clean (pp_term term) ^ ": " ^ pp_term typ ^ ")"
+ | term, None -> pp_term ~pp_parens:false term
+ | term, Some typ -> "(" ^ pp_term ~pp_parens:false term ^ ": " ^ pp_term typ ^ ")"
and pp_box_spec (kind, spacing, indent) =
let int_of_bool b = if b then 1 else 0 in
| Ast.Ascription (t, n) -> assert false
| Ast.FreshVar n -> "fresh " ^ n
-let pp_term t = pp_term ~pp_parens:false t
+let _pp_term = ref (pp_term ~pp_parens:false)
+let pp_term t = !_pp_term t
+let set_pp_term f = _pp_term := f
let pp_params = function
| [] -> ""
- | params ->
- " " ^
- String.concat " "
- (List.map
- (fun (name, typ) -> sprintf "(%s:%s)" name (pp_term typ))
- params)
+ | params -> " " ^ String.concat " " (List.map pp_capture_variable params)
let pp_flavour = function
- | `Definition -> "Definition"
+ | `Definition -> "definition"
| `Fact -> "fact"
| `Goal -> "goal"
| `Lemma -> "lemma"
| `Remark -> "remark"
| `Theorem -> "theorem"
| `Variant -> "variant"
+ | `Axiom -> "axiom"
let pp_fields fields =
(if fields <> [] then "\n" else "") ^
String.concat ";\n"
(List.map
- (fun (name,ty,coercion) ->
- " " ^ name ^ if coercion then ":>" else ": " ^ pp_term ty) fields)
+ (fun (name,ty,coercion,arity) ->
+ " " ^ name ^
+ if coercion then (":" ^
+ if arity > 0 then string_of_int arity else "" ^ ">") else ": " ^
+ pp_term ty) fields)
let pp_obj = function
| Ast.Inductive (params, types) ->
in
fst_typ_pp ^ String.concat "" (List.map pp_type tl))
| Ast.Theorem (flavour, name, typ, body) ->
- sprintf "%s %s: %s %s"
+ sprintf "%s %s:\n %s\n%s"
(pp_flavour flavour)
name
(pp_term typ)
(match body with
| None -> ""
- | Some body -> "\\def " ^ pp_term body)
+ | Some body -> "\\def\n " ^ pp_term body)
| Ast.Record (params,name,ty,fields) ->
- "record " ^ name ^ " " ^ pp_params params ^ " \\def {" ^
- pp_fields fields ^ "}"
+ "record " ^ name ^ " " ^ pp_params params ^ ": " ^ pp_term ty ^
+ " \\def {" ^ pp_fields fields ^ "\n}"
let rec pp_value = function
| Env.TermValue t -> sprintf "$%s$" (pp_term t)