X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Facic_content%2FcicNotationPp.ml;h=ff0a09265c0d6b985d4c439b70931f74f0b8eb0a;hb=f86133c436f18963db383d8918eceefc7adf10ff;hp=568faa927155143f892cd598264fa775c9cf80bf;hpb=e485fe6131cd39401a093d0c10aac7e25aa0532d;p=helm.git diff --git a/components/acic_content/cicNotationPp.ml b/components/acic_content/cicNotationPp.ml index 568faa927..ff0a09265 100644 --- a/components/acic_content/cicNotationPp.ml +++ b/components/acic_content/cicNotationPp.ml @@ -114,13 +114,35 @@ let rec pp_term ?(pp_parens = true) t = 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 strip i t = + let rec aux i l = function + | Ast.Binder (_, var, body) when i > 0 -> aux (pred i) (var :: l) body + | body -> List.rev l, body + in + aux i [] t + in + let rec get_guard i = function + | [] -> assert false + | [term, _] when i = 1 -> term + | _ :: tl -> get_guard (pred i) tl + in + let map (var, body, i) = + let id, vars, typ, body = match var with + | term, Some typ -> + let pvars, pbody = strip i typ in + let _, bbody = strip i body in + term, pvars, pbody, bbody + | _ -> assert false + in + sprintf "%s %s on %s: %s \\def %s" + (pp_term ~pp_parens:false term) + (String.concat " " (List.map pp_capture_variable vars)) + (pp_term ~pp_parens:false (get_guard i vars)) + (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) -> @@ -149,6 +171,8 @@ let rec pp_term ?(pp_parens = true) t = in 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 @@ -252,7 +276,7 @@ let pp_params = function params) let pp_flavour = function - | `Definition -> "Definition" + | `Definition -> "definition" | `Fact -> "fact" | `Goal -> "goal" | `Lemma -> "lemma" @@ -289,16 +313,16 @@ let pp_obj = function 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)