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
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, _) ->
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
| 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