From 4584d5ed48b9436ccedfeda4ca29769a30f13a2a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Bobot?= <francois@bobot.eu>
Date: Tue, 5 Feb 2013 22:41:30 +0100
Subject: [PATCH] [Solve] normalize in set_sem

---
 src/solver.ml     |  21 ++++--
 src/uninterp.ml   |   2 -
 tests/tests_uf.ml | 178 ++++++++++++++++++++++++----------------------
 3 files changed, 105 insertions(+), 96 deletions(-)

diff --git a/src/solver.ml b/src/solver.ml
index 6c50291e8..51c4cc95f 100644
--- a/src/solver.ml
+++ b/src/solver.ml
@@ -294,10 +294,15 @@ module Delayed = struct
 
   let is_repr t cl = Cl.equal (Cl.M.find cl t.env.repr) cl
 
+  let is_normalized t cl = Cl.M.mem cl t.env.repr
+
   let add_pending_merge (t : t) cl cl' =
+    assert (is_normalized t cl);
+    assert (is_normalized t cl');
     Queue.add (Merge (cl,cl')) t.todo
 
   let add_pending_set_sem (type a) (t : t) (sem : 'a sem) cl (v:'a) =
+    assert (is_normalized t cl);
     Queue.add (SetSem (sem,cl,v)) t.todo
 
   let get_dom t dom cl = get_dom t.env dom cl
@@ -344,7 +349,10 @@ module Delayed = struct
     Simple_vector.set t.env.sem sem (module SemTable');
     match cl' with
     | None -> ()
-    | Some cl' -> add_pending_merge t cl cl'
+    | Some cl' ->
+      (** come from invtable, can be just indexed *)
+      let cl' = normalize t cl' in
+      add_pending_merge t cl cl'
 
 (*
   merge:
@@ -356,8 +364,7 @@ module Delayed = struct
 *)
 
   let choose_repr cl1 cl2 =
-    (* (Shuffle.shufflep (cl1,cl2)) *)
-    (min cl1 cl2, max cl1 cl2)
+    (Shuffle.shufflep (cl1,cl2))
 
   let merge_sem t cl1 cl2 repr_cl =
     assert (Cl.equal repr_cl cl1 || Cl.equal repr_cl cl2);
@@ -451,7 +458,9 @@ module Delayed = struct
   let set_dom t = assert false
 
   let rec do_pending t =
-    try
+    if Queue.is_empty t.todo
+    then Debug.dprintf debug "[Solver] @[do_pending Nothing@]@."
+    else begin
       begin match Queue.pop t.todo with
       | Merge (cl1,cl2) ->
         Debug.dprintf debug "[Solver] @[do_pending Merge %a %a@]@."
@@ -463,9 +472,7 @@ module Delayed = struct
         set_sem_pending t sem cl v
       end;
       do_pending t
-    with Queue.Empty ->
-      Debug.dprintf debug "[Solver] @[do_pending Nothing@]@."
-
+    end
 
   let if_cl_change t cl f =
     let events = {clcallback = f}::(Cl.M.find_def [] cl t.env.event) in
diff --git a/src/uninterp.ml b/src/uninterp.ml
index 505ea90ce..23486db86 100644
--- a/src/uninterp.ml
+++ b/src/uninterp.ml
@@ -133,7 +133,6 @@ module Registered = RegisterSem(Th)
       Cl.print arg (Th.print Cl.print) s;
     Delayed.if_cl_change d arg (subst s)
 
-
   and subst t3 d ~old:t1 t2 =
     Debug.dprintf debug "[Uninterp] @[subst %a[%a -> %a]@]@."
       (Th.print Cl.print) t3 Cl.print t1 Cl.print t2;
@@ -152,7 +151,6 @@ module Registered = RegisterSem(Th)
       add_daemon d g s;
       Delayed.set_sem d sem cl3 s
 
-
   let propagate env =
     Solver.if_propagate_sem env sem
     ( fun d cl s ->
diff --git a/tests/tests_uf.ml b/tests/tests_uf.ml
index b11410f46..ad37332d3 100644
--- a/tests/tests_uf.ml
+++ b/tests/tests_uf.ml
@@ -1,7 +1,5 @@
 open OUnit
 
-let r = ref 0
-
 module Tests(E: sig end) = struct
 open Solver
 
@@ -77,7 +75,6 @@ let _2level' () =
 
 
 let bigger () =
-  incr r;
   let env = new_t () in
   Uninterp.propagate env;
   let f = Uninterp.fun1 env "f" in
@@ -86,13 +83,10 @@ let bigger () =
   let fa = !$ env (bf 1) in
   let fffa = !$ env (bf 3) in
   let fffffa = !$ env (bf 5) in
-  output_graph (Format.sprintf "bigger%i_1.dot" !r) env;
   equal env a fffa;
-  output_graph (Format.sprintf "bigger%i_2.dot" !r) env;
   assert_bool "a = f(f(f(a))) => f(a) != a"
     (not (is_equal env fa a));
   equal env fffffa a;
-  output_graph (Format.sprintf "bigger%i_3.dot" !r) env;
   assert_bool "a = f(f(f(a))) => f(f(f(f(f(a))))) = a => f(a) = a"
     (is_equal env fa a)
 
@@ -104,87 +98,97 @@ let congru1 = "Congru 1 arg" >::: ["refl" >:: refl; "congru" >:: congru;
                                    "bigger" >:: bigger]
 
 
-(* let gab = adde (g env a b) *)
-(* let gaa = adde (g env a a) *)
-(* let gbb = adde (g env b b) *)
-
-(* let refl () = assert_bool "g(a,b) = g(a,b)" (is_equal env gab gab) *)
-(* let congru () = assert_bool "a = b => g(a,b) = g(a,a)" *)
-(*   (is_equal (equal env a b) gab gaa) *)
-(* let notcongru () = assert_bool "a = g(a,b) => g(a,b) != g(a,a)" *)
-(*   (not (is_equal (equal env a gab) gab gaa)) *)
-(* let _2level () = *)
-(*   let ggabb = adde (g env gab b) in *)
-(*   (\* f(a,b) = a, show f(f(a,b),b) = a *\) *)
-(*   assert_bool "g(a,b) = a => g(g(a,b),b) = a" *)
-(*     (is_equal (equal env gab a) ggabb a) *)
-
-(* let congru2 = "congru 2 args" >::: ["refl" >:: refl; "congru" >:: congru; *)
-(*                                     "2level" >:: _2level;] *)
-
-(* let equal env x y = *)
-(*   let x = add env x in *)
-(*   let y = add env y in *)
-(*   equal env x y *)
-
-
-(* let is_equal env x y = *)
-(*   let x = add env x in *)
-(*   let y = add env y in *)
-(*   is_equal env x y *)
-
-
-(* let altergo1 = *)
-(*   "h(x)=x and g(a,x)=a ->  g(g(a,h(x)),x)=a" >:: *)
-(*     fun () -> *)
-(*       let env = Uf.empty in *)
-(*       let h = Uninterp.fun1 env "h" in *)
-(*       let g = Uninterp.fun2 env "g" in *)
-(*       let x = Uninterp.cst env "x" in *)
-(*       let a = Uninterp.cst env "a" in *)
-(*       let hx = h env x in *)
-(*       let env = equal env hx x in *)
-(*       let gax, env = g env a x in *)
-(*       let env = equal env gax a in *)
-(*       let hx, env = h env x in *)
-(*       let gahx, env = g env a hx in *)
-(*       let ggahxx, env = g env gahx x in *)
-(*       assert_bool "" (is_equal env ggahxx a) *)
-
-(* let altergo2 = *)
-(*   "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))" >:: *)
-(*     fun () -> *)
-(*       let env = Uf.empty in *)
-(*       let f = Uninterp.fun1 env "f" in *)
-(*       let h = Uninterp.fun2 env "h" in *)
-(*       let g = Uninterp.fun2 env "g" in *)
-(*       let x = Uninterp.cst env "x" in *)
-(*       let y = Uninterp.cst env "y" in *)
-(*       let a = Uninterp.cst env "a" in *)
-(*       let rec bf env n = if n < 1 then a else (fe (bf env (n-1))) in *)
-(*       let fffa, env = bf env 3 in *)
-(*       let env = equal env fffa a in *)
-(*       let fffffa, env = bf env 5 in *)
-(*       let env = equal env fffffa a in *)
-(*       let gxy, env = g env x y in *)
-(*       let env = equal env gxy x in *)
-(*       let ggxyy, env = g env gxy y in *)
-(*       let hggxyya, env = h env ggxyy a in *)
-(*       let fa, env = f env a in *)
-(*       let hxfa, env = h env x fa in *)
-(*       assert_bool "" (is_equal env hggxyya hxfa) *)
-
-
-
-(* let altergo = "altergo tests" >::: [altergo1; altergo2] *)
-
-(* let files = ["tests/tests_altergo_qualif.split"] *)
-
-(* let altergo = TestList (List.map Tests_lib.test_split files) *)
-
-
-let tests = TestList [basic;congru1;(*congru2;altergo *)]
+let gab = !$ env (g env a b)
+let gaa = !$ env (g env a a)
+let gbb = !$ env (g env b b)
+
+let refl () = assert_bool "g(a,b) = g(a,b)" (is_equal env gab gab)
+let congru () =
+  let env = new_handler env in
+  equal env a b;
+  assert_bool "a = b => g(a,b) = g(a,a)"
+    (is_equal env gab gaa)
+let notcongru () =
+  let env = new_handler env in
+  equal env a gab;
+  assert_bool "a = g(a,b) => g(a,b) != g(a,a)"
+    (not (is_equal env gab gaa))
+let _2level () =
+  let env = new_handler env in
+  let ggabb = !$ env (g env gab b) in
+  equal env gab a;
+  (* f(a,b) = a, show f(f(a,b),b) = a *)
+  assert_bool "g(a,b) = a => g(g(a,b),b) = a"
+    (is_equal env ggabb a)
+
+let congru2 = "congru 2 args" >::: ["refl" >:: refl; "congru" >:: congru;
+                                    "2level" >:: _2level;]
+
+let equal env x y =
+  let x = propagate env x in
+  let y = propagate env y in
+  equal env x y
+
+
+let is_equal env x y =
+  let x = propagate env x in
+  let y = propagate env y in
+  is_equal env x y
+
+
+let altergo1 =
+  "h(x)=x and g(a,x)=a ->  g(g(a,h(x)),x)=a" >::
+    fun () ->
+      let env = new_t () in
+      Uninterp.propagate env;
+      let h = Uninterp.fun1 env "h" in
+      let g = Uninterp.fun2 env "g" in
+      let x = Uninterp.cst env "x" in
+      let a = Uninterp.cst env "a" in
+      let hx = h env x in
+      equal env hx x;
+      let gax = g env a x in
+      equal env gax a;
+      let hx = h env x in
+      let gahx = g env a hx in
+      let ggahxx = g env gahx x in
+      assert_bool "" (is_equal env ggahxx a)
+
+let altergo2 =
+  "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))" >::
+    fun () ->
+      let env = new_t () in
+      Uninterp.propagate env;
+      let f = Uninterp.fun1 env "f" in
+      let h = Uninterp.fun2 env "h" in
+      let g = Uninterp.fun2 env "g" in
+      let x = Uninterp.cst env "x" in
+      let y = Uninterp.cst env "y" in
+      let a = Uninterp.cst env "a" in
+      let rec bf n = if n < 1 then !$ env a else !$ env (f env (bf (n-1))) in
+      let fffa = bf 3 in
+      equal env fffa a;
+      let fffffa = bf 5 in
+      equal env fffffa a;
+      let gxy = g env x y in
+      equal env gxy x;
+      let ggxyy = g env gxy y in
+      let hggxyya = h env ggxyy a in
+      let fa = f env a in
+      let hxfa = h env x fa in
+      assert_bool "" (is_equal env hggxyya hxfa)
+
+
+
+let altergo = "altergo tests" >::: [altergo1; altergo2]
+
+let files = ["tests/tests_altergo_qualif.split"]
+
+(* let altergo2 = TestList (List.map Tests_lib.test_split files) *)
+
+
+let tests = TestList [basic;congru1;congru2;altergo;(* altergo2 *)]
 
 end
 
-- 
GitLab