X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fbasic_ag%2FbagReduction.ml;h=f8fed7786f22fe504585f76827e06b0143a5afe1;hb=16fc013c83981bb5c2bb24ac4e06bc0ca1fda80d;hp=279ca072f1a38b5b9db5fbf96d7b956a562a1810;hpb=1ae23fe33b8647a4b8616e666dc5703c17678069;p=helm.git diff --git a/helm/software/lambda-delta/basic_ag/bagReduction.ml b/helm/software/lambda-delta/basic_ag/bagReduction.ml index 279ca072f..f8fed7786 100644 --- a/helm/software/lambda-delta/basic_ag/bagReduction.ml +++ b/helm/software/lambda-delta/basic_ag/bagReduction.ml @@ -39,6 +39,8 @@ type ho_whd_result = type ac_result = (int * NUri.uri * Bag.term list) list option +type extension = No | NSI + (* Internal functions *******************************************************) let term_of_whdr = function @@ -51,6 +53,14 @@ let level = 5 let error i = raise (LRefNotFound (L.items1 (string_of_int i))) +let log1 s c t = + let sc, st = s ^ " in the context", "the term" in + L.log O.specs level (L.ct_items1 sc c st t) + +let log2 s c u t = + let sc, su, st = s ^ " in the context", "the term", "and the term" in + L.log O.specs level (L.ct_items2 sc c su u st t) + let empty_machine = {i = 0; c = B.empty_context; s = []} let inc m = {m with i = succ m.i} @@ -109,6 +119,8 @@ let insert f i uri vs = function (* Interface functions ******************************************************) +let ext = ref No + let rec ho_whd f c m x = let aux m = function | Sort_ h -> f (Sort h) @@ -116,13 +128,13 @@ let rec ho_whd f c m x = let f w = f (Abst w) in unwind_to_term f m w | LRef_ (_, Some w) -> ho_whd f c m w | GRef_ (_, uri, B.Abst w) -> - let f = function + let h = function | Abst _ as r -> f r | GRef _ as r -> f r | Sort _ -> let f vs = f (GRef (uri, vs)) in unwind_stack f m in - ho_whd f c m w + if !ext = No then ho_whd h c m w else ho_whd f c m w | GRef_ (_, _, B.Abbr v) -> ho_whd f c m v | LRef_ (_, None) -> assert false | GRef_ (_, _, B.Void) -> assert false @@ -131,13 +143,13 @@ let rec ho_whd f c m x = let ho_whd f c t = let f r = L.unbox level; f r in - L.box level; L.log O.specs level (L.ct_items1 "Now scanning" c t); + L.box level; log1 "Now scanning" c t; ho_whd f c empty_machine t let rec are_convertible f xl c m1 t1 m2 t2 = let rec aux m1 r1 m2 r2 = let u, t = term_of_whdr r1, term_of_whdr r2 in - L.log O.specs level (L.ct_items2 "Now really converting" c u "and" c t); + log2 "Now really converting" c u t; match r1, r2 with | Sort_ h1, Sort_ h2 -> if h1 = h2 then f xl else f None @@ -156,18 +168,22 @@ let rec are_convertible f xl c m1 t1 m2 t2 = | Bind_ (l1, id1, w1, t1), Bind_ (l2, id2, w2, t2) -> let f xl = let h c = - let m1, m2 = inc m1, inc m2 in + let m1, m2 = inc m1, inc m2 in S.subst (are_convertible f xl c m1 t1 m2) l1 l2 t2 in if xl = None then f xl else push h c m1 l1 id1 w1 in are_convertible f xl c m1 w1 m2 w2 (* we detect the AUT-QE reduction rule for type/prop inclusion *) - | GRef_ (_, uri, B.Abst _), Bind_ (l1, _, _, _) -> + | GRef_ (_, uri, B.Abst _), Bind_ (l1, _, _, _) when !ext = No -> let g vs = insert f l1 uri vs xl in if U.eq uri I.imp then unwind_stack g m1 else if U.eq uri I.all then unwind_stack g m1 else begin L.warn (U.string_of_uri uri); f None end + | Sort_ _, Bind_ (l2, id2, w2, t2) when !ext = NSI -> + let m1, m2 = inc m1, inc m2 in + let f c = are_convertible f xl c m1 (term_of_whdr r1) m2 t2 in + push f c m2 l2 id2 w2 | _ -> f None and aux_rev m2 r2 m1 r1 = aux m1 r1 m2 r2 in let f m1 r1 = whd (aux m1 r1) c m2 t2 in @@ -181,6 +197,5 @@ and are_convertible_stacks f xl c m1 m2 = let are_convertible f c u t = let f b = L.unbox level; f b in - L.box level; - L.log O.specs level (L.ct_items2 "Now converting" c u "and" c t); + L.box level; log2 "Now converting" c u t; are_convertible f (Some []) c empty_machine u empty_machine t