]> matita.cs.unibo.it Git - helm.git/blob - helm/software/lambda-delta/basic_rg/brg.ml
- common/entity: new format for kernel entities
[helm.git] / helm / software / lambda-delta / basic_rg / brg.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 (* kernel version: basic, relative, global *)
13 (* note          : ufficial basic lambda-delta *) 
14
15 type uri = Entity.uri
16 type id = Entity.id
17 type attrs = Entity.attrs
18
19 type bind = Void of attrs        (* attrs       *)
20           | Abst of attrs * term (* attrs, type *)
21           | Abbr of attrs * term (* attrs, body *)
22
23 and term = Sort of attrs * int         (* attrs, hierarchy index *)
24          | LRef of attrs * int         (* attrs, position index *)
25          | GRef of attrs * uri         (* attrs, reference *)
26          | Cast of attrs * term * term (* attrs, type, term *)
27          | Appl of attrs * term * term (* attrs, argument, function *)
28          | Bind of bind * term         (* binder, scope *)
29
30 type entity = term Entity.entity (* attrs, uri, binder *)
31
32 type lenv = Null
33 (* Cons: tail, relative local environment, binder *) 
34              | Cons of lenv * lenv option * bind 
35
36 (* Currified constructors ***************************************************)
37
38 let abst a w = Abst (a, w)
39
40 let abbr a v = Abbr (a, v)
41
42 let lref a i = LRef (a, i)
43
44 let cast a u t = Cast (a, u, t)
45
46 let appl a u t = Appl (a, u, t)
47
48 let bind b t = Bind (b, t)
49
50 let bind_abst a u t = Bind (Abst (a, u), t)
51
52 let bind_abbr a v t = Bind (Abbr (a, v), t)
53
54 (* local environment handling functions *************************************)
55
56 let empty_lenv = Null
57
58 let push f es ?c b =
59    let es = Cons (es, c, b) in f es
60
61 let get err f es i =
62    let rec aux j = function
63       | Null                            -> err ()
64       | Cons (tl, None, b)   when j = 0 -> f tl b
65       | Cons (_, Some c, b) when j = 0  -> f c b
66       | Cons (tl, _, _)                 -> aux (pred j) tl
67    in
68    aux i es
69
70 let rec rev_iter f map = function   
71    | Null                 -> f ()
72    | Cons (tl, None, b)   -> 
73       let f _ = map f tl b in rev_iter f map tl
74    | Cons (tl, Some c, b) -> 
75       let f _ = map f c b in rev_iter f map tl
76
77 let rec fold_left f map x = function
78    | Null            -> f x
79    | Cons (tl, _, b) ->
80       let f x = fold_left f map x tl in
81       map f x b