From da06bb7e3f6db3f3b83c52f6294995c8c63b05c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Bobot?= <francois.bobot@cea.fr>
Date: Mon, 1 Feb 2016 15:00:23 +0100
Subject: [PATCH] Use the simpler interface for the tests

   except for arith which is not yet converted
---
 src/scheduler.ml              |  16 --
 src/variable.ml               |   2 +-
 src/variable.mli              |   2 +-
 tests/tests_arith.ml          |  81 ++++----
 tests/tests_arith_uninterp.ml |  42 +++--
 tests/tests_bool.ml           |  64 +++----
 tests/tests_lib.ml            |  11 ++
 tests/tests_uf.ml             | 346 +++++++++++++++-------------------
 8 files changed, 262 insertions(+), 302 deletions(-)

diff --git a/src/scheduler.ml b/src/scheduler.ml
index 9ebd4dfe4..af719da6b 100644
--- a/src/scheduler.ml
+++ b/src/scheduler.ml
@@ -29,22 +29,6 @@ let new_env propagatel () =
   Scheduler.flush_delayed sched;
   sched
 
-let propagate sched cl =
-  let d = Scheduler.get_delayed sched in
-  ignore (Solver.Delayed.register d cl);
-  Scheduler.flush_delayed sched
-
-let merge sched cl1 cl2 =
-  let d = Scheduler.get_delayed sched in
-  Solver.Delayed.merge d Explanation.pexpfact cl1 cl2;
-  Scheduler.flush_delayed sched
-
-let is_equal sched cl1 cl2 =
-  Scheduler.stop_delayed sched;
-  Scheduler.run_inf_step sched;
-  let env = Scheduler.get_t sched in
-  Solver.is_equal env cl1 cl2
-
 let get_t = Scheduler.get_delayed
 
 let run_exn = Scheduler.run_exn
diff --git a/src/variable.ml b/src/variable.ml
index 8b1c3fff9..e21f49d6a 100644
--- a/src/variable.ml
+++ b/src/variable.ml
@@ -45,7 +45,7 @@ module EDem = Demon.Fast.Register(Dem)
 
 let cst =
   let h = DStr.H.create 10 in
-  fun _ ty s ->
+  fun ty s ->
     try
       let cl = DStr.H.find h s in
       assert (Ty.equal (Cl.ty cl) ty);
diff --git a/src/variable.mli b/src/variable.mli
index 850b68941..e8764dee8 100644
--- a/src/variable.mli
+++ b/src/variable.mli
@@ -23,7 +23,7 @@ open Types
 
 type make_dec = Cl.t -> Explanation.chogen
 
-val cst: Solver.d -> Ty.t -> string -> Cl.t
+val cst: Ty.t -> string -> Cl.t
 (** same string, same class *)
 
 val fresh: Ty.t -> string -> Cl.t
diff --git a/tests/tests_arith.ml b/tests/tests_arith.ml
index 216d82a02..63763d25f 100644
--- a/tests/tests_arith.ml
+++ b/tests/tests_arith.ml
@@ -6,46 +6,63 @@ open Scheduler
 let new_env =
   new_env [Variable.th_register; Uninterp.th_register; Arith.th_register]
 
+let register sched cl =
+  let d = Scheduler.get_delayed sched in
+  Solver.Delayed.register d cl;
+  Scheduler.flush_delayed sched
+
+let merge sched cl1 cl2 =
+  let d = Scheduler.get_delayed sched in
+  Solver.Delayed.merge d Explanation.pexpfact cl1 cl2;
+  Scheduler.flush_delayed sched
+
+let is_equal sched cl1 cl2 =
+  Scheduler.stop_delayed sched;
+  Scheduler.run_inf_step sched;
+  let env = Scheduler.get_t sched in
+  Solver.is_equal env cl1 cl2
+
+
 let solve0 () =
   let env = new_env () in
-  let a  = Variable.cst (get_t env) Arith.real "ar" in
-  let b  = Variable.cst (get_t env) Arith.real "br" in
+  let a  = Variable.cst Arith.real "ar" in
+  let b  = Variable.cst Arith.real "br" in
   let _1 = Arith.cst (get_t env) Q.one in
   let a1 = Arith.add (get_t env) a _1 in
   let b1 = Arith.add (get_t env) b _1 in
