diff --git a/src_colibri2/tests/solve/smt_lra/unsat/dune.inc b/src_colibri2/tests/solve/smt_lra/unsat/dune.inc index 158dbfb654811f89857a648a91f73fac03bc27a7..15e7954362f0fe2c08eceacac40b83757b38cd13 100644 --- a/src_colibri2/tests/solve/smt_lra/unsat/dune.inc +++ b/src_colibri2/tests/solve/smt_lra/unsat/dune.inc @@ -7,6 +7,8 @@ (rule (alias runtest) (action (diff oracle le.smt2.res))) (rule (action (with-stdout-to le2.smt2.res (run %{bin:colibri2} --max-step 1000 %{dep:le2.smt2})))) (rule (alias runtest) (action (diff oracle le2.smt2.res))) +(rule (action (with-stdout-to mul.smt2.res (run %{bin:colibri2} --max-step 1000 %{dep:mul.smt2})))) +(rule (alias runtest) (action (diff oracle mul.smt2.res))) (rule (action (with-stdout-to solver_merge_itself_repr_empty.smt2.res (run %{bin:colibri2} --max-step 1000 %{dep:solver_merge_itself_repr_empty.smt2})))) (rule (alias runtest) (action (diff oracle solver_merge_itself_repr_empty.smt2.res))) (rule (action (with-stdout-to solver_set_sem_merge_sign.smt2.res (run %{bin:colibri2} --max-step 1000 %{dep:solver_set_sem_merge_sign.smt2})))) diff --git a/src_colibri2/tests/solve/smt_lra/unsat/mul.smt2 b/src_colibri2/tests/solve/smt_lra/unsat/mul.smt2 new file mode 100644 index 0000000000000000000000000000000000000000..d35edbc7f6495e63f987ce0e0c38ce82edc6339c --- /dev/null +++ b/src_colibri2/tests/solve/smt_lra/unsat/mul.smt2 @@ -0,0 +1,17 @@ +(set-logic ALL) + +(declare-fun a () Real) +(declare-fun b () Real) +(declare-fun t1 () Real) +(declare-fun t1_ () Real) +(declare-fun t2 () Real) + +(assert (= t1 (- a b))) +(assert (= t1_ (* a b))) +(assert (= t2 (* 2.0 b))) + +(assert (= t1 t1_)) +(assert (= a 1.0)) +(assert (not (= 1.0 t2))) + +(check-sat) diff --git a/src_colibri2/tests/tests_LRA.ml b/src_colibri2/tests/tests_LRA.ml index 2929d544f4c5807502a95d3bf877382514921d48..7c6aac47964728e7ecaae55f070f81e970d0faef 100644 --- a/src_colibri2/tests/tests_LRA.ml +++ b/src_colibri2/tests/tests_LRA.ml @@ -50,18 +50,18 @@ let solve0a _ = in assert_bool "a+1 = 1 => a = 0" (is_equal env a LRA.RealValue.zero) -(* let solve0b _ = - * let a = fresh Term._Real "ar" in - * let _1 = LRA.RealValue.cst Q.one in - * let _2 = LRA.RealValue.cst Q.two in - * let _4 = LRA.RealValue.cst (Q.of_int 4) in - * let a1 = LRA.add a _1 in - * let _2a2 = LRA.add' Q.two a Q.one _2 in - * let env = run $$ fun env -> - * List.iter (register env) [a1;_1;_2;_4;_2a2]; - * merge env a1 _2 - * in - * assert_bool "a+1 = 2 => 2*a+2 = 4" (is_equal env _2a2 _4) *) +let solve0b _ = + let a = fresh Ty.real "ar" in + let _1 = LRA.RealValue.cst Q.one in + let _2 = LRA.RealValue.cst Q.two in + let _4 = LRA.RealValue.cst (Q.of_int 4) in + let a1 = LRA.add a _1 in + let _2a2 = LRA.add' Q.two a Q.one _2 in + let env = run $$ fun env -> + List.iter (register env) [a1;_1;_2;_4;_2a2]; + merge env a1 _2 + in + assert_bool "a+1 = 2 => 2*a+2 = 4" (is_equal env _2a2 _4) let solve0c _ = let a = fresh Ty.real "ar" in @@ -192,66 +192,65 @@ let basic = "LRA.Basic" &: solve5 ] -(* let mult0 _ = - * let a = fresh Ty.real "ar" in - * let b = fresh Ty.real "br" in - * let t1 = LRA.sub a b in - * let t1' = LRA.mult a b in - * let t2 = a in - * let t2' = LRA.RealValue.cst (Q.of_int 1) in - * let t3 = LRA.mult_cst (Q.of_int 2) b in - * let t3' = LRA.RealValue.cst (Q.of_int 1) in - * let env = run $$ fun env -> - * Shuffle.seql [ - * (fun () -> - * Shuffle.seql' (register env) [t1;t1']; - * merge env t1 t1'); - * (fun () -> - * Shuffle.seql' (register env) [t2;t2']; - * merge env t2 t2'); - * (fun () -> - * Shuffle.seql' (register env) [t3;t3'];) - * ] - * in - * 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 a = fresh Ty.real "ar" in - * let b = fresh Ty.real "br" in - * let c = fresh Ty.real "cr" in - * let t1 = LRA.mult a b in - * let t1 = LRA.add a t1 in - * let t1' = LRA.add b c in - * let t1' = LRA.mult t1' a in - * let t2 = a in - * let t2' = LRA.RealValue.cst (Q.of_int 2) in - * let t3 = c in - * let t3' = LRA.RealValue.cst (Q.of_int 1) in - * let env = run $$ fun env -> - * Shuffle.seql [ - * (fun () -> - * Shuffle.seql' (register env) [t1;t1']; - * merge env t1 t1'); - * (fun () -> - * Shuffle.seql' (register env) [t2;t2']; - * merge env t2 t2'); - * (fun () -> - * Shuffle.seql' (register env) [t3;t3'];) - * ] - * in - * assert_bool "a + (a * b) = (b + c) * a -> a = 2 -> c = 1" - * (is_equal env t3 t3') - * - * let mult = "LRA.Mult" &: [mult0;mult1] - * - * - * let files = ["tests/tests_altergo_arith.split"; +let mult0 _ = + let a = fresh Ty.real "ar" in + let b = fresh Ty.real "br" in + let t1 = LRA.sub a b in + let t1' = LRA.mult a b in + let t2 = a in + let t2' = LRA.RealValue.cst (Q.of_int 1) in + let t3 = LRA.mult_cst (Q.of_int 2) b in + let t3' = LRA.RealValue.cst (Q.of_int 1) in + let env = run $$ fun env -> + Shuffle.seql [ + (fun () -> + Shuffle.seql' (register env) [t1;t1']; + merge env t1 t1'); + (fun () -> + Shuffle.seql' (register env) [t2;t2']; + merge env t2 t2'); + (fun () -> + Shuffle.seql' (register env) [t3;t3'];) + ] + in + 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 a = fresh Ty.real "ar" in + let b = fresh Ty.real "br" in + let c = fresh Ty.real "cr" in + let t1 = LRA.mult a b in + let t1 = LRA.add a t1 in + let t1' = LRA.add b c in + let t1' = LRA.mult t1' a in + let t2 = a in + let t2' = LRA.RealValue.cst (Q.of_int 2) in + let t3 = c in + let t3' = LRA.RealValue.cst (Q.of_int 1) in + let env = run $$ fun env -> + Shuffle.seql [ + (fun () -> + Shuffle.seql' (register env) [t1;t1']; + merge env t1 t1'); + (fun () -> + Shuffle.seql' (register env) [t2;t2']; + merge env t2 t2'); + (fun () -> + Shuffle.seql' (register env) [t3;t3'];) + ] + in + assert_bool "a + (a * b) = (b + c) * a -> a = 2 -> c = 1" + (is_equal env t3 t3') + +let mult = "LRA.Mult" &: [mult0;mult1] + + +(* let files = ["tests/tests_altergo_arith.split"; * "tests/tests_popop.split"; * "tests/tests_altergo_qualif.split" * ] * - * let altergo = TestList (List.map Tests_lib.test_split files) -*) + * let altergo = TestList (List.map Tests_lib.test_split files) *) -let tests = test_list [basic;(* (\* mult;*\)altergo;*) (* smtlib2sat; smtlib2unsat *)] +let tests = test_list [basic;mult; (* altergo;*) (* smtlib2sat; smtlib2unsat *)] diff --git a/src_colibri2/theories/LRA/LRA.ml b/src_colibri2/theories/LRA/LRA.ml index cb4ce0a571f81acc268c52eae69a7204f81c6f71..f73a862fc6d3e6dc8edf4748dccef211327aa290 100644 --- a/src_colibri2/theories/LRA/LRA.ml +++ b/src_colibri2/theories/LRA/LRA.ml @@ -61,6 +61,7 @@ let th_register env = Dom_polynome.init env; RealValue.init env; Fourier.init env; + Mul.init env; () let () = Egraph.add_default_theory th_register diff --git a/src_colibri2/theories/LRA/mul.ml b/src_colibri2/theories/LRA/mul.ml index cbb9a2d40bcadac0c6d9da0f467546ec6e4ba619..2daa4f5bcce43ffb06e1fdc88f491f96a43d0cfd 100644 --- a/src_colibri2/theories/LRA/mul.ml +++ b/src_colibri2/theories/LRA/mul.ml @@ -16,8 +16,6 @@ let converter d (f:Ground.t) = end | _ -> () -let th_register env = +let init env = init env; Ground.register_converter env converter - -let () = Egraph.add_default_theory th_register diff --git a/src_colibri2/theories/LRA/mul.mli b/src_colibri2/theories/LRA/mul.mli new file mode 100644 index 0000000000000000000000000000000000000000..d8be888cc36ed8675a495c4a6d0be604b343f714 --- /dev/null +++ b/src_colibri2/theories/LRA/mul.mli @@ -0,0 +1 @@ +val init: Egraph.t -> unit