]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_kernel/nCicPp.ml
Lookup_in_library implemented for new objects. Basically, this stupid (??),
[helm.git] / helm / software / components / ng_kernel / nCicPp.ml
index 83422cd8f238ee1f207afb8931f57bcb2d7b16c4..6a38873fc360d9b238f3ff13bbed0174fc521bd7 100644 (file)
@@ -14,6 +14,9 @@
 module C = NCic
 module R = NReference
 
+let head_beta_reduce = ref (fun ~upto:_ _ -> assert false);;
+let set_head_beta_reduce = (:=) head_beta_reduce;;
+
 let r2s pp_fix_name r = 
   try
     match r with
@@ -128,6 +131,14 @@ let ppterm ~context ~subst ~metasenv:_ ?(inside_fix=false) t =
       F.fprintf f "]@] @]";
    | C.Appl [] | C.Appl [_] | C.Appl (C.Appl _::_) -> 
        F.fprintf f "BAD APPLICATION"
+   | C.Appl (C.Meta (n,lc) :: args) when List.mem_assoc n subst -> 
+       let _,_,t,_ = List.assoc n subst in
+       let hd = NCicSubstitution.subst_meta lc t in
+       aux ctx 
+         (!head_beta_reduce ~upto:(List.length args)
+           (match hd with
+           | NCic.Appl l -> NCic.Appl (l@args)
+           | _ -> NCic.Appl (hd :: args)))
    | C.Appl l -> 
        F.fprintf f "@[<hov 2>";
        if not toplevel then F.fprintf f "(";
@@ -172,37 +183,6 @@ let ppterm ~context ~subst ~metasenv ?(margin=80) ?inside_fix t =
   ppterm ~context ~subst ~metasenv ?inside_fix t
 ;;
 
-
-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 -> 
@@ -217,7 +197,7 @@ let rec ppcontext ?(sep="\n") ~subst ~metasenv = function
 let rec ppmetasenv ~subst metasenv = function
   | [] -> ""
   | (i,(name, ctx, ty)) :: tl ->
-      let name = match name with Some n -> "(\""^n^"\")" | _ -> "" in
+      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" ^
@@ -240,5 +220,39 @@ let rec ppsubst ~subst ~metasenv = function
 
 let ppsubst ~metasenv subst = ppsubst ~metasenv ~subst subst;;
 
+
+let ppobj (u,_,metasenv, subst, o) = 
+  "metasenv:\n" ^ ppmetasenv ~subst metasenv ^ "\n" ^
+  "subst:\n" ^ ppsubst subst ~metasenv ^ "\n" ^
+  match o with 
+  | 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)
+  | 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) ^ "."
+  | NCic.Constant (_,name,None,ty, _) -> 
+      "{"^NUri.string_of_uri u^"}\n"^
+        "axiom " ^ name ^ " : " ^ 
+          ppterm ~metasenv ~subst ~context:[] ty ^ "\n" 
+  | 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 _ = NCicSubstitution.set_ppterm (ppterm ~margin:80);;