-  propagate env a1; propagate env b1;
+  register env a1; register env b1;
   merge env a1 b1;
   assert_bool "a+1 = b+1 => a = b" (is_equal env a b)
 
 let solve1 () =
   let env = new_env () in
-  let a,b  = Shuffle.seq2 (Variable.cst (get_t env) Arith.real) ("ar","br") in
+  let a,b  = Shuffle.seq2 (Variable.cst Arith.real) ("ar","br") in
   let _1 = Arith.cst (get_t env) Q.one in
   let a1 = Arith.add (get_t env) a _1 in
   let b1 = Arith.add (get_t env) b _1 in
   let _2 = Arith.cst (get_t env) (Q.of_int 2) in
   let a2 = Arith.add (get_t env) a _2 in
   let b2 = Arith.add (get_t env) b _2 in
-  Shuffle.seql' (propagate env) [a1; b1; a2; b2];
+  Shuffle.seql' (register env) [a1; b1; a2; b2];
   merge env a1 b1;
   assert_bool "a+1 = b+1 => a+2 = b+2" (is_equal env a2 b2)
 
 let solve2 () =
   let env = new_env () in
-  let a,b  = Shuffle.seq2 (Variable.cst (get_t env) Arith.real) ("ar","br") in
+  let a,b  = Shuffle.seq2 (Variable.cst Arith.real) ("ar","br") in
   let _1 = Arith.cst (get_t env) Q.one in
   let a1 = Arith.add (get_t env) a _1 in
   let b1 = Arith.add (get_t env) b _1 in
   let _2 = Arith.cst (get_t env) (Q.of_int 2) in
   let a2 = Arith.add (get_t env) a _2 in
   let b2 = Arith.add (get_t env) b _2 in
-  Shuffle.seql' (propagate env) [a1; b1; a2; b2];
+  Shuffle.seql' (register env) [a1; b1; a2; b2];
   merge env a2 b1;
   assert_bool "a+2 = b+1 => a+1 = b" (is_equal env a1 b)
 
 let solve3 () =
   let env = new_env () in
-  let a,b  = Shuffle.seq2 (Variable.cst (get_t env) Arith.real) ("ar","br") in
+  let a,b  = Shuffle.seq2 (Variable.cst Arith.real) ("ar","br") in
   let _1 = Arith.cst (get_t env) Q.one in
   let b1 = Arith.add (get_t env) b _1 in
   let _2 = Arith.cst (get_t env) (Q.of_int 2) in
@@ -53,15 +70,15 @@ let solve3 () =
   let _3 = Arith.cst (get_t env) (Q.of_int 3) in
    Shuffle.seql [
     (fun () ->
-      Shuffle.seql' (propagate env) [b1;a2];
+      Shuffle.seql' (register env) [b1;a2];
       merge env a2 b1;
     );
     (fun () ->
-      Shuffle.seql' (propagate env) [a;_2];
+      Shuffle.seql' (register env) [a;_2];
       merge env a _2;
     );
     (fun () ->
-      propagate env _3;
+      register env _3;
     );
    ];
   assert_bool "" (not (is_equal env b _2));
@@ -71,7 +88,7 @@ let solve3 () =
 let solve4 () =
   let env = new_env () in
   let a,b,c =
-    Shuffle.seq3 (Variable.cst (get_t env) Arith.real) ("ar","br","cr") in
+    Shuffle.seq3 (Variable.cst Arith.real) ("ar","br","cr") in
   let t1 = Arith.cst (get_t env) (Q.of_int 2) in
   let t1 = Arith.add (get_t env) t1 c in
   let t1 = Arith.add (get_t env) a t1  in
@@ -83,21 +100,21 @@ let solve4 () =
   let t3' = Arith.cst (get_t env) (Q.of_int (-3)) in
   Shuffle.seql [
     (fun () ->
-      Shuffle.seql' (propagate env) [t1;t1'];
+      Shuffle.seql' (register env) [t1;t1'];
       merge env t1 t1');
     (fun () ->
-      Shuffle.seql' (propagate env) [t2;t2'];
+      Shuffle.seql' (register env) [t2;t2'];
       merge env t2 t2');
