]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/lambda-delta/toplevel/metaBrg.ml
- common/entity: new format for kernel entities
[helm.git] / helm / software / lambda-delta / toplevel / metaBrg.ml
index dfc7e8b56379ae8199bf3a58c87169c53f518435..4ee25812e9938840409c97241341d8a85a3f000b 100644 (file)
       V_______________________________________________________________ *)
 
 module C = Cps
+module Y = Entity
 module B = Brg
 module M = Meta
 
 (* Internal functions *******************************************************)
 
-let map_fold_left f map1 map2 a l =
-   let f a = C.list_fold_left f map2 a l in
-   map1 f a 
-
-let map_args f t v = f (B.Appl (v, t))
-
-let map_pars f t (id, w) = f (B.Bind (id, B.Abst w, t))
-
-let rec xlate_term f = function
+let rec xlate_term c f = function
    | M.Sort s            -> 
-      let f h = f (B.Sort h) in
+      let f h = f (B.Sort ([], h)) in
       if s then f 0 else f 1
-   | M.LRef (l, i)       ->
-      f (B.LRef (l - succ i))
+   | M.LRef (_, i)       ->
+      f (B.LRef ([], i))
    | M.GRef (_, uri, vs) ->
-      let f vs = map_fold_left f C.id map_args (B.GRef uri) vs in
-      C.list_map f xlate_term vs
+      let map f t v = f (B.appl [] v t) in
+      let f vs = C.list_fold_left f map (B.GRef ([], uri)) vs in
+      C.list_map f (xlate_term c) vs
    | M.Appl (v, t)       ->
-      let f v t = f (B.Appl (v, t)) in
-      let f v = xlate_term (f v) t in
-      xlate_term f v
+      let f v t = f (B.Appl ([], v, t)) in
+      let f v = xlate_term (f v) t in
+      xlate_term f v
    | M.Abst (id, w, t)   ->
-      let f w t = f (B.Bind (id, B.Abst w, t)) in
-      let f w = xlate_term (f w) t in
-      xlate_term f w
+      let f w = 
+         let a = [Y.Name (id, true)] in
+        let f t = f (B.Bind (B.abst a w, t)) in
+         let f c = xlate_term c f t in
+         B.push f c (B.abst a w)
+      in
+      xlate_term c f w
 
-let xlate_pars f (id, w) =
-   let f w = f (id, w) in
-   xlate_term f w
+let xlate_pars f pars =
+   let map f (id, w) c =
+      let a = [Y.Name (id, true)] in
+      let f w = B.push f c (B.abst a w) in
+      xlate_term c f w
+   in
+   C.list_fold_right f map pars B.empty_lenv
 
-let xlate_entry f = function
-   | e, pars, uri, u, None        ->
-      let f u = f (e, uri, B.Abst u) in
-      let f pars = map_fold_left f xlate_term map_pars u pars in      
-      C.list_map f xlate_pars pars
-   | e, pars, uri, u, Some (_, t) ->
-      let f u t = f (e, uri, B.Abbr (B.Cast (u, t))) in
-      let f pars u = map_fold_left (f u) xlate_term map_pars t pars in      
-      let f pars = map_fold_left (f pars) xlate_term map_pars u pars in
-      C.list_map f xlate_pars pars
+let unwind_to_xlate_term f c t =
+   let map f t b = f (B.bind b t) in
+   let f t = B.fold_left f map t c in
+   xlate_term c f t
 
-let xlate_item f = function
-   | None   -> f None
-   | Some e -> let f e = f (Some e) in xlate_entry f e
+let xlate_entry f = function
+   | pars, u, None   ->
+      let f c = unwind_to_xlate_term f c u in      
+      xlate_pars f pars   
+   | pars, u, Some t ->
+      let f u t = f (B.Cast ([], u, t)) in
+      let f c u = unwind_to_xlate_term (f u) c t in
+      let f c = unwind_to_xlate_term (f c) c u in
+      xlate_pars f pars
 
 (* Interface functions ******************************************************)
 
-let brg_of_meta = xlate_item
+let brg_of_meta = xlate_entry