X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fbasic_ag%2FbagReduction.ml;fp=helm%2Fsoftware%2Flambda-delta%2Fbasic_ag%2FbagReduction.ml;h=518f7061b12fa8fec1ac63a6d79d479c04d125f0;hb=13c3708fc59d999727ee214e8ece1f03661a9737;hp=edd1eeaf747481e921be9f59682fa2f334fbe2ca;hpb=939f76e2fd4a50fd49c010a64e49b5625569d712;p=helm.git diff --git a/helm/software/lambda-delta/basic_ag/bagReduction.ml b/helm/software/lambda-delta/basic_ag/bagReduction.ml index edd1eeaf7..518f7061b 100644 --- a/helm/software/lambda-delta/basic_ag/bagReduction.ml +++ b/helm/software/lambda-delta/basic_ag/bagReduction.ml @@ -77,13 +77,15 @@ let get f c m i = let f c = B.get f c i in B.append f c m.c -let push f c m l id w = +let push msg f c m l id w = assert (m.s = []); - let f w = B.push f c l id (B.Abst w) in + let f w = B.push msg f c l id (B.Abst w) in unwind_to_term f m w (* to share *) -let rec whd f c m x = match x with +let rec whd f c m x = +(* L.warn "entering R.whd"; *) + match x with | B.Sort h -> f m (Sort_ h) | B.GRef uri -> let f obj = f m (GRef_ obj) in @@ -101,18 +103,21 @@ let rec whd f c m x = match x with begin match m.s with | [] -> f m (Bind_ (l, id, w, t)) | v :: tl -> - let f mc = whd f c {m with c = mc; s = tl} t in - B.push f m.c l id (B.Abbr (B.Cast (w, v))) + let nl = B.new_location () in + let f mc = S.subst (whd f c {m with c = mc; s = tl}) nl l t in + B.push "!" f m.c nl id (B.Abbr (B.Cast (w, v))) end | B.Bind (l, id, b, t) -> - let f mc = whd f c {m with c = mc} t in - B.push f m.c l id b + let nl = B.new_location () in + let f mc = S.subst (whd f c {m with c = mc}) nl l t in + B.push "!" f m.c nl id b (* Interface functions ******************************************************) let nsi = ref false let rec ho_whd f c m x = +(* L.warn "entering R.ho_whd"; *) let aux m = function | Sort_ h -> f (Sort h) | Bind_ (_, _, w, _) -> @@ -131,7 +136,9 @@ let ho_whd f c t = ho_whd f c empty_machine t let rec are_convertible f a c m1 t1 m2 t2 = +(* L.warn "entering R.are_convertible"; *) let rec aux m1 r1 m2 r2 = +(* L.warn "entering R.are_convertible_aux"; *) let u, t = term_of_whdr r1, term_of_whdr r2 in log2 "Now really converting" c u t; match r1, r2 with @@ -153,32 +160,35 @@ let rec are_convertible f a c m1 t1 m2 t2 = | GRef_ (_, _, B.Abbr v1), _ -> whd (aux_rev m2 r2) c m1 v1 | Bind_ (l1, id1, w1, t1), Bind_ (l2, id2, w2, t2) -> + let l = B.new_location () in let h c = let m1, m2 = inc m1, inc m2 in - S.subst (are_convertible f a c m1 t1 m2) l1 l2 t2 + let f t1 = S.subst (are_convertible f a c m1 t1 m2) l l2 t2 in + S.subst f l l1 t1 in - let f r = if r then push h c m1 l1 id1 w1 else f false in + let f r = if r then push "!" h c m1 l id1 w1 else f false in are_convertible f a c m1 w1 m2 w2 (* we detect the AUT-QE reduction rule for type/prop inclusion *) | Sort_ _, Bind_ (l2, id2, w2, t2) when !nsi -> let m1, m2 = inc m1, inc m2 in let f c = are_convertible f a c m1 (term_of_whdr r1) m2 t2 in - push f c m2 l2 id2 w2 + push "nsi" f c m2 l2 id2 w2 | _ -> f false and aux_rev m2 r2 m1 r1 = aux m1 r1 m2 r2 in let g m1 r1 = whd (aux m1 r1) c m2 t2 in if a = false then f false else whd g c m1 t1 and are_convertible_stacks f a c m1 m2 = +(* L.warn "entering R.are_convertible_stacks"; *) let mm1, mm2 = {m1 with s = []}, {m2 with s = []} in let map f a v1 v2 = are_convertible f a c mm1 v1 mm2 v2 in if List.length m1.s <> List.length m2.s then begin - L.warn (Printf.sprintf "Different lengths: %u %u" - (List.length m1.s) (List.length m2.s) - ); +(* L.warn (Printf.sprintf "Different lengths: %u %u" + (List.length m1.s) (List.length m2.s) + ); *) f false - end + end else C.list_fold_left2 f map a m1.s m2.s