]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/acic_procedural/proceduralConversion.ml
- cicUtil: is_sober now detects folded applications
[helm.git] / helm / software / components / acic_procedural / proceduralConversion.ml
index 67b293393dbb9cba2e86c7e9c3f1dfee5733f392..8c9a1ddc6f04b6e6bb37e9bd6156f2cebd18482a 100644 (file)
@@ -119,19 +119,19 @@ let lift k n =
       in
       ann_term c
 
-let clear_absts m =
-   let rec aux k n = function
-      | C.AImplicit (_, None) as t         -> t
-      | C.ALambda (id, s, v, t) when k > 0 -> 
-         C.ALambda (id, s, v, aux (pred k) n t)
-      | C.ALambda (_, _, _, t) when n > 0  -> 
-         aux 0 (pred n) (lift 1 (-1) t)
-      | t                      when n > 0  ->
-           Printf.eprintf "CLEAR: %u %s\n" n (CicPp.ppterm (H.cic t));
-           assert false 
-      | t                                  -> t
-   in 
-   aux m
+let mk_arel k = C.ARel ("", "", k, "")
+
+let mk_aappl ts = C.AAppl ("", ts)
+
+let rec clear_absts f n k = function
+   | t when n = 0           -> f k t
+   | C.ALambda (_, _, _, t) -> clear_absts f (pred n) (succ k) t
+   | t                      ->
+      let u = match mk_aappl [lift (succ k) 1 t; mk_arel (succ k)] with
+         | C.AAppl (_, [ C.AAppl (id, ts); t]) -> C.AAppl (id, ts @ [t])
+         | t                                   -> t
+      in
+      clear_absts f (pred n) (succ k) u
 
 let hole id = C.AImplicit (id, Some `Hole)
 
@@ -182,11 +182,10 @@ let generalize n =
       | C.AFix (id, i, fl) -> C.AFix (id, i, List.map (gen_fix (List.length fl) k) fl)
       | C.ACoFix (id, i, fl) -> C.ACoFix (id, i, List.map (gen_cofix (List.length fl) k) fl)
    in
-   gen_term 0
+   gen_term
 
 let mk_pattern psno predicate =
-   let body = generalize psno predicate in
-   clear_absts 0 psno body
+   clear_absts (generalize psno) psno 0 predicate 
 
 let get_clears c p xtypes = 
    let meta = C.Implicit None in