From 52cd9797ed538d0f9a2bca2725641f1472543ffc Mon Sep 17 00:00:00 2001 From: "Hichem R. A" <hichem.ait-el-hara@ocamlpro.com> Date: Sun, 12 Mar 2023 19:23:11 +0100 Subject: [PATCH] [Array] Improved converter, added some tests, cleaned some code --- colibri2/tests/solve/smt_array/sat/dune | 8 - colibri2/tests/solve/smt_array/sat/dune.inc | 66 ++--- .../{step_limit_reached => sat}/test1.smt2 | 0 .../smt_array/step_limit_reached/notes.txt | 18 +- .../smt_array/step_limit_reached/test3.smt2 | 10 + .../smt_array/step_limit_reached/test4.smt2 | 12 + .../tests/solve/smt_array/unknown/test.smt2 | 5 - colibri2/tests/solve/smt_array/unsat/dune | 8 - colibri2/tests/solve/smt_array/unsat/dune.inc | 192 -------------- colibri2/theories/array/Array_Id_dom.ml | 26 -- colibri2/theories/array/Array_Id_dom.mli | 22 -- .../theories/array/{Index_Id_dom.ml => Id.ml} | 12 +- .../array/{Index_Id_dom.mli => Id.mli} | 3 +- colibri2/theories/array/RWRules.ml | 75 +++--- colibri2/theories/array/WEGraph.ml | 241 +++++++++--------- colibri2/theories/array/WEGraph.mli | 1 + colibri2/theories/array/array.ml | 59 ++--- colibri2/theories/array/array_value.ml | 58 +++-- colibri2/theories/array/common.ml | 25 +- colibri2/theories/array/common.mli | 7 +- 20 files changed, 305 insertions(+), 543 deletions(-) rename colibri2/tests/solve/smt_array/{step_limit_reached => sat}/test1.smt2 (100%) create mode 100644 colibri2/tests/solve/smt_array/step_limit_reached/test3.smt2 create mode 100644 colibri2/tests/solve/smt_array/step_limit_reached/test4.smt2 delete mode 100644 colibri2/tests/solve/smt_array/unknown/test.smt2 delete mode 100644 colibri2/theories/array/Array_Id_dom.ml delete mode 100644 colibri2/theories/array/Array_Id_dom.mli rename colibri2/theories/array/{Index_Id_dom.ml => Id.ml} (85%) rename colibri2/theories/array/{Index_Id_dom.mli => Id.mli} (96%) diff --git a/colibri2/tests/solve/smt_array/sat/dune b/colibri2/tests/solve/smt_array/sat/dune index c645c9fbd..1a9a66cd4 100644 --- a/colibri2/tests/solve/smt_array/sat/dune +++ b/colibri2/tests/solve/smt_array/sat/dune @@ -19,14 +19,6 @@ --options "array-wegraph" --options - "array-choice" - --options - "array-res-ext array-choice" - --options - "array-res-ext array-res-aup array-choice" - --options - "array-wegraph array-choice" - --options "array-wegraph array-res-ext" --options "array-wegraph array-res-ext array-res-aup" diff --git a/colibri2/tests/solve/smt_array/sat/dune.inc b/colibri2/tests/solve/smt_array/sat/dune.inc index b97809dc1..a857a17e3 100644 --- a/colibri2/tests/solve/smt_array/sat/dune.inc +++ b/colibri2/tests/solve/smt_array/sat/dune.inc @@ -8,6 +8,9 @@ --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --check-status sat +--dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --check-status sat --learning --dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --check-status sat --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --check-status sat @@ -20,6 +23,9 @@ --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --check-status sat +--dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --check-status sat --learning --dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --check-status sat --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --check-status sat @@ -32,6 +38,9 @@ --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --check-status sat +--dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --check-status sat --learning --dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --check-status sat --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status sat @@ -44,56 +53,11 @@ --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status sat +--dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status sat --learning --dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status sat --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat ---dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat --learning --dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat ---dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat ---dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat ---dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat --learning --dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat ---dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat ---dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat ---dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat --learning --dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat ---dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat ---dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat ---dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat --learning --dont-print-result %{dep:imp1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat ---dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat ---dont-print-result %{dep:test2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat --dont-print-result %{dep:eq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) @@ -104,6 +68,9 @@ --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat +--dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat --learning --dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --array-res-aup --check-status sat @@ -116,5 +83,8 @@ --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --array-res-aup --check-status sat --learning --dont-print-result %{dep:neq.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --array-res-aup --check-status sat +--dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --array-res-aup --check-status sat --learning --dont-print-result %{dep:test1.smt2})) (package colibri2)) +(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --array-res-aup --check-status sat --dont-print-result %{dep:test2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --array-res-aup --check-status sat --learning --dont-print-result %{dep:test2.smt2})) (package colibri2)) diff --git a/colibri2/tests/solve/smt_array/step_limit_reached/test1.smt2 b/colibri2/tests/solve/smt_array/sat/test1.smt2 similarity index 100% rename from colibri2/tests/solve/smt_array/step_limit_reached/test1.smt2 rename to colibri2/tests/solve/smt_array/sat/test1.smt2 diff --git a/colibri2/tests/solve/smt_array/step_limit_reached/notes.txt b/colibri2/tests/solve/smt_array/step_limit_reached/notes.txt index bea66e0bf..fbc29c056 100644 --- a/colibri2/tests/solve/smt_array/step_limit_reached/notes.txt +++ b/colibri2/tests/solve/smt_array/step_limit_reached/notes.txt @@ -1,6 +1,14 @@ -- sat/test1.smt2: - "--array-wegraph --array-res-ext" - "--array-wegraph --array-res-ext --array-res-aup" +- sat/test3.smt2: + works with: + - "--array-res-ext" + - "--array-wegraph --array-res-ext" + +- sat/test4.smt2: + works with: + - "" + - "--array-wegraph" + - unsat/distinct2: - "" - "--array-wegraph" \ No newline at end of file + fails with: + - "" + - "--array-wegraph" diff --git a/colibri2/tests/solve/smt_array/step_limit_reached/test3.smt2 b/colibri2/tests/solve/smt_array/step_limit_reached/test3.smt2 new file mode 100644 index 000000000..9a9c9357c --- /dev/null +++ b/colibri2/tests/solve/smt_array/step_limit_reached/test3.smt2 @@ -0,0 +1,10 @@ +(set-logic QF_ALIA) +(declare-fun a () (Array Int Int)) +(declare-fun i () Int) +(declare-fun j () Int) +(assert (not + (= + (store a j (select a j)) + (store (store a i (select a j)) j (select a i)) + ))) +(check-sat) diff --git a/colibri2/tests/solve/smt_array/step_limit_reached/test4.smt2 b/colibri2/tests/solve/smt_array/step_limit_reached/test4.smt2 new file mode 100644 index 000000000..1723526e7 --- /dev/null +++ b/colibri2/tests/solve/smt_array/step_limit_reached/test4.smt2 @@ -0,0 +1,12 @@ +(set-logic QF_AX) +(declare-sort I 0) +(declare-sort E 0) +(declare-fun a () (Array I E)) +(declare-fun i () I) +(declare-fun i5 () I) +(assert (not + (= + (store a i5 (select a i5)) + (store (store a i (select a i5)) i5 (select a i)) + ))) +(check-sat) diff --git a/colibri2/tests/solve/smt_array/unknown/test.smt2 b/colibri2/tests/solve/smt_array/unknown/test.smt2 deleted file mode 100644 index 5fe0c9fbf..000000000 --- a/colibri2/tests/solve/smt_array/unknown/test.smt2 +++ /dev/null @@ -1,5 +0,0 @@ -(set-logic ALIRA) -(declare-fun s_ () (Array Int Real)) -(declare-fun s () (Array Int (Array Int Real))) -(assert (and (forall ((_? Int)) false) (or false (exists ((_? Int)) (and true (exists ((__? Int)) (distinct (select s_ 0) (select (select s 0) 0)))))))) -(check-sat) diff --git a/colibri2/tests/solve/smt_array/unsat/dune b/colibri2/tests/solve/smt_array/unsat/dune index 442cde88b..96fdbfc04 100644 --- a/colibri2/tests/solve/smt_array/unsat/dune +++ b/colibri2/tests/solve/smt_array/unsat/dune @@ -19,14 +19,6 @@ --options "array-wegraph" --options - "array-choice" - --options - "array-res-ext array-choice" - --options - "array-res-ext array-res-aup array-choice" - --options - "array-wegraph array-choice" - --options "array-wegraph array-res-ext" --options "array-wegraph array-res-ext array-res-aup" diff --git a/colibri2/tests/solve/smt_array/unsat/dune.inc b/colibri2/tests/solve/smt_array/unsat/dune.inc index da28d39ec..2f106c45c 100644 --- a/colibri2/tests/solve/smt_array/unsat/dune.inc +++ b/colibri2/tests/solve/smt_array/unsat/dune.inc @@ -190,198 +190,6 @@ (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status unsat --dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --check-status unsat --learning --dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat ---dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat ---dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat ---dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-res-ext --array-res-aup --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:eq.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:eq2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:eq3_distinct.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:eq4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:impls1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:impls2.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:impls3.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:impls4.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:impls5.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:impls6.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:out.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:select.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore1.smt2})) (package colibri2)) -(rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat ---dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) -(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-choice --check-status unsat --learning --dont-print-result %{dep:selectstore2.smt2})) (package colibri2)) (rule (alias runtest) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status unsat --dont-print-result %{dep:distinct.smt2})) (package colibri2)) (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=50M --time=60s --max-steps 3500 --array-wegraph --array-res-ext --check-status unsat --learning --dont-print-result %{dep:distinct.smt2})) (package colibri2)) diff --git a/colibri2/theories/array/Array_Id_dom.ml b/colibri2/theories/array/Array_Id_dom.ml deleted file mode 100644 index 3c8928ebd..000000000 --- a/colibri2/theories/array/Array_Id_dom.ml +++ /dev/null @@ -1,26 +0,0 @@ -(*************************************************************************) -(* This file is part of Colibri2. *) -(* *) -(* Copyright (C) 2014-2021 *) -(* CEA (Commissariat à l'énergie atomique et aux énergies *) -(* alternatives) *) -(* OCamlPro *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(*************************************************************************) - -include Common.MkIdDom (struct - let n1 = "Array.Array_Id_dom.merge_hooks" - let n2 = "Array.Id" - let n3 = "Array.Array_Id_dom.new_id_hooks" -end) diff --git a/colibri2/theories/array/Array_Id_dom.mli b/colibri2/theories/array/Array_Id_dom.mli deleted file mode 100644 index 438f2ca30..000000000 --- a/colibri2/theories/array/Array_Id_dom.mli +++ /dev/null @@ -1,22 +0,0 @@ -(*************************************************************************) -(* This file is part of Colibri2. *) -(* *) -(* Copyright (C) 2014-2021 *) -(* CEA (Commissariat à l'énergie atomique et aux énergies *) -(* alternatives) *) -(* OCamlPro *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(*************************************************************************) - -include Common.IdDomSig diff --git a/colibri2/theories/array/Index_Id_dom.ml b/colibri2/theories/array/Id.ml similarity index 85% rename from colibri2/theories/array/Index_Id_dom.ml rename to colibri2/theories/array/Id.ml index cc31f2a45..e79df540f 100644 --- a/colibri2/theories/array/Index_Id_dom.ml +++ b/colibri2/theories/array/Id.ml @@ -19,8 +19,14 @@ (* for more details (enclosed in the file licenses/LGPLv2.1). *) (*************************************************************************) -include Common.MkIdDom (struct - let n1 = "Array.Index_Id_dom.merge_hooks" +module Array = Common.MkIdDom (struct + let n1 = "Array.Id.Array.merge_hooks" + let n2 = "Array.Id" + let n3 = "Array.Id.Array.new_id_hooks" +end) + +module Index = Common.MkIdDom (struct + let n1 = "Array.Id.Index.merge_hooks" let n2 = "Array.Index_id" - let n3 = "Array.Index_Id_dom.new_id_hooks" + let n3 = "Array.Id.Index.new_id_hooks" end) diff --git a/colibri2/theories/array/Index_Id_dom.mli b/colibri2/theories/array/Id.mli similarity index 96% rename from colibri2/theories/array/Index_Id_dom.mli rename to colibri2/theories/array/Id.mli index 438f2ca30..452ee58cf 100644 --- a/colibri2/theories/array/Index_Id_dom.mli +++ b/colibri2/theories/array/Id.mli @@ -19,4 +19,5 @@ (* for more details (enclosed in the file licenses/LGPLv2.1). *) (*************************************************************************) -include Common.IdDomSig +module Array : Common.IdDomSig +module Index : Common.IdDomSig diff --git a/colibri2/theories/array/RWRules.ml b/colibri2/theories/array/RWRules.ml index 91cab7705..5283b457b 100644 --- a/colibri2/theories/array/RWRules.ml +++ b/colibri2/theories/array/RWRules.ml @@ -108,14 +108,14 @@ let raup_pattern, raup_run = let term = mk_store_term STV.tb STV.ti STV.tv in let raup_pattern = Pattern.of_term_exn ~subst:Ground.Subst.empty term in let raup_run env subst = - Debug.dprintf2 debug "Found raup1 with %a" Ground.Subst.pp subst; let n = convert ~subst env term in Egraph.register env n; + Debug.dprintf2 debug "Found raup1 with %a" Ground.Subst.pp subst; let term_bis = mk_select_term STV.tb STV.tj in let raup_pattern_bis = Pattern.of_term_exn ~subst term_bis in let raup_run_bis env subst_bis = - Debug.dprintf2 debug "Found raup2 with %a" Ground.Subst.pp subst; let subst = Ground.Subst.distinct_union subst_bis subst in + Debug.dprintf2 debug "Found raup2 with %a" Ground.Subst.pp subst; let bn = convert ~subst env STV.tb in match Egraph.get_dom env Linearity_dom.key bn with | Some NonLinear -> @@ -129,9 +129,12 @@ let raup_pattern, raup_run = (mk_select_term STV.tb STV.tj); ]) in + Debug.dprintf2 debug "Apply raup2: set %a to true" Node.pp v; Egraph.register env v; Boolean.set_true env v - | _ -> () + | _ -> + Debug.dprintf2 debug "Do not apply raup2: %a is not non-linear" + Node.pp bn in InvertedPath.add_callback env raup_pattern_bis raup_run_bis in @@ -202,9 +205,7 @@ let apply_res_ext_1_2_aux env ind_gty val_gty l tyvt = (fun (cnt, tsubst, tns) node -> let anv = Expr.Term.Var.mk (Format.sprintf "a%d" cnt) tyvt in let anvt = Expr.Term.of_var anv in - ( cnt + 1, - (anv, node) :: tsubst, - (anvt, Array_Id_dom.get_id env node) :: tns )) + (cnt + 1, (anv, node) :: tsubst, (anvt, Id.Array.get_id env node) :: tns)) (0, [], []) l in let tysubst = [ (STV.ind_ty_var, ind_gty); (STV.val_ty_var, val_gty) ] in @@ -239,44 +240,46 @@ let apply_res_ext_1_1, apply_res_ext_1_2 = applies res-ext-2 on the new foreign array and all the other foregin arrays which are its neighbours in the WEGraph *) let get_foreign_neighbours env a arr_set = - let aid = Array_Id_dom.get_id env a in + let aid = Id.Array.get_id env a in let nps = WEGraph.get_neighbours env aid in Node.S.fold (fun node acc -> - if DInt.S.mem (Array_Id_dom.get_id env node) nps then Node.S.add node acc + if DInt.S.mem (Id.Array.get_id env node) nps then Node.S.add node acc else acc) arr_set Node.S.empty +let apply_ext env a b = + let ind_gty, val_gty = array_gty_args (get_array_gty env a) in + let eq = Equality.equality env [ a; b ] in + let diseq = mk_distinct_arrays env a b ind_gty val_gty in + Debug.dprintf4 debug "Application of the extensionality rule on %a and %a" + Node.pp a Node.pp b; + Egraph.register env eq; + Egraph.register env diseq; + Choice.register_global env + { + Choice.print_cho = "Decision from extensionality application."; + Choice.prio = 1; + choice = + (fun env -> + match (Boolean.is env eq, Boolean.is env diseq) with + | Some true, Some false -> Choice.DecNo + | Some false, Some true -> Choice.DecNo + | _ -> + Choice.DecTodo + [ + (fun env -> + Boolean.set_true env eq; + Boolean.set_false env diseq); + (fun env -> + Boolean.set_false env eq; + Boolean.set_true env diseq); + ]); + } + (* a, b, {a,b} ⊆ foreign |> (a = b) â‹ (a[k] ≠b[k]) *) let apply_res_ext_2_1, apply_res_ext_2_2 = let foreign_array_db = GTHT.create Node.S.pp "foreign_array_db" in - let apply_ext ?(choice = false) env a b = - let ind_gty, val_gty = array_gty_args (get_array_gty env a) in - let eq = Equality.equality env [ a; b ] in - let dist = mk_distinct_arrays env a b ind_gty val_gty in - let disj = mk_or env eq dist in - Debug.dprintf4 debug "Application of the extensionality rule on %a and %a" - Node.pp a Node.pp b; - Egraph.register env disj; - if choice then - Choice.register_global env - { - Choice.print_cho = "Decision from WEGraph_merge_neighbours."; - Choice.prio = 1; - choice = - (fun env -> - match Boolean.is env disj with - | Some true -> Choice.DecNo - | Some false -> Choice.DecNo - | None -> - Choice.DecTodo - [ - (fun env -> Boolean.set_true env eq); - (fun env -> Boolean.set_true env dist); - ]); - } - else Boolean.set_true env disj - in let apply_res_ext_2 f env aty a = match aty with | Ground.Ty.{ app = { builtin = Expr.Array; _ }; _ } -> @@ -324,7 +327,7 @@ let new_array = let b = Ground.node f2 in let adist = mk_distinct_arrays env a b ind_gty val_gty in let aeq = Equality.equality env [ a; b ] in - let n = mk_or env adist aeq in + let n = mk_or env [ adist; aeq ] in Debug.dprintf4 debug "Found ext with %a and %a" Ground.pp f2 Ground.pp f; Egraph.register env n; diff --git a/colibri2/theories/array/WEGraph.ml b/colibri2/theories/array/WEGraph.ml index 47a1f26bf..31a20ca85 100644 --- a/colibri2/theories/array/WEGraph.ml +++ b/colibri2/theories/array/WEGraph.ml @@ -587,77 +587,6 @@ let are_neighbours env id1 id2 = | None -> false | Some (_, m) -> DInt.M.mem id2 m -let add_neighbour env (srcid, srcn) (destid, destn) ind ind_gty val_gty = - let iid = Index_Id_dom.get_id env ind in - Debug.dprintf6 debug "WEGraph: add_neighbour %a to %a through %a" (pp_eid env) - srcid (pp_eid env) destid (pp_vid env) iid; - WEG.change env destid ~f:(function - | None -> - Some - ( DInt.M.singleton iid (DInt.S.singleton srcid), - DInt.M.singleton srcid iid ) - | Some (m1, m2) -> - Some - ( DInt.M.change - (function - | Some nps -> Some (DInt.S.add srcid nps) - | None -> Some (DInt.S.singleton srcid)) - iid m1, - DInt.M.change - (function - | Some iid' -> - let ind' = VHT.find env iid' in - if not (Egraph.is_equal env ind ind') then ( - (* if a and b are already neighbours and k and k' are not - equal then set (k = k' \/ a[k] = b[k] \/ a[k'] = b[k']) to true *) - let eq1 = Equality.equality env [ ind; ind' ] in - let eq2 = - Equality.equality env - [ - mk_select env srcn ind ind_gty val_gty; - mk_select env destn ind ind_gty val_gty; - ] - in - let eq3 = - Equality.equality env - [ - mk_select env srcn ind' ind_gty val_gty; - mk_select env destn ind' ind_gty val_gty; - ] - in - let disj = mk_or env eq1 (mk_or env eq2 eq3) in - Egraph.register env disj; - if Options.get env use_choice then - Choice.register_global env - { - Choice.print_cho = "Decision from add_neighbour."; - Choice.prio = 1; - choice = - (fun env -> - match Boolean.is env disj with - | Some true -> Choice.DecNo - | Some false -> Choice.DecNo - | None -> - Choice.DecTodo - [ - (fun env -> Boolean.set_true env eq1); - (fun env -> Boolean.set_true env eq2); - (fun env -> Boolean.set_true env eq3); - ]); - } - else Boolean.set_true env disj; - Debug.dprintf10 debug - "WEGraph: adding %a as a neighbour to %a through %a: \ - setting %a = %a to true" - Node.pp srcn Node.pp destn Node.pp ind Node.pp ind - Node.pp ind'); - (* Don't do anything right away, assume that the - activation of the equality hook will take care of - normalizing the graph. *) - Some iid - | None -> Some iid) - srcid m2 )) - let rm_neighbour env (kid, knode) (rid, rnode) iid = let ind = VHT.find env iid in Debug.dprintf6 debug "WEGraph: rm_neighbour %a of %a through %a" (pp_eid env) @@ -701,6 +630,88 @@ let are_k_neibnours env aid bid iid = | None -> false | Some iid' -> iid = iid') +let add_neighbour vid aid = function + | None -> + Some + (DInt.M.singleton vid (DInt.S.singleton aid), DInt.M.singleton aid vid) + | Some (m1, m2) -> + Some + ( DInt.M.change + (function + | None -> Some (DInt.S.singleton aid) + | Some s -> Some (DInt.S.add aid s)) + vid m1, + DInt.M.add aid vid m2 ) + +let add_edge_aux env (a, aid) (b, bid) (i, iid) ind_gty val_gty = + Debug.dprintf6 debug "WEGraph: add_edge_aux %a between %a and %a" (pp_vid env) + iid (pp_eid env) aid (pp_eid env) bid; + match DInt.M.find_opt bid (snd (WEG.find env aid)) with + | Some jid when iid = jid -> () + | None -> + WEG.change env aid ~f:(add_neighbour iid bid); + WEG.change env bid ~f:(add_neighbour iid aid) + | Some jid -> + let j = VHT.find env jid in + let ij_eq = Equality.equality env [ i; j ] in + let ij_neq = Equality.disequality env [ i; j ] in + Egraph.register env ij_eq; + Egraph.register env ij_neq; + Choice.register_global env + { + Choice.print_cho = "Decision from adding an edge in the WEGgraph."; + Choice.prio = 1; + choice = + (fun env -> + let ai = mk_select env a i ind_gty val_gty in + let aj = mk_select env a j ind_gty val_gty in + let bi = mk_select env b i ind_gty val_gty in + let bj = mk_select env b j ind_gty val_gty in + match (Boolean.is env ij_eq, Boolean.is env ij_neq) with + | Some true, _ -> + (* if i = j then a[i] = a[j] & b[i] = b[j] *) + let eq = + mk_and env + [ + Equality.equality env [ ai; aj ]; + Equality.equality env [ bi; bj ]; + ] + in + Egraph.register env eq; + Boolean.set_true env eq; + WEG.change env aid ~f:(add_neighbour iid bid); + WEG.change env bid ~f:(add_neighbour iid aid); + Choice.DecNo + | _, Some true -> ( + (* if i =/= j then a[i] = b[i] or a[j] = b[j] *) + let ieq = Equality.equality env [ ai; bi ] in + let jeq = Equality.equality env [ aj; bj ] in + Egraph.register env ieq; + Egraph.register env jeq; + match (Boolean.is env ieq, Boolean.is env jeq) with + | Some true, Some true -> + (* if a[i] = b[i] & a[j] = b[j] then a = b *) + let eq = Equality.equality env [ a; b ] in + Egraph.register env eq; + Boolean.set_true env eq; + Choice.DecNo + | Some true, _ -> + WEG.change env aid ~f:(add_neighbour jid bid); + WEG.change env bid ~f:(add_neighbour jid aid); + Choice.DecNo + | _, Some true -> + WEG.change env aid ~f:(add_neighbour iid bid); + WEG.change env bid ~f:(add_neighbour iid aid); + Choice.DecNo + | _ -> Choice.DecNo) + | _ -> + Choice.DecTodo + [ + (fun env -> Boolean.set_true env ij_eq); + (fun env -> Boolean.set_true env ij_neq); + ]); + } + let add_edge env aid bid iid = (* when adding a node dest as a neighbour to a node src, dest is also added as a neighbour to all the nodes in the complete graph formed by all the @@ -724,8 +735,7 @@ let add_edge env aid bid iid = Vertices.change env iid ~f:(function | Some s -> Some (Vertex.S.add (id1, id2) s) | None -> Some (Vertex.S.singleton (id1, id2))); - add_neighbour env (id1, n1) (id2, n2) ind ind_gty val_gty; - add_neighbour env (id2, n2) (id1, n1) ind ind_gty val_gty)) + add_edge_aux env (n1, id1) (n2, id2) (ind, iid) ind_gty val_gty)) (DInt.S.add bid bnk)) (DInt.S.add aid ank) @@ -764,50 +774,43 @@ let rm_edge_aux env aid bid iid = (pp_vid env) iid) env () -let merge_neigbours_aux env (kn, kid) (rn, rid) nid kk_opt kr_opt () = +let merge_neigbours_aux env (a, aid) (b, bid) nid kk_opt kr_opt () = match (kk_opt, kr_opt) with - | Some iid1, Some iid2 -> - let ind1 = VHT.find env iid1 in - let ind2 = VHT.find env iid2 in + | Some iid, Some jid -> + let i = VHT.find env iid in + let j = VHT.find env jid in Debug.dprintf6 debug "WEGraph: _merge_neigbours_aux: iter1: found the neighbour %a through \ %a and %a" - (pp_eid env) nid (pp_vid env) iid1 (pp_vid env) iid2; - (* if a node X is a neighbour of both A and B through the edges - ind1 and ind2 (resp.) then (ind1 = ind2) must be set to true, and - only the ind1 edge should be kept. *) - if not (Egraph.is_equal env ind1 ind2) then ( - let nidn = EHT.find env nid in - let eq1 = Equality.equality env [ ind1; ind2 ] in - let eq2 = Equality.equality env [ kn; nidn ] in - let disj = mk_or env eq1 eq2 in - Egraph.register env disj; - if Options.get env use_choice then - Choice.register_global env - { - Choice.print_cho = "Decision from WEGraph_merge_neighbours."; - Choice.prio = 1; - choice = - (fun env -> - match Boolean.is env disj with - | Some true -> Choice.DecNo - | Some false -> Choice.DecNo - | None -> - Choice.DecTodo - [ - (fun env -> Boolean.set_true env eq1); - (fun env -> Boolean.set_true env eq2); - ]); - } - else Boolean.set_true env disj); - rm_edge_aux env nid rid iid2 + (pp_eid env) nid (pp_vid env) iid (pp_vid env) jid; + if not (Egraph.is_equal env i j) then ( + let ijeq = Equality.equality env [ i; j ] in + let aneq = Equality.equality env [ a; EHT.find env nid ] in + Egraph.register env ijeq; + Egraph.register env aneq; + Choice.register_global env + { + Choice.print_cho = "Decision from merging nodes in the WEGgraph."; + Choice.prio = 1; + choice = + (fun env -> + match (Boolean.is env ijeq, Boolean.is env aneq) with + | Some true, _ | _, Some true -> Choice.DecNo + | _ -> + Choice.DecTodo + [ + (fun env -> Boolean.set_true env ijeq); + (fun env -> Boolean.set_true env aneq); + ]); + }); + rm_edge_aux env nid bid jid | None, Some iid -> Debug.dprintf4 debug "WEGraph: _merge_neigbours_aux: iter2: found the neighbour %a through \ %a" (pp_eid env) nid (pp_vid env) iid; - rm_edge_aux env nid rid iid; - add_edge_aux kn rn env nid kid iid + rm_edge_aux env nid bid iid; + add_edge_aux a b env nid aid iid | _ -> () let merge_neighbours env (kn, kid) (rn, rid) b = @@ -888,7 +891,7 @@ let ineq_indices_norm env s = let ns = List.filter_map (fun n -> - match Index_Id_dom.get_id env n with + match Id.Index.get_id env n with | id -> Some id | exception NoIdFound _ -> None) (Node.S.elements s) @@ -896,9 +899,9 @@ let ineq_indices_norm env s = KnownValues.ineq_indices_norm env ns let new_store env a b ind v = - let aid = Array_Id_dom.get_id env a in - let bid = Array_Id_dom.get_id env b in - let iid = Index_Id_dom.get_id env ind in + let aid = Id.Array.get_id env a in + let bid = Id.Array.get_id env b in + let iid = Id.Index.get_id env ind in Debug.dprintf6 debug "WEGraph.new_store: %a %a %a" (pp_eid env) aid (pp_eid env) bid (pp_vid env) iid; add_edge env aid bid iid; @@ -911,8 +914,8 @@ let new_store env a b ind v = env () let new_select env r a i = - let aid = Array_Id_dom.get_id env a in - let iid = Index_Id_dom.get_id env i in + let aid = Id.Array.get_id env a in + let iid = Id.Index.get_id env i in Debug.dprintf4 debug "WEGraph.new_select: %a %a" (pp_eid env) aid (pp_vid env) iid; match KnownValues.HT.find_opt env aid with @@ -945,3 +948,13 @@ let new_id_hook env id n = let new_index_id_hook env id n = Vertices.set env id Vertex.S.empty; VHT.set env id n + +let get_array_kvs env n = + match KnownValues.HT.find_opt env (Id.Array.get_id env n) with + | Some kv -> + DInt.M.fold + (fun i v acc -> + let indn = VHT.find env i in + Node.M.add indn v acc) + kv Node.M.empty + | None -> Node.M.empty diff --git a/colibri2/theories/array/WEGraph.mli b/colibri2/theories/array/WEGraph.mli index cec8868ed..151e2fa8f 100644 --- a/colibri2/theories/array/WEGraph.mli +++ b/colibri2/theories/array/WEGraph.mli @@ -36,3 +36,4 @@ val new_select : Egraph.wt -> Node.t -> Node.t -> Node.t -> unit val get_neighbours : Egraph.wt -> int -> DInt.S.t val new_id_hook : Egraph.wt -> int -> Node.t -> unit val new_index_id_hook : Egraph.wt -> int -> Node.t -> unit +val get_array_kvs : Egraph.wt -> Node.t -> Node.t Node.M.t diff --git a/colibri2/theories/array/array.ml b/colibri2/theories/array/array.ml index 9e7c81d26..af663f3e7 100644 --- a/colibri2/theories/array/array.ml +++ b/colibri2/theories/array/array.ml @@ -45,7 +45,7 @@ let converter env (f : Ground.t) = match s.ty with | { app = { builtin = Expr.Array; _ }; args = [ ind_gty; val_gty ]; _ } -> add_array_gty env fn ind_gty val_gty; - Array_Id_dom.set_id env fn; + Id.Array.set_id env fn; new_array env ind_gty val_gty f; true | _ -> false @@ -74,7 +74,7 @@ let converter env (f : Ground.t) = let gty = Ground.Ty.convert subst (List.nth arg_tys i) in match gty with | { app = { builtin = Expr.Array; _ }; _ } -> - Array_Id_dom.set_id env n; + Id.Array.set_id env n; Ground.add_ty env n gty; Foreign_dom.set_dom env gty n IsForeign | _ -> ()) @@ -90,8 +90,8 @@ let converter env (f : Ground.t) = Egraph.register env a; Egraph.register env i; add_array_gty env a ind_gty val_gty; - Array_Id_dom.set_id env a; - Index_Id_dom.set_id env i; + Id.Array.set_id env a; + Id.Index.set_id env i; Ground.add_ty env i ind_gty; if Options.get env use_wegraph then WEGraph.new_select env fn a i; (* update of the Foreign domain *) @@ -133,39 +133,30 @@ let converter env (f : Ground.t) = add_array_gty env b ind_gty val_gty; Ground.add_ty env v val_gty; Ground.add_ty env k ind_gty; - Array_Id_dom.set_id env a; - Array_Id_dom.set_id env b; - Index_Id_dom.set_id env k; + Id.Array.set_id env a; + Id.Array.set_id env b; + Id.Index.set_id env k; (* update of the Linearity domain *) if Options.get env restrict_aup then Linearity_dom.upd_dom env fn (Linear b); (* application of the `idx` rule *) - let store_n = mk_store env b k v ind_gty val_gty in - let rn = - Equality.equality env [ mk_select env store_n k ind_gty val_gty; v ] - in + let rn = Equality.equality env [ mk_select env a k ind_gty val_gty; v ] in Egraph.register env rn; Boolean.set_true env rn; (* application of the `Uð›¿` rule *) if Options.get env default_values then ( - let eq_node = Equality.equality env [ store_n; b ] in + let eq_node = + Equality.equality env + [ + ground_apply env Builtin.array_default_value [ ind_gty; val_gty ] + [ a ]; + ground_apply env Builtin.array_default_value [ ind_gty; val_gty ] + [ b ]; + ] + in Egraph.register env eq_node; Boolean.set_true env eq_node); - if Options.get env use_wegraph then ( - let ak = mk_select env a k ind_gty val_gty in - Egraph.register env ak; - if not (Egraph.is_equal env ak v) then ( - let akv_eq = Equality.equality env [ ak; v ] in - Egraph.register env akv_eq; - Boolean.set_true env akv_eq); - let bk = mk_select env b k ind_gty val_gty in - Egraph.register env bk; - if Egraph.is_equal env bk v then ( - (* is this necessary? *) - let eqn = Equality.equality env [ a; b ] in - Egraph.register env eqn; - Boolean.set_true env eqn) - else WEGraph.new_store env a b k v) + if Options.get env use_wegraph then WEGraph.new_store env a b k v | { app = { builtin = Builtin.Array_diff; _ }; args; @@ -176,8 +167,8 @@ let converter env (f : Ground.t) = let a, b = IArray.extract2_exn args in Egraph.register env a; Egraph.register env b; - Array_Id_dom.set_id env a; - Array_Id_dom.set_id env b; + Id.Array.set_id env a; + Id.Array.set_id env b; add_array_gty env a ind_gty val_gty; add_array_gty env b ind_gty val_gty | { @@ -212,7 +203,7 @@ let converter env (f : Ground.t) = let f_arity = IArray.length args - 1 in IArray.iteri args ~f:(fun i n -> if i > 0 then ( - Array_Id_dom.set_id env n; + Id.Array.set_id env n; add_array_gty env n bi_ind_ty bi_val_ty; Array_dom.add_map_parent env n f { bi_ind_ty; bi_val_ty; a_val_ty; f_arity }))); @@ -224,10 +215,10 @@ let init env = Array_value.init_check env; Ground.register_converter env converter; if Options.get env use_wegraph then ( - Array_Id_dom.register_new_id_hook env WEGraph.new_id_hook; - Array_Id_dom.register_merge_hook env WEGraph.eq_arrays_norm; - Index_Id_dom.register_new_id_hook env WEGraph.new_index_id_hook; - Index_Id_dom.register_merge_hook env WEGraph.eq_indices_norm; + Id.Array.register_new_id_hook env WEGraph.new_id_hook; + Id.Array.register_merge_hook env WEGraph.eq_arrays_norm; + Id.Index.register_new_id_hook env WEGraph.new_index_id_hook; + Id.Index.register_merge_hook env WEGraph.eq_indices_norm; Equality.register_hook_new_disequality env WEGraph.ineq_indices_norm); (* extáµ£ (restricted extensionality): - (a = b) ≡ false |> (a[k] ≠b[k]) diff --git a/colibri2/theories/array/array_value.ml b/colibri2/theories/array/array_value.ml index e07bdba48..d7d78a521 100644 --- a/colibri2/theories/array/array_value.ml +++ b/colibri2/theories/array/array_value.ml @@ -27,8 +27,8 @@ open Colibri2_theories_quantifiers module ArrayModelVal = struct type aval = { - ind_ty : Ground.Ty.t; - val_ty : Ground.Ty.t; + ind_gty : Ground.Ty.t; + val_gty : Ground.Ty.t; vals : Value.t Value.M.t; other : Value.t; } @@ -36,20 +36,20 @@ module ArrayModelVal = struct include Value.Register (struct module T = struct type t = aval = { - ind_ty : Ground.Ty.t; - val_ty : Ground.Ty.t; + ind_gty : Ground.Ty.t; + val_gty : Ground.Ty.t; vals : Value.t Value.M.t; other : Value.t; } [@@deriving eq, ord, hash] - let pp fmt { ind_ty; val_ty; other; vals } = + let pp fmt { ind_gty; val_gty; other; vals } = if false then - Format.fprintf fmt "Array(%a => %a)" Ground.Ty.pp ind_ty Ground.Ty.pp - val_ty + Format.fprintf fmt "Array(%a => %a)" Ground.Ty.pp ind_gty Ground.Ty.pp + val_gty else - Format.fprintf fmt "Array(%a => %a: %a: %a)" Ground.Ty.pp ind_ty - Ground.Ty.pp val_ty Value.pp other (Value.M.pp Value.pp) vals + Format.fprintf fmt "Array(%a => %a: %a: %a)" Ground.Ty.pp ind_gty + Ground.Ty.pp val_gty Value.pp other (Value.M.pp Value.pp) vals end include T @@ -68,14 +68,14 @@ module ArrayModelVal = struct let of_value v = nodevalue (index v) end -let add_to_seq seq d ind_ty val_ty = +let add_to_seq seq d ind_gty val_gty = let open Interp.SeqLim in let+ vals = seq - and* indv = Interp.ty d ind_ty - and* valv = Interp.ty d val_ty in + and* indv = Interp.ty d ind_gty + and* valv = Interp.ty d val_gty in Value.M.add indv valv vals -let all_arrays d ind_ty val_ty = +let all_arrays d ind_gty val_gty = let size = Interp.SeqLim.of_seq d (Base.Sequence.unfold ~init:() ~f:(fun () -> Some ((), ()))) @@ -84,36 +84,38 @@ let all_arrays d ind_ty val_ty = Interp.SeqLim.unfold_with size ~init:(Interp.SeqLim.of_seq d (Base.Sequence.singleton Value.M.empty)) ~f:(fun seq () -> - let seq = add_to_seq seq d ind_ty val_ty in + let seq = add_to_seq seq d ind_gty val_gty in Yield (seq, seq)) in let vals_ = Interp.SeqLim.limit d (Interp.SeqLim.concat vals_) in let open Interp.SeqLim in - let+ vals = vals_ and* other = Interp.ty d val_ty in - ArrayModelVal.nodevalue (ArrayModelVal.index { ind_ty; val_ty; vals; other }) + let+ vals = vals_ and* other = Interp.ty d val_gty in + ArrayModelVal.nodevalue + (ArrayModelVal.index { ind_gty; val_gty; vals; other }) -let add_vals d n ind_ty val_ty k acc = +let add_ind d n ind_gty val_gty k acc = let open Interp.SeqLim in let+ vals = acc and* indv = match Egraph.get_value d k with - | None -> Interp.ty d ind_ty - | Some v -> Interp.SeqLim.of_seq d (Base.Sequence.singleton v) + | None -> Interp.ty d ind_gty + | Some kv -> Interp.SeqLim.of_seq d (Base.Sequence.singleton kv) and* valv = - let nk = mk_select d n k ind_ty val_ty in + let nk = mk_select d n k ind_gty val_gty in match Egraph.get_value d nk with - | Some v -> Interp.SeqLim.of_seq d (Base.Sequence.singleton v) - | None | (exception Egraph.NotRegistered) -> Interp.ty d val_ty + | Some nkv -> Interp.SeqLim.of_seq d (Base.Sequence.singleton nkv) + | None | (exception Egraph.NotRegistered) -> Interp.ty d val_gty in Value.M.add indv valv vals let array_reads d reads n = let open Interp.SeqLim in - let ind_ty, val_ty = array_gty_args (get_node_ty d n) in + let ind_gty, val_gty = array_gty_args (get_node_ty d n) in let init = Interp.SeqLim.of_seq d (Base.Sequence.singleton Value.M.empty) in - let+ other = Interp.ty d val_ty - and* vals = Node.S.fold (add_vals d n ind_ty val_ty) reads init in - ArrayModelVal.nodevalue (ArrayModelVal.index { ind_ty; val_ty; vals; other }) + let+ other = Interp.ty d val_gty + and* vals = Node.S.fold (add_ind d n ind_gty val_gty) reads init in + ArrayModelVal.nodevalue + (ArrayModelVal.index { ind_gty; val_gty; vals; other }) let init_ty d = Interp.Register.node d (fun _ d n -> @@ -122,8 +124,8 @@ let init_ty d = | Some { reads; _ } -> Some (array_reads d reads n)); Interp.Register.ty d (fun d ty -> match ty with - | { app = { builtin = Expr.Array; _ }; args = [ ind_ty; val_ty ]; _ } -> - Some (all_arrays d ind_ty val_ty) + | { app = { builtin = Expr.Array; _ }; args = [ ind_gty; val_gty ]; _ } -> + Some (all_arrays d ind_gty val_gty) | _ -> None) let interp env n = Opt.get_exn Impossible (Egraph.get_value env n) diff --git a/colibri2/theories/array/common.ml b/colibri2/theories/array/common.ml index 9674033a5..fd6775b79 100644 --- a/colibri2/theories/array/common.ml +++ b/colibri2/theories/array/common.ml @@ -60,13 +60,6 @@ let use_wegraph = value & flag & info [ "array-wegraph" ] ~doc:"Use the array's weak equivalency graph") -let use_choice = - Options.register ~pp:Fmt.bool "Array.choice" - Cmdliner.Arg.( - value & flag - & info [ "array-choice" ] - ~doc:"Use choice instead of propagating disjunctions") - let debug = Debug.register_info_flag ~desc:"Debugging messages of the array theory" "Array" @@ -77,6 +70,9 @@ let convert ~subst env = (* exceptions *) exception Not_An_Array of Node.t +exception Not_An_Array_gty of Ground.Ty.t +exception Not_An_Array_ty of Expr.ty +exception Type_Not_Set of Node.t exception NoIdFound of string * Node.t exception Not_a_neighbour of (Node.t * Node.t * Node.t) exception Empty_neighbour_set of (Node.t * Node.t * Node.t) @@ -124,17 +120,17 @@ let apply_cst = Expr.Term.apply_cst let array_ty_args : Expr.ty -> Expr.ty * Expr.ty = function | { ty_descr = TyApp ({ builtin = Expr.Array; _ }, [ ind_ty; val_ty ]); _ } -> (ind_ty, val_ty) - | ty -> failwith (Fmt.str "'%a' is not an array type!" Expr.Ty.print ty) + | ty -> raise (Not_An_Array_ty ty) let array_gty_args : Ground.Ty.t -> Ground.Ty.t * Ground.Ty.t = function | { app = { builtin = Expr.Array; _ }; args = [ ind_gty; val_gty ] } -> (ind_gty, val_gty) - | ty -> failwith (Fmt.str "'%a' is not an array ground type!" Ground.Ty.pp ty) + | ty -> raise (Not_An_Array_gty ty) let get_node_ty env n = match Ground.Ty.S.elements (Ground.tys env n) with | h :: _ -> h - | [] -> failwith (Fmt.str "The type of the node %a was not set" Node.pp n) + | [] -> raise (Type_Not_Set n) let get_array_gty env n = try @@ -296,7 +292,8 @@ let mk_subst term_l ty_l = let ground_apply env cstr tyl nl = sem_to_node (Ground.apply env cstr tyl (IArray.of_list nl)) -let mk_or env a b = ground_apply env Expr.Term.Const.or_ [] [ a; b ] +let mk_or env l = ground_apply env Expr.Term.Const.or_ [] l +let mk_and env l = ground_apply env Expr.Term.Const.and_ [] l let mk_distinct env l gty = ground_apply env (Expr.Term.Const.distinct (List.length l)) [ gty ] l @@ -402,6 +399,12 @@ end let () = Printexc.register_printer (function | Not_An_Array n -> Some (Fmt.str "%a is not an array!" Node.pp n) + | Not_An_Array_gty gty -> + Some (Fmt.str "%a is not an array ground type!" Ground.Ty.pp gty) + | Not_An_Array_ty ty -> + Some (Fmt.str "%a is not an array type!" Expr.Ty.pp ty) + | Type_Not_Set n -> + Some (Fmt.str "the type of the node %a was not set!" Node.pp n) | NoIdFound (s, n) -> Some (Fmt.str "get_id(%s) of %a: No Id found!" s Node.pp n) | Not_a_neighbour (kn, rn, k) -> diff --git a/colibri2/theories/array/common.mli b/colibri2/theories/array/common.mli index 9f95879a2..44bbc1767 100644 --- a/colibri2/theories/array/common.mli +++ b/colibri2/theories/array/common.mli @@ -25,11 +25,13 @@ val extended_comb : bool Options.t val blast_rule : bool Options.t val default_values : bool Options.t val use_wegraph : bool Options.t -val use_choice : bool Options.t val debug : Debug.flag val convert : subst:Ground.Subst.t -> 'a Egraph.t -> Expr.term -> Node.t exception Not_An_Array of Node.t +exception Not_An_Array_gty of Ground.Ty.t +exception Not_An_Array_ty of Expr.ty +exception Type_Not_Set of Node.t exception NoIdFound of string * Node.t exception Not_a_neighbour of (Node.t * Node.t * Node.t) exception Empty_neighbour_set of (Node.t * Node.t * Node.t) @@ -114,7 +116,8 @@ val ground_apply : Node.t list -> Node.t -val mk_or : 'a Egraph.t -> Node.t -> Node.t -> Node.t +val mk_or : 'a Egraph.t -> Node.t list -> Node.t +val mk_and : 'a Egraph.t -> Node.t list -> Node.t val mk_store : 'a Egraph.t -> -- GitLab