X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fbasic_ag%2FbagReduction.ml;h=f8fed7786f22fe504585f76827e06b0143a5afe1;hb=ae63e62aaf5659fe6b0e48cc4a4bdcf7b57318ad;hp=ca22c1dbc3f44beccf5aa05d6a9debef3cb5eb96;hpb=fc15ad45208cc2e649fa435e547ecc757fe28481;p=helm.git diff --git a/helm/software/lambda-delta/basic_ag/bagReduction.ml b/helm/software/lambda-delta/basic_ag/bagReduction.ml index ca22c1dbc..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 @@ -117,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) @@ -124,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 @@ -164,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