]> matita.cs.unibo.it Git - helm.git/blob - helm/software/lambda-delta/dual_rg/drgOutput.ml
drgAut: we fixed the order of multi application arguments
[helm.git] / helm / software / lambda-delta / dual_rg / drgOutput.ml
1 (*
2     ||M||  This file is part of HELM, an Hypertextual, Electronic        
3     ||A||  Library of Mathematics, developed at the Computer Science     
4     ||T||  Department, University of Bologna, Italy.                     
5     ||I||                                                                
6     ||T||  HELM is free software; you can redistribute it and/or         
7     ||A||  modify it under the terms of the GNU General Public License   
8     \   /  version 2 or (at your option) any later version.              
9      \ /   This software is distributed as is, NO WARRANTY.              
10       V_______________________________________________________________ *)
11
12 module U = NUri
13 module C = Cps
14 module H = Hierarchy
15 module Y = Entity
16 module X = Library
17 module D = Drg
18
19 let rec list_iter map l out tab = match l with
20    | []       -> ()
21    | hd :: tl -> map hd out tab; list_iter map tl out tab
22
23 let list_rev_iter map e ns l out tab =
24    let rec aux err f e = function
25       | [], []            -> f e
26       | n :: ns, hd :: tl -> 
27         let f e = map e hd out tab; f (D.push2 C.err C.start e n ~t:hd) in
28         aux err f e (ns, tl) 
29       | _                 -> err ()
30    in
31    ignore (aux C.err C.start e (ns, l))
32
33 let lenv_iter map1 map2 l out tab = 
34    let rec aux f = function
35       | D.ESort              -> f ()
36       | D.EBind (lenv, a, b) -> aux (fun () -> map1 a b out tab; f ()) lenv
37       | D.EProj (lenv, a, e) -> aux (fun () -> map2 a e out tab; f ()) lenv
38    in 
39    aux C.start l
40
41 let rec exp_term e t out tab = match t with
42    | D.TSort (a, l)       ->
43       let a =
44          let err _ = a in
45          let f s = Y.Name (s, true) :: a in
46          H.get_sort err f l
47       in
48       let attrs = [X.position l; X.name a] in
49       X.tag X.sort attrs out tab
50    | D.TLRef (a, i, j)    ->
51       let a = 
52          let err _ = a in
53          let f n r = Y.Name (n, r) :: a in
54          D.get_name err f i j e
55       in
56       let attrs = [X.position i; X.offset j; X.name a] in
57       X.tag X.lref attrs out tab
58    | D.TGRef (a, n)       ->
59       let a = Y.Name (U.name_of_uri n, true) :: a in
60       let attrs = [X.uri n; X.name a] in
61       X.tag X.gref attrs out tab
62    | D.TCast (a, u, t)    ->
63       let attrs = [] in
64       X.tag X.cast attrs ~contents:(exp_term e u) out tab;
65       exp_term e t out tab
66    | D.TAppl (a, vs, t)   ->
67       let attrs = [X.arity (List.length vs)] in
68       X.tag X.appl attrs ~contents:(list_iter (exp_term e) vs) out tab;
69       exp_term e t out tab
70    | D.TProj (a, lenv, t) ->
71       let attrs = [] in
72       X.tag X.proj attrs ~contents:(lenv_iter (exp_bind e) (exp_eproj e) lenv) out tab;
73       exp_term (D.push_proj C.start e a lenv) t out tab
74    | D.TBind (a, b, t) ->
75       exp_bind e a b out tab; 
76       exp_term (D.push_bind C.start e a b) t out tab 
77
78 and exp_bind e a b out tab = 
79    let f a ns = a, ns in
80    let a, ns = Y.get_names f a in 
81    match b with
82       | D.Abst ws ->
83          let e = D.push_bind C.start e a (D.Abst []) in
84          let attrs = [X.name ns; X.mark a; X.arity (List.length ws)] in
85          X.tag X.abst attrs ~contents:(list_rev_iter exp_term e ns ws) out tab
86       | D.Abbr vs ->
87          let e = D.push_bind C.start e a (D.Abbr []) in
88          let attrs = [X.name ns; X.mark a; X.arity (List.length vs)] in
89          X.tag X.abbr attrs ~contents:(list_rev_iter exp_term e ns vs) out tab
90       | D.Void n ->
91          let attrs = [X.name a; X.mark a; X.arity n] in
92          X.tag X.void attrs out tab
93
94 and exp_eproj e a lenv out tab =
95    let attrs = [] in
96    X.tag X.proj attrs ~contents:(lenv_iter (exp_bind e) (exp_eproj e) lenv) out tab
97
98 let export_term = exp_term D.empty_lenv