-    (fun () -> propagate env t3');
+    (fun () -> register env t3');
   ];
   assert_bool "a+(2+c) = b+1 => a = 2 + b => c = -3" (is_equal env c t3')
 
 
 let solve5 () =
   let env = new_env () in
-  let a  = Variable.cst (get_t env) Arith.real "ar" in
-  let b  = Variable.cst (get_t env) Arith.real "br" in
-  let c  = Variable.cst (get_t env) Arith.real "cr" in
+  let a  = Variable.cst Arith.real "ar" in
+  let b  = Variable.cst Arith.real "br" in
+  let c  = Variable.cst Arith.real "cr" in
   let t1 = Arith.sub (get_t env) b c in
   let t1  = Arith.add (get_t env) a t1  in
   let t1' = (Arith.cst (get_t env) (Q.of_int 2)) in
@@ -107,13 +124,13 @@ let solve5 () =
   let t3' = Arith.add (get_t env) b b in
   Shuffle.seql [
     (fun () ->
-      Shuffle.seql' (propagate env) [t1;t1'];
+      Shuffle.seql' (register env) [t1;t1'];
       merge env t1 t1');
     (fun () ->
-      Shuffle.seql' (propagate env) [t2;t2'];
+      Shuffle.seql' (register env) [t2;t2'];
       merge env t2 t2');
     (fun () ->
-      Shuffle.seql' (propagate env) [t3;t3'];)
+      Shuffle.seql' (register env) [t3;t3'];)
   ];
   assert_bool "a+(b-c) = 2 => a = 2 => b + c = 2b" (is_equal env t3 t3')
 
@@ -122,8 +139,8 @@ let basic = "Arith.Basic" &: [solve0; solve1; solve2; solve3; solve4; solve5]
 
 let mult0 () =
   let env = new_env () in
-  let a  = Variable.cst (get_t env) Arith.real "ar" in
-  let b  = Variable.cst (get_t env) Arith.real "br" in
+  let a  = Variable.cst Arith.real "ar" in
+  let b  = Variable.cst Arith.real "br" in
   let t1  = Arith.sub (get_t env) a b  in
   let t1' = Arith.mult (get_t env) a b in
   let t2  = a in
@@ -132,22 +149,22 @@ let mult0 () =
   let t3' = Arith.cst (get_t env) (Q.of_int 1) in
   Shuffle.seql [
     (fun () ->
-      Shuffle.seql' (propagate env) [t1;t1'];
+      Shuffle.seql' (register env) [t1;t1'];
       merge env t1 t1');
     (fun () ->
-      Shuffle.seql' (propagate env) [t2;t2'];
+      Shuffle.seql' (register env) [t2;t2'];
       merge env t2 t2');
     (fun () ->
-      Shuffle.seql' (propagate env) [t3;t3'];)
+      Shuffle.seql' (register env) [t3;t3'];)
   ];
   assert_bool "a - b = a * b -> a = 1 -> 1 = 2b" (is_equal env t3 t3')
 
 (** test that mult normalization trigger the needed solve *)
 let mult1 () =
   let env = new_env () in
-  let a  = Variable.cst (get_t env) Arith.real "ar" in
-  let b  = Variable.cst (get_t env) Arith.real "br" in
-  let c  = Variable.cst (get_t env) Arith.real "cr" in
+  let a  = Variable.cst Arith.real "ar" in
+  let b  = Variable.cst Arith.real "br" in
+  let c  = Variable.cst Arith.real "cr" in
   let t1  = Arith.mult (get_t env) a b  in
   let t1  = Arith.add (get_t env) a t1  in
   let t1' = Arith.add (get_t env) b c in
@@ -158,13 +175,13 @@ let mult1 () =
   let t3' = Arith.cst (get_t env) (Q.of_int 1) in
   Shuffle.seql [
     (fun () ->
-      Shuffle.seql' (propagate env) [t1;t1'];
+      Shuffle.seql' (register env) [t1;t1'];
       merge env t1 t1');
     (fun () ->
-      Shuffle.seql' (propagate env) [t2;t2'];
+      Shuffle.seql' (register env) [t2;t2'];
       merge env t2 t2');
     (fun () ->
-      Shuffle.seql' (propagate env) [t3;t3'];)
+      Shuffle.seql' (register env) [t3;t3'];)
   ];
   assert_bool "a + (a * b) = (b + c) * a -> a = 2 -> c = 1"
     (is_equal env t3 t3')
diff --git a/tests/tests_arith_uninterp.ml b/tests/tests_arith_uninterp.ml
index efe7823c4..335614e19 100644
--- a/tests/tests_arith_uninterp.ml
+++ b/tests/tests_arith_uninterp.ml
@@ -3,30 +3,34 @@ open OUnit
 open Tests_lib
 open Scheduler
 
-let new_env = new_env [Variable.th_register; Uninterp.th_register; Arith.th_register]
+let theories = [Variable.th_register; Uninterp.th_register; Arith.th_register]
+let run = Scheduler.run_exn ~nodec:() ~theories
+let ($$) f x = f x
 
 let solve6 () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) Arith.real "ar" in
