]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/helena/src/basic_rg/brgOutput.ml
update in helena
[helm.git] / helm / software / helena / src / basic_rg / brgOutput.ml
index ed024a68e8faeb50c6901ce118e9cd1a6e3ce0a4..7bb9ce4363a73c9d91cf64cf1719224b521077c8 100644 (file)
@@ -9,15 +9,17 @@
      \ /   This software is distributed as is, NO WARRANTY.              
       V_______________________________________________________________ *)
 
-module P  = Printf
-module F  = Format
-module C  = Cps
+module KF = Filename
+module KP = Printf
+
 module U  = NUri
+module C  = Cps
 module L  = Log
 module G  = Options
-module E  = Entity
 module H  = Hierarchy
-module N  = Level
+module N  = Layer
+module E  = Entity
+module R  = Alpha
 module XD = XmlCrg
 module B  = Brg
 module BD = BrgCrg
@@ -41,6 +43,8 @@ type counters = {
    xnodes: int
 }
 
+let level = 2
+
 let initial_counters = {
    eabsts = 0; eabbrs = 0; evoids = 0; 
    tsorts = 0; tlrefs = 0; tgrefs = 0; tcasts = 0; tappls = 0;
@@ -48,26 +52,28 @@ let initial_counters = {
    uris = []; nodes = 0; xnodes = 0
 }
 
+IFDEF SUMMARY THEN
+
 let rec count_term_binder f c e = function
-   | B.Abst (_, w) ->
+   | B.Abst (_, _, w) ->
       let c = {c with tabsts = succ c.tabsts; nodes = succ c.nodes} in
       count_term f c e w
-   | B.Abbr v      -> 
+   | B.Abbr v         -> 
       let c = {c with tabbrs = succ c.tabbrs; xnodes = succ c.xnodes} in
       count_term f c e v
-   | B.Void        ->
+   | B.Void           ->
       let c = {c with tvoids = succ c.tvoids; xnodes = succ c.xnodes} in   
       f c
 
 and count_term f c e = function
-   | B.Sort _         -> 
+   | B.Sort _         ->
       f {c with tsorts = succ c.tsorts; nodes = succ c.nodes}
-   | B.LRef (_, i)    -> 
+   | B.LRef (_, i)    ->
       begin match B.get e i with
-        | _, _, _, B.Abst _
-        | _, _, _, B.Void   ->
+        | _, _, _, _, B.Abst _
+        | _, _, _, _, B.Void   ->
            f {c with tlrefs = succ c.tlrefs; nodes = succ c.nodes}
-        | _, _, _, B.Abbr _ ->
+        | _, _, _, _, B.Abbr _ ->
            f {c with tlrefs = succ c.tlrefs; xnodes = succ c.xnodes}
       end      
    | B.GRef (_, u)    -> 
@@ -77,7 +83,7 @@ and count_term f c e = function
         else {c with xnodes = succ c.xnodes}
       in
       f {c with tgrefs = succ c.tgrefs}
-   | B.Cast (_, v, t) -> 
+   | B.Cast (v, t)    -> 
       let c = {c with tcasts = succ c.tcasts} in
       let f c = count_term f c e t in
       count_term f c e v
@@ -85,134 +91,115 @@ and count_term f c e = function
       let c = {c with tappls = succ c.tappls; nodes = succ c.nodes} in
       let f c = count_term f c e t in
       count_term f c e v
-   | B.Bind (a, b, t) -> 
-      let f c = count_term f c (B.push e B.empty a b) t in
+   | B.Bind (y, b, t) -> 
+      let f c = count_term f c (B.push e B.empty E.empty_node y b) t in
       count_term_binder f c e b
 
 let count_entity f c = function
-   | _, u, E.Abst (_, w) -> 
+   | _, _, u, E.Abst (_, w) -> 
       let c = {c with
          eabsts = succ c.eabsts; nodes = succ c.nodes; uris = u :: c.uris
       } in
       count_term f c B.empty w
-   | _, _, E.Abbr v      ->  
+   | _, _, _, E.Abbr (_, v) ->  
       let c = {c with eabbrs = succ c.eabbrs; xnodes = succ c.xnodes} in
       count_term f c B.empty v
-   | _, _, E.Void        -> assert false
+   | _, _, _, E.Void        -> assert false
 
 let print_counters f c =
    let terms =
-      c.tsorts + c.tgrefs + c.tgrefs + c.tcasts + c.tappls + c.tabsts +
+      c.tsorts + c.tlrefs + c.tgrefs + c.tcasts + c.tappls + c.tabsts +
       c.tabbrs
    in
    let items = c.eabsts + c.eabbrs in
    let nodes = c.nodes + c.xnodes in
-   L.warn (P.sprintf "  Kernel representation summary (basic_rg)");
-   L.warn (P.sprintf "    Total entry items:        %7u" items);
-   L.warn (P.sprintf "      Declaration items:      %7u" c.eabsts);
-   L.warn (P.sprintf "      Definition items:       %7u" c.eabbrs);
-   L.warn (P.sprintf "    Total term items:         %7u" terms);
-   L.warn (P.sprintf "      Sort items:             %7u" c.tsorts);
-   L.warn (P.sprintf "      Local reference items:  %7u" c.tlrefs);
-   L.warn (P.sprintf "      Global reference items: %7u" c.tgrefs);
-   L.warn (P.sprintf "      Explicit Cast items:    %7u" c.tcasts);
-   L.warn (P.sprintf "      Application items:      %7u" c.tappls);
-   L.warn (P.sprintf "      Abstraction items:      %7u" c.tabsts);
-   L.warn (P.sprintf "      Abbreviation items:     %7u" c.tabbrs);
-   L.warn (P.sprintf "    Global Int. Complexity:   %7u" c.nodes);
-   L.warn (P.sprintf "      + Abbreviation nodes:   %7u" nodes);
+   L.warn level (KP.sprintf "Kernel representation summary (basic_rg)");
+   L.warn level (KP.sprintf "  Total entry items:        %7u" items);
+   L.warn level (KP.sprintf "    Declaration items:      %7u" c.eabsts);
+   L.warn level (KP.sprintf "    Definition items:       %7u" c.eabbrs);
+   L.warn level (KP.sprintf "  Total term items:         %7u" terms);
+   L.warn level (KP.sprintf "    Sort items:             %7u" c.tsorts);
+   L.warn level (KP.sprintf "    Local reference items:  %7u" c.tlrefs);
+   L.warn level (KP.sprintf "    Global reference items: %7u" c.tgrefs);
+   L.warn level (KP.sprintf "    Explicit Cast items:    %7u" c.tcasts);
+   L.warn level (KP.sprintf "    Application items:      %7u" c.tappls);
+   L.warn level (KP.sprintf "    Abstraction items:      %7u" c.tabsts);
+   L.warn level (KP.sprintf "    Abbreviation items:     %7u" c.tabbrs);
+   L.warn level (KP.sprintf "  Global Int. Complexity:   %7u" c.nodes);
+   L.warn level (KP.sprintf "    + Abbreviation nodes:   %7u" nodes);
    f ()
 
-(* supplementary annotation *************************************************)
-
-let rec does_not_occur f n r = function
-   | B.Null              -> f true
-   | B.Cons (e, _, a, _) ->
-      let f n1 r1 =
-         if n1 = n && r1 = r then f false else does_not_occur f n r e
-      in
-      E.name C.err f a 
-
-let rename f e a =
-   let rec aux f e n r =
-      let f = function
-         | true  -> f n r
-        | false -> aux f e (n ^ "_") r
-      in
-      does_not_occur f n r e
-   in
-   let f n0 r0 =
-      let f n r = if n = n0 && r = r0 then f a else f (E.Name (n, r) :: a) in
-      aux f e n0 r0 
-   in
-   E.name C.err f a
+END
 
 (* lenv/term pretty printing ************************************************)
 
-let name err frm a =
+let name err och a =
    let f n = function 
-      | true  -> F.fprintf frm "%s" n
-      | false -> F.fprintf frm "-%s" n
-   in      
+      | true  -> KP.fprintf och "%s" n
+      | false -> KP.fprintf och "-%s" n
+   in
    E.name err f a
 
-let pp_level frm n =
-   if N.is_infinite n then () else F.fprintf frm "^%s" (N.to_string n)
+let pp_reduced och x =
+   if x then KP.fprintf och "%s" "^"
 
-let rec pp_term e frm = function
-   | B.Sort (_, h)           -> 
-      let err _ = F.fprintf frm "@[*%u@]" h in
-      let f s = F.fprintf frm "@[%s@]" s in
-      H.string_of_sort err f h 
-   | B.LRef (_, i)           -> 
-      let err _ = F.fprintf frm "@[#%u@]" i in
+let pp_level st och n =
+   KP.fprintf och "%s" (N.to_string st n)
+
+let rec pp_term st e och = function
+   | B.Sort k                        -> 
+      let err _ = KP.fprintf och "*%u" k in
+      let f s = KP.fprintf och "%s" s in
+      H.string_of_sort err f k 
+   | B.LRef (_, i)                   -> 
+      let err _ = KP.fprintf och "#%u" i in
       if !G.indexes then err () else      
-      let _, _, a, b = B.get e i in
-      F.fprintf frm "@[%a@]" (name err) a
-   | B.GRef (_, s)           ->
-      F.fprintf frm "@[$%s@]" (U.string_of_uri s)
-   | B.Cast (_, u, t)        ->
-      F.fprintf frm "@[{%a}.%a@]" (pp_term e) u (pp_term e) t
-   | B.Appl (_, v, t)        ->
-      F.fprintf frm "@[(%a).%a@]" (pp_term e) v (pp_term e) t
-   | B.Bind (a, B.Abst (n, w), t) ->
-      let f a =
-         let ee = B.push e B.empty a (B.abst n w) in
-        F.fprintf frm "@[[%a:%a]%a.%a@]" (name C.err) a (pp_term e) w pp_level n (pp_term ee) t
-      in
-      rename f e a
-   | B.Bind (a, B.Abbr v, t) ->
-      let f a = 
-         let ee = B.push e B.empty a (B.abbr v) in
-        F.fprintf frm "@[[%a=%a].%a@]" (name C.err) a (pp_term e) v (pp_term ee) t
-      in
-      rename f e a
-   | B.Bind (a, B.Void, t)   ->
-      let f a = 
-         let ee = B.push e B.empty a B.Void in
-         F.fprintf frm "@[[%a].%a@]" (name C.err) a (pp_term ee) t
-      in
-      rename f e a
-
-let pp_lenv frm e =
-   let pp_entry f e c a b x = f x (*match b with
-      | B.Abst (a, w) -> 
-         let f a = F.fprintf frm "@,@[%a : %a@]" (name C.err) a (pp_term e) w; f a in
-         rename f x a
-      | B.Abbr (a, v) -> 
-         let f a = F.fprintf frm "@,@[%a = %a@]" (name C.err) a (pp_term e) v; f a in
-        rename f c a
-      | B.Void a      -> 
-         let f a = F.fprintf frm "@,%a" (name C.err) a; f a in
-        rename f c a
-*)   in
+      let _, _, _, y, b = B.get e i in
+      KP.fprintf och "%a" (name err) y
+   | B.GRef (_, s)                   ->
+      let u = U.string_of_uri s in
+      KP.fprintf och "$%s" (if !G.short then KF.basename u else u)
+   | B.Cast (u, t)                   ->
+      KP.fprintf och "<%a>.%a" (pp_term st e) u (pp_term st e) t
+   | B.Appl (_, v, t)                ->
+      KP.fprintf och "(%a).%a" (pp_term st e) v (pp_term st e) t
+   | B.Bind (y, B.Abst (r, n, w), t) ->
+      let y = R.alpha B.mem e y in
+      let ee = B.push e B.empty E.empty_node y (B.abst r n w) in
+      KP.fprintf och "%a%a[%a:%a].%a" (pp_level st) n pp_reduced r (name C.start) y (pp_term st e) w (pp_term st ee) t
+   | B.Bind (y, B.Abbr v, t)         ->
+      let y = R.alpha B.mem e y in
+      let ee = B.push e B.empty E.empty_node y (B.abbr v) in
+      KP.fprintf och "[%a=%a].%a" (name C.start) y (pp_term st e) v (pp_term st ee) t
+   | B.Bind (y, B.Void, t)           ->
+      let y = R.alpha B.mem e y in
+      let ee = B.push e B.empty E.empty_node y B.Void in
+      KP.fprintf och "[%a].%a" (name C.start) y (pp_term st ee) t
+
+let pp_lenv st och e =
+   let pp_entry f c a y b x =
+      let y = R.alpha B.mem e y in
+      let x = B.push x c a y b in
+      match b with
+         | B.Abst (_, _, w) ->
+            KP.fprintf och "[%a : %a] " (name C.start) y (pp_term st c) w; f x
+         | B.Abbr v            ->
+            KP.fprintf och "[%a = %a] " (name C.start) y (pp_term st c) v; f x
+         | B.Void           ->
+            KP.fprintf och "[%a]" (name C.start) y; f x
+   in
+   if e = B.empty then KP.fprintf och "%s" "empty" else
    B.fold_right ignore pp_entry e B.empty
 
 let specs = {
    L.pp_term = pp_term; L.pp_lenv = pp_lenv
 }
 
+IFDEF OBJECTS THEN
+
 (* term xml printing ********************************************************)
 
-let export_term =
-   BD.crg_of_brg XD.export_term  
+let export_term st =
+   BD.crg_of_brg (XD.export_term st)  
+
+END