- whd aux c m x
-
-let ho_whd f c t =
- L.log O.specs level (L.ct_items1 "Now scanning" c t);
- ho_whd f c empty_machine t
-
-let rec are_convertible f c1 m1 t1 c2 m2 t2 =
- let rec aux m1 r1 m2 r2 = match r1, r2 with
- | Sort_ h1, Sort_ h2 -> f (h1 = h2)
- | LRef_ (i1, _), LRef_ (i2, _) ->
- if i1 = i2 then are_convertible_stacks f c1 m1 c2 m2 else f false
- | GRef_ (a1, B.Abst _), GRef_ (a2, B.Abst _) ->
- if a1 = a2 then are_convertible_stacks f c1 m1 c2 m2 else f false
- | GRef_ (a1, B.Abbr v1), GRef_ (a2, B.Abbr v2) ->
- if a1 = a2 then are_convertible_stacks f c1 m1 c2 m2 else
- if a1 < a2 then whd (aux m1 r1) c2 m2 v2 else
- whd (aux_rev m2 r2) c1 m1 v1
- | _, GRef_ (_, B.Abbr v2) ->
- whd (aux m1 r1) c2 m2 v2
- | GRef_ (_, B.Abbr v1), _ ->
- whd (aux_rev m2 r2) c1 m1 v1
- | Bind_ (id1, w1, t1), Bind_ (id2, w2, t2) ->
- let f b =
- if b then
- let f c1 m1 t1 =
- push (are_convertible f c1 m1 t1) c2 m2 id2 w2 t2
- in
- push f c1 m1 id1 w1 t1
- else f false
- in
- are_convertible f c1 m1 w1 c2 m2 w2
- | _ -> f false
- and aux_rev m2 r2 m1 r1 = aux m1 r1 m2 r2 in
- let f m1 r1 = whd (aux m1 r1) c2 m2 t2 in
- whd f c1 m1 t1
-
-and are_convertible_stacks f c1 m1 c2 m2 =
+ L.box level; log1 "Now scanning" m.c t;
+ step f ~delta:true ~rt:true m t
+
+let rec ac_nfs f ~si r m1 u m2 t =
+ log2 "Now converting nfs" m1.c u m2.c t;
+ match u, t with
+ | B.Sort (_, h1), B.Sort (_, h2) ->
+ if h1 = h2 then f r else f false
+ | B.LRef (B.Entry (e1, B.Abst _) :: _, i1),
+ B.LRef (B.Entry (e2, B.Abst _) :: _, i2) ->
+ P.add ~zeta:(i1+i2-e1-e2) ();
+ if e1 = e2 then ac_stacks f ~si r m1 m2 else f false
+ | B.GRef (B.Entry (e1, B.Abst _) :: _, _),
+ B.GRef (B.Entry (e2, B.Abst _) :: _, _) ->
+ if e1 = e2 then ac_stacks f ~si r m1 m2 else f false
+ | B.GRef (B.Entry (e1, B.Abbr v1) :: _, _),
+ B.GRef (B.Entry (e2, B.Abbr v2) :: _, _) ->
+ if e1 = e2 then
+ let f r =
+ if r then f r
+ else begin
+ P.add ~gdelta:2 ();
+ ac f ~si true m1 v1 m2 v2
+ end
+ in
+ ac_stacks f ~si r m1 m2
+ else if e1 < e2 then begin
+ P.add ~gdelta:1 ();
+ step (ac_nfs f ~si r m1 u) m2 v2
+ end else begin
+ P.add ~gdelta:1 ();
+ step (ac_nfs_rev f ~si r m2 t) m1 v1
+ end
+ | _, B.GRef (B.Entry (_, B.Abbr v2) :: _, _) ->
+ P.add ~gdelta:1 ();
+ step (ac_nfs f ~si r m1 u) m2 v2
+ | B.GRef (B.Entry (_, B.Abbr v1) :: _, _), _ ->
+ P.add ~gdelta:1 ();
+ step (ac_nfs_rev f ~si r m2 t) m1 v1
+ | B.Bind (a1, (B.Abst w1 as b1), t1),
+ B.Bind (a2, (B.Abst w2 as b2), t2) ->
+ let g m1 m2 = ac f ~si r m1 t1 m2 t2 in
+ let g m1 = push (g m1) m2 a2 b2 in
+ let f r = if r then push g m1 a1 b1 else f false in
+ ac f ~si r m1 w1 m2 w2
+ | B.Sort _, B.Bind (a, b, t) when si ->
+ P.add ~si:1 ();
+ let f m1 m2 = ac f ~si r m1 u m2 t in
+ let f m1 = push (f m1) m2 a b in
+ push f m1 a b
+ | _ -> f false
+
+and ac_nfs_rev f ~si r m2 t m1 u = ac_nfs f ~si r m1 u m2 t
+
+and ac f ~si r m1 t1 m2 t2 =
+(* L.warn "entering R.are_convertible"; *)
+ let g m1 t1 = step (ac_nfs f ~si r m1 t1) m2 t2 in
+ if r = false then f false else step g m1 t1
+
+and ac_stacks f ~si r m1 m2 =
+(* L.warn "entering R.are_convertible_stacks"; *)