-  let b  = Variable.cst (get_t env) Arith.real "br" in
-  let c  = Variable.cst (get_t env) Arith.real "cr" in
+  let a  = Variable.fresh Arith.real "ar" in
+  let b  = Variable.fresh Arith.real "br" in
+  let c  = Variable.fresh Arith.real "cr" in
   let f = Uninterp.fun1 Arith.real "fr" in
-  let t1 = Arith.sub (get_t env) b c in
-  let t1  = Arith.add (get_t env) a t1  in
-  let t1' = (Arith.cst (get_t env) (Q.of_int 2)) in
-  let t2  = a in
-  let t2' = Arith.cst (get_t env) (Q.of_int 2) in
   let t3 = f c in
   let t3' = f b in
-  propagate env t3';
-  propagate env t3;
-  propagate env t1;
-  propagate env t1';
-  propagate env t2;
-  propagate env t2';
-  merge env t1 t1';
-  merge env t2 t2';
-  assert_bool "a+(b-c) = 2 => a = 2 => f b = f c" (is_equal env t3 t3')
+  let env = run $$ fun env ->
+      let t1 = Arith.sub env b c in
+      let t1  = Arith.add env a t1  in
+      let t1' = Arith.cst env (Q.of_int 2) in
+      let t2  = a in
+      let t2' = Arith.cst env (Q.of_int 2) in
+      register env t3';
+      register env t3;
+      register env t1;
+      register env t1';
+      register env t2;
+      register env t2';
+      merge env t1 t1';
+      merge env t2 t2'
+  in
+  assert_bool "a+(b-c) = 2 => a = 2 => f b = f c"
+    (Solver.Delayed.is_equal env t3 t3')
 
 
 
diff --git a/tests/tests_bool.ml b/tests/tests_bool.ml
index f277010fe..9f0fcac29 100644
--- a/tests/tests_bool.ml
+++ b/tests/tests_bool.ml
@@ -1,30 +1,12 @@
 open OUnit
 
+open Tests_lib
 open Scheduler
 
 let theories = [Variable.th_register; Uninterp.th_register; Bool.th_register]
 
-let new_env = new_env theories
-
-
-let is_true ?nodec sched cl1 =
-  Scheduler.stop_delayed sched;
-  Scheduler.run_inf_step ?nodec sched;
-  let env = Scheduler.get_delayed sched in
-  Bool.is_true env cl1
-
-let is_false ?nodec sched cl1 =
-  Scheduler.stop_delayed sched;
-  Scheduler.run_inf_step ?nodec sched;
-  let env = Scheduler.get_delayed sched in
-  Bool.is_false env cl1
-
-let set_true sched cl =
-  let d = Scheduler.get_delayed sched in
-  let pexp = Solver.Delayed.mk_pexp d Explanation.expfact () in
-  Bool.set_true d pexp cl;
-  Scheduler.flush_delayed sched
-
+let run = Scheduler.run_exn ~nodec:() ~theories
+let ($$) f x = f x
 
 let true_is_true () =
   let env = Scheduler.run_exn ~nodec:() ~theories (fun _ -> ()) in
@@ -33,45 +15,41 @@ let true_is_true () =
 
 let not_true_is_false () =
   let not_true = Bool._not Bool._true in
-  let env = Scheduler.run_exn ~nodec:() ~theories begin fun env ->
-      Solver.Delayed.register env not_true
-    end
-  in
+  let env = run $$ fun env -> Solver.Delayed.register env not_true in
   assert_bool "" (Bool.is_false env not_true);
   assert_bool "" (not (Bool.is_true env not_true))
 
 let and_true_is_true () =
-  let env = new_env () in
   let _t = Bool._true in
   let _and = Bool._and [_t;_t;_t] in
-  propagate env _and;
-  assert_bool "" (is_true ~nodec:true env _and);
-  assert_bool "" (not (is_false ~nodec:true env _and))
+  let env = run $$ fun env -> Solver.Delayed.register env _and in
+  assert_bool "" (Bool.is_true env _and);
+  assert_bool "" (not (Bool.is_false env _and))
 
 let or_not_true_is_false () =
-  let env = new_env () in
   let _f = (Bool._not Bool._true) in
   let _or = Bool._and [_f;_f;_f] in
-  propagate env _or;
-  assert_bool "" (is_false ~nodec:true env _or);
-  assert_bool "" (not (is_true ~nodec:true env _or))
+  let env = run $$ fun env -> Solver.Delayed.register env _or in
+  assert_bool "" (Bool.is_false env _or);
+  assert_bool "" (not (Bool.is_true env _or))
 
 let merge_true () =
-  let env = new_env () in
   let a  = Variable.fresh Bool.ty "a" in
   let b  = Variable.fresh Bool.ty "b" in
   let c  = Variable.fresh Bool.ty "c" in
   let d  = Variable.fresh Bool.ty "d" in
   let _and = Bool._and [a;b;c] in
-  propagate env _and;
-  List.iter (propagate env) [a;b;c;d];
-  Shuffle.seql
-    [(fun () -> merge env a b);
-     (fun () -> merge env a c);
-];
-     merge env a d;
-     set_true env d;
-  assert_bool "" (is_true ~nodec:true env _and)
+  let env = run $$ fun env ->
+      Solver.Delayed.register env _and;
+      List.iter (Solver.Delayed.register env) [a;b;c;d];
+      Shuffle.seql
+        [(fun () -> merge env a b);
+         (fun () -> merge env a c);
+        ];
+      merge env a d;
+      Bool.set_true env Explanation.pexpfact d;
+  in
+  assert_bool "" (Bool.is_true env _and)
 
 
 
diff --git a/tests/tests_lib.ml b/tests/tests_lib.ml
index 198b223ca..c2edb1c18 100644
--- a/tests/tests_lib.ml
+++ b/tests/tests_lib.ml
@@ -46,3 +46,14 @@ let (&:) s l = s >::: (List.map (fun f -> TestCase f) l)
 
 let ty_ctr = Types.Ty.Constr.create "a"
 let ty = Types.Ty.ctr ty_ctr
+
+
+let register d cl =
+  Solver.Delayed.register d cl;
+  Solver.Delayed.flush d
+
+let merge d cl1 cl2 =
+  Solver.Delayed.merge d Explanation.pexpfact cl1 cl2;
+  Solver.Delayed.flush d
+
+let is_equal = Solver.Delayed.is_equal
diff --git a/tests/tests_uf.ml b/tests/tests_uf.ml
index f4df81cdf..7e1c675de 100644
--- a/tests/tests_uf.ml
+++ b/tests/tests_uf.ml
@@ -3,127 +3,117 @@ open OUnit
 open Tests_lib
 open Scheduler
 
-let new_env = new_env [Variable.th_register; Uninterp.th_register]
+let theories = [Variable.th_register; Uninterp.th_register]
+let run = Scheduler.run_exn ~nodec:() ~theories
+let ($$) f x = f x
+
+let a  = Variable.fresh ty "a"
+let b  = Variable.fresh ty "b"
+let c  = Variable.fresh ty "c"
+
 
 let empty () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  propagate env a; propagate env b;
+  let env = run $$ fun env ->
+      register env a; register env b;
+  in
   assert_bool "a != b" (not (is_equal env a b))
 
 let tauto () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  propagate env a; propagate env b;
-  merge env a b;
+  let env = run $$ fun env ->
+      register env a; register env b;
+      merge env a b;
+  in
   assert_bool "a = b => a = b"
   (is_equal env a b)
 
 let trans () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let c  = Variable.cst (get_t env) ty "c" in
-  propagate env a; propagate env b; propagate env c;
-  merge env a b; merge env b c;
+  let env = run $$ fun env ->
+      register env a; register env b; register env c;
+      merge env a b; merge env b c;
+  in
   assert_bool "a = b => b = c => a = c" (is_equal env a c);
   assert_bool "a = b => b = c => a = b" (is_equal env a b);
   assert_bool "a = b => b = c => b = c" (is_equal env b c)
 
 let noteq () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let c  = Variable.cst (get_t env) ty "c" in
-  propagate env a; propagate env b; propagate env c;
-  merge env b c;
+  let env = run $$ fun env ->
+      register env a; register env b; register env c;
+      merge env b c;
+  in
   assert_bool "b = c => a != c" (not (is_equal env a c))
 
 let basic = "Uf.Basic" >::: ["empty" >:: empty; "tauto" >:: tauto;
                          "trans" >:: trans; "noteq" >:: noteq]
 
+let f  = Uninterp.fun1 ty "f"
+let fa = f a
+let fb = f b
+let ffa = f (f a)
+let ffb = f (f b)
+
 let refl () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let f  = Uninterp.fun1 ty "f" in
-  let fa = f a in
-  propagate env fa;
+  let env = run $$ fun env ->
+      register env fa;
+  in
   assert_bool "f(a) = f(a)" (is_equal env fa fa)
+
 let empty () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let f  = Uninterp.fun1 ty "f" in
-  let fa = f a in
-  let fb = f b in
-  propagate env fa; propagate env fb;
+  let env = run $$ fun env ->
+      register env fa; register env fb;
+  in
   assert_bool "f(a) != f(b)" (not (is_equal env fa fb))
+
 let congru () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let f  = Uninterp.fun1 ty "f" in
-  let fa = f a in
-  let fb = f b in
-  Shuffle.seql [
-    (fun () -> propagate env fa);
-    (fun () -> propagate env fb);
-    (fun () -> propagate env a);
-    (fun () -> propagate env b);
-  ];
-  merge env a b;
+  let env = run $$ fun env ->
+      Shuffle.seql [
+        (fun () -> register env fa);
+        (fun () -> register env fb);
+        (fun () -> register env a);
+        (fun () -> register env b);
+      ];
+      merge env a b;
+  in
   assert_bool "a = b => f(a) = f(b)"
     (is_equal env fa fb)
 
 let _2level () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let f  = Uninterp.fun1 ty "f" in
-  let ffa = f (f a) in
-  let ffb = f (f b) in
-  Shuffle.seql [
-    (fun () -> propagate env ffa);
-    (fun () -> propagate env ffb);
-    (fun () -> propagate env a);
-    (fun () -> propagate env b);
-  ];
-  merge env a b;
+  let env = run $$ fun env ->
+      Shuffle.seql [
+        (fun () -> register env ffa);
+        (fun () -> register env ffb);
+        (fun () -> register env a);
+        (fun () -> register env b);
+      ];
+      merge env a b;
+  in
   assert_bool "a = b => f(f(a)) = f(f(b))"
   (is_equal env ffa ffb)
 
 let _2level' () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let f  = Uninterp.fun1 ty "f" in
-  let ffa = f (f a) in
-  let ffb = f (f b) in
-  propagate env a; propagate env b;
-  merge env a b;
-  propagate env ffa; propagate env ffb;
+  let env = run $$ fun env ->
+      register env a; register env b;
+      merge env a b;
+      register env ffa; register env ffb;
+  in
   assert_bool "a = b => f(f(a)) = f(f(b))" (is_equal env ffa ffb)
 
 
 let bigger () =
-  let env = new_env () in
-  let f = Uninterp.fun1 ty "f" in
-  let a = Variable.cst (get_t env) ty "a" in
   let rec bf n = if n < 1 then a else (f (bf(n-1))) in
   let fa = bf 1 in
   let fffa = bf 3 in
   let fffffa = bf 5 in
-  Shuffle.seql
-    [(fun () -> propagate env a);
-     (fun () -> propagate env fa);
-     (fun () -> propagate env fffa);
-     (fun () -> propagate env fffffa);
-    ];
-  Shuffle.seql
-    [(fun () -> merge env a fffa);
-     (fun () -> merge env fffffa a)];
+  let env = run $$ fun env ->
+      Shuffle.seql
+        [(fun () -> register env a);
+         (fun () -> register env fa);
+         (fun () -> register env fffa);
+         (fun () -> register env fffffa);
+        ];
+      Shuffle.seql
+        [(fun () -> merge env a fffa);
+         (fun () -> merge env fffffa a)];
+  in
   assert_bool "a = f(f(f(a))) => f(f(f(f(f(a))))) = a => f(a) = a"
     (is_equal env fa a)
 
@@ -135,59 +125,47 @@ let congru1 = "Uf.Congru 1 arg" >::: ["refl" >:: refl; "congru" >:: congru;
                                    "bigger" >:: bigger]
 
 
+let g  = Uninterp.fun2 ty "g"
+let gab = g a b
+let gaa = g a a
+let ggabb = g gab b
+
 let refl () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let g  = Uninterp.fun2 ty "g" in
-  let gab = g a b in
-  propagate env gab;
+  let env = run $$ fun env -> register env gab in
   assert_bool "g(a,b) = g(a,b)" (is_equal env gab gab)
 
 let congru () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let g  = Uninterp.fun2 ty "g" in
-  let gab = g a b in
-  let gaa = g a a in
-  Shuffle.seql [
-    (fun () -> propagate env gab);
-    (fun () -> propagate env gaa);
-    (fun () -> propagate env a);
-    (fun () -> propagate env b);
-  ];
-  merge env a b;
+  let env = run $$ fun env ->
+      Shuffle.seql [
+        (fun () -> register env gab);
+        (fun () -> register env gaa);
+        (fun () -> register env a);
+        (fun () -> register env b);
+      ];
+      merge env a b;
+  in
   assert_bool "a = b => g(a,b) = g(a,a)"
     (is_equal env gab gaa)
 
 let notcongru () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let g  = Uninterp.fun2 ty "g" in
-  let gab = g a b in
-  let gaa = g a a in
-  propagate env a; propagate env gab; propagate env gaa;
-  merge env a gab;
+  let env = run $$ fun env ->
+      register env a; register env gab; register env gaa;
+      merge env a gab;
+  in
   assert_bool "a = g(a,b) => g(a,b) != g(a,a)"
     (not (is_equal env gab gaa))
 
 let _2level () =
-  let env = new_env () in
-  let a  = Variable.cst (get_t env) ty "a" in
-  let b  = Variable.cst (get_t env) ty "b" in
-  let g  = Uninterp.fun2 ty "g" in
-  let gab = g a b in
-  let ggabb = g gab b in
-  Shuffle.seql [
-    (fun () -> propagate env a);
-    (fun () -> propagate env gab);
-  ];
-  Shuffle.seql [
-    (fun () -> merge env gab a;);
-    (fun () -> propagate env ggabb);
-  ];
+  let env = run $$ fun env ->
+      Shuffle.seql [
+        (fun () -> register env a);
+        (fun () -> register env gab);
+      ];
+      Shuffle.seql [
+        (fun () -> merge env gab a;);
+        (fun () -> register env ggabb);
+      ];
+  in
   assert_bool "g(a,b) = a => g(g(a,b),b) = a"
     (is_equal env ggabb a)
 
@@ -195,81 +173,69 @@ let congru2 = "Uf.congru 2 args" >::: ["refl" >:: refl; "congru" >:: congru;
                                     "2level" >:: _2level;]
 
 let merge env x y =
-  propagate env x;
-  propagate env y;
+  register env x;
+  register env y;
   merge env x y
 
-
-let is_equal env x y =
-  propagate env x;
-  propagate env y;
-  is_equal env x y
-
-
-let altergo0 =
-    fun () ->
-      let env = new_env () in
-      let h = Uninterp.fun1 ty "h" in
-      let g = Uninterp.fun2 ty "g" in
-      let x = Variable.cst (get_t env) ty "x" in
-      let a = Variable.cst (get_t env) ty "a" in
-      let hx = h x in
-      let gax = g a x in
+let x = Variable.fresh ty "x"
+let y = Variable.fresh ty "y"
+
+let altergo0 () =
+  let h = Uninterp.fun1 ty "h" in
+  let g = Uninterp.fun2 ty "g" in
+  let gax = g a x in
+  let hx = h x in
+  let gahx = g a hx in
+  let ggahxx = g gahx x in
+  let env = run $$ fun env ->
       Shuffle.seql
         [(fun () -> merge env hx x);
          (fun () -> merge env gax a)];
-      let hx = h x in
-      let gahx = g a hx in
-      let ggahxx = g gahx x in
-      assert_bool "h(x)=x and g(a,x)=a ->  g(g(a,h(x)),x)=a"
-        (is_equal env ggahxx a)
-
-let altergo1 =
-    fun () ->
-      let env = new_env () in
-      let f = Uninterp.fun1 ty "f" in
-      let h = Uninterp.fun2 ty "h" in
-      let g = Uninterp.fun2 ty "g" in
-      let x = Variable.cst (get_t env) ty "x" in
-      let y = Variable.cst (get_t env) ty "y" in
-      let a = Variable.cst (get_t env) ty "a" in
-      let rec bf n = if n < 1 then a else f (bf (n-1)) in
-      let fffa = bf 3 in
-      let fffffa = bf 5 in
-      let gxy = g x y in
+      register env ggahxx
+  in
+  assert_bool "h(x)=x and g(a,x)=a ->  g(g(a,h(x)),x)=a"
+    (is_equal env ggahxx a)
+
+let altergo1 () =
+  let h = Uninterp.fun2 ty "h" in
+  let rec bf n = if n < 1 then a else f (bf (n-1)) in
+  let fffa = bf 3 in
+  let fffffa = bf 5 in
+  let gxy = g x y in
+  let ggxyy = g gxy y in
+  let hggxyya = h ggxyy a in
+  let fa = f a in
+  let hxfa = h x fa in
+  let env = run $$ fun env ->
       Shuffle.seql
-      [(fun () -> merge env fffa a);
-       (fun () -> merge env fffffa a);
-       (fun () -> merge env gxy x)];
-      let ggxyy = g gxy y in
-      let hggxyya = h ggxyy a in
-      let fa = f a in
-      let hxfa = h x fa in
-      assert_bool
-      "f(f(f(a)))=a and f(f(f(f(f(a)))))=a and g(x,y)=x -> \
-       h(g(g(x,y),y),a)=h(x,f(a))"
-        (is_equal env hggxyya hxfa)
-
-let altergo2 =
-    fun () ->
-      let env = new_env () in
-      let f = Uninterp.fun1 ty "f" in
-      let h = Uninterp.fun2 ty "h" in
-      let g = Uninterp.fun2 ty "g" in
-      let x = Variable.cst (get_t env) ty "x" in
-      let y = Variable.cst (get_t env) ty "y" in
-      let a = Variable.cst (get_t env) ty "a" in
-      let gxy = g x y in
-      let fa = f a in
+        [(fun () -> merge env fffa a);
+         (fun () -> merge env fffffa a);
+         (fun () -> merge env gxy x)];
+      register env hggxyya;
+      register env hxfa;
+  in
+  assert_bool
+    "f(f(f(a)))=a and f(f(f(f(f(a)))))=a and g(x,y)=x -> \
+     h(g(g(x,y),y),a)=h(x,f(a))"
+    (is_equal env hggxyya hxfa)
+
+let altergo2 () =
+  let h = Uninterp.fun2 ty "h" in
+  let gxy = g x y in
+  let fa = f a in
+  let ggxyy = g gxy y in
+  let hggxyya = h ggxyy a in
+  let hxfa = h x fa in
+  let env = run $$ fun env ->
       Shuffle.seql
-      [(fun () -> merge env fa a);
-       (fun () -> merge env gxy x)];
-      let ggxyy = g gxy y in
-      let hggxyya = h ggxyy a in
-      let hxfa = h x fa in
-      assert_bool
-      "f(a) = a -> g(x,y)=x -> h(g(g(x,y),y),a)=h(x,f(a))"
-        (is_equal env hggxyya hxfa)
+        [(fun () -> merge env fa a);
+         (fun () -> merge env gxy x)];
+      register env hggxyya;
+      register env hxfa;
+  in
+  assert_bool
+    "f(a) = a -> g(x,y)=x -> h(g(g(x,y),y),a)=h(x,f(a))"
+    (is_equal env hggxyya hxfa)
 
 
 
-- 
GitLab