diff --git a/Src/COLIBRI/TODO_QF_BV_2020-Weber_extensions.smt2 b/Src/COLIBRI/TODO_QF_BV_2020-Weber_extensions.smt2 new file mode 100644 index 0000000000000000000000000000000000000000..6ebc6095333afcc38b0b618fd70ce57ab7146921 --- /dev/null +++ b/Src/COLIBRI/TODO_QF_BV_2020-Weber_extensions.smt2 @@ -0,0 +1,95 @@ +(set-info :smt-lib-version 2.6) +(set-logic QF_BV) +(set-info :source | + Constructed by Tjark Weber to test that the extensions defined + in QF_BV are implemented according to their definition +|) +(set-info :license "https://creativecommons.org/licenses/by/4.0/") +(set-info :category "check") +(set-info :status unsat) +; We use a (reasonably small) fixed bit width m > 0. +(declare-fun s () (_ BitVec 5)) +(declare-fun t () (_ BitVec 5)) +(declare-fun u () (_ BitVec 5)) +(assert (not (and +; Bitvector constants + (= (_ bv13 32) #b00000000000000000000000000001101) +; Bitwise operators + (= (bvnand s t) (bvnot (bvand s t))) + (= (bvnor s t) (bvnot (bvor s t))) + (= (bvxor s t) (bvor (bvand s (bvnot t)) (bvand (bvnot s) t))) + (= (bvxnor s t) (bvor (bvand s t) (bvand (bvnot s) (bvnot t)))) + (= (bvcomp s t) (bvand (bvxnor ((_ extract 4 4) s) ((_ extract 4 4) t)) + (bvcomp ((_ extract 3 0) s) ((_ extract 3 0) t)))) + (= (bvxor s t u) (bvxor (bvxor s t) u)) +; Arithmetic operators + (= (bvsub s t) (bvadd s (bvneg t))) + + (= (bvsdiv s t) (let ((?msb_s ((_ extract 4 4) s)) + (?msb_t ((_ extract 4 4) t))) + (ite (and (= ?msb_s #b0) (= ?msb_t #b0)) + (bvudiv s t) + (ite (and (= ?msb_s #b1) (= ?msb_t #b0)) + (bvneg (bvudiv (bvneg s) t)) + (ite (and (= ?msb_s #b0) (= ?msb_t #b1)) + (bvneg (bvudiv s (bvneg t))) + (bvudiv (bvneg s) (bvneg t))))))) + + (= (bvsrem s t) (let ((?msb_s ((_ extract 4 4) s)) + (?msb_t ((_ extract 4 4) t))) + (ite (and (= ?msb_s #b0) (= ?msb_t #b0)) + (bvurem s t) + (ite (and (= ?msb_s #b1) (= ?msb_t #b0)) + (bvneg (bvurem (bvneg s) t)) + (ite (and (= ?msb_s #b0) (= ?msb_t #b1)) + (bvurem s (bvneg t)) + (bvneg (bvurem (bvneg s) (bvneg t)))))))) + + (= (bvsmod s t) (let ((?msb_s ((_ extract 4 4) s)) + (?msb_t ((_ extract 4 4) t))) + (let ((abs_s (ite (= ?msb_s #b0) s (bvneg s))) + (abs_t (ite (= ?msb_t #b0) t (bvneg t)))) + (let ((u (bvurem abs_s abs_t))) + (ite (= u (_ bv0 5)) + u + (ite (and (= ?msb_s #b0) (= ?msb_t #b0)) + u + (ite (and (= ?msb_s #b1) (= ?msb_t #b0)) + (bvadd (bvneg u) t) + (ite (and (= ?msb_s #b0) (= ?msb_t #b1)) + (bvadd u t) + (bvneg u))))))))) + + (= (bvule s t) (or (bvult s t) (= s t))) + (= (bvugt s t) (bvult t s)) + (= (bvuge s t) (or (bvult t s) (= s t))) + (= (bvslt s t) (or (and (= ((_ extract 4 4) s) #b1) + (= ((_ extract 4 4) t) #b0)) + (and (= ((_ extract 4 4) s) ((_ extract 4 4) t)) + (bvult s t)))) + (= (bvsle s t) (or (and (= ((_ extract 4 4) s) #b1) + (= ((_ extract 4 4) t) #b0)) + (and (= ((_ extract 4 4) s) ((_ extract 4 4) t)) + (bvule s t)))) + (= (bvsgt s t) (bvslt t s)) + (= (bvsge s t) (bvsle t s)) +; Other operations + (= (bvashr s t) (ite (= ((_ extract 4 4) s) #b0) + (bvlshr s t) + (bvnot (bvlshr (bvnot s) t)))) + (= ((_ repeat 1) t) t) + (= ((_ repeat 2) t) (concat t ((_ repeat 1) t))) + (= ((_ zero_extend 0) t) t) + (= ((_ zero_extend 1) t) (concat ((_ repeat 1) #b0) t)) + (= ((_ sign_extend 0) t) t) + (= ((_ sign_extend 1) t) (concat ((_ repeat 1) ((_ extract 4 4) t)) t)) + (= ((_ rotate_left 0) t) t) + (= ((_ rotate_left 1) t) ((_ rotate_left 0) + (concat ((_ extract 3 0) t) ((_ extract 4 4) t)))) + (= ((_ rotate_right 0) t) t) + (= ((_ rotate_right 1) t) ((_ rotate_right 0) + (concat ((_ extract 0 0) t) ((_ extract 4 1) t)))) +))) +(check-sat) +(get-value (s t)) +(exit) diff --git a/Src/COLIBRI/arith.pl b/Src/COLIBRI/arith.pl index d6ab10e7a2e7780b01b84f3c39aabcaafd87aa2c..09d36a45a6ba879d6218e0061905d82cd384e3c5 100755 --- a/Src/COLIBRI/arith.pl +++ b/Src/COLIBRI/arith.pl @@ -3467,7 +3467,7 @@ single_var_factor([S|LSusp],A,Depth,Seen,NSeen,LX) ?- !, single_var_factor([],_,_,Seen,Seen,[]). single_var_factor_goal(op_int(U,A),A,Depth,Seen,NSeen,LA) ?- !, - (occurs(U,Seen) -> + (protected_occurs_in_list(U,Seen) -> NSeen = Seen, LA = [] ; get_cstr_suspensions(U,LSuspU), @@ -3503,8 +3503,8 @@ single_var_factor_goal(add_int(X,_,Y,_,Z,_),A,Depth,Seen,NSeen,LA) ?- !, ; NSeen = [V|Seen1], LV = []), (LA0 == [] -> - ((occurs(U,Seen), - occurs(V,Seen)) + ((protected_occurs_in_list(U,Seen), + protected_occurs_in_list(V,Seen)) -> LA = [] ; LA = [A]) @@ -3527,14 +3527,14 @@ single_var_factor_goal(mult_int(U,_,V,_,A,_),A,Depth,Seen,NSeen,LA) ?- !, ; NSeen = [V|Seen1], LV = []), (LA0 == [] -> - ((occurs(U,Seen), - occurs(V,Seen)) + ((protected_occurs_in_list(U,Seen), + protected_occurs_in_list(V,Seen)) -> LA = [] ; LA = [A]) ; LA = LA0). single_var_factor_goal(power_int(U,_,P,A,_),A,Depth,Seen,NSeen,LA) ?- !, - (occurs(U,Seen) -> + (protected_occurs_in_list(U,Seen) -> NSeen = Seen, LA = [] ; NDepth is Depth - 1, diff --git a/Src/COLIBRI/col_solve.pl b/Src/COLIBRI/col_solve.pl index ecc8a96b0c839ac79b122bea9e2f1740baefa4fb..72863bc9639f3f244a8da07c71dd112f4819313e 100644 --- a/Src/COLIBRI/col_solve.pl +++ b/Src/COLIBRI/col_solve.pl @@ -467,6 +467,8 @@ smt_solve(FILE) :- setval(step_stats,0)@eclipse, setval(step_limit,0)@eclipse, setval(nb_steps,0)@eclipse, + % on active les warning de dolmen + setval(no_dolmen_warning,0)@eclipse, smt_solve(_,FILE,0,Code), exit(Code). @@ -741,16 +743,59 @@ smt_test(TO,Size) :- %StrDir = "./QF_ABVFP/20170428-Liew-KLEE/imperial_synthetic_count_klee_bug.x86_64/", % 9 TO! (cvc4 0) %StrDir = "./QF_ABVFP/20170428-Liew-KLEE/imperial_gsl_benchmarks_histogram2d_klee_bug.x86_64/", %OK - StrDir = "./QF_ABVFP/20170428-Liew-KLEE/", % 80 TO! (177 unsupported) (cvc4 95) + %StrDir = "./QF_ABVFP/20170428-Liew-KLEE/", % 80 TO! (177 unsupported) (cvc4 95) %StrDir = "./QF_ABVFP/20170501-Heizmann-UltimateAutomizer/", % 0 (cvc4 2 TO) %---------------------------------------------------------------------- %StrDir = "./QF_BV/", + %StrDir = "./QF_BV/20170501-Heizmann-UltimateAutomizer/", + + %StrDir = "./QF_BV/20170531-Hansen-Check/", %OK + %StrDir = "./QF_BV/2017-BuchwaldFried/", + %StrDir = "./QF_BV/2018-Goel-hwbench/", + %StrDir = "./QF_BV/2019-Mann/", + %StrDir = "./QF_BV/2019-Wolf-fmbench/", + %StrDir = "./QF_BV/20200415-Yurichev/", + %StrDir = "./QF_BV/bmc-bv-svcomp14/", + %StrDir = "./QF_BV/calypto/", + %StrDir = "./QF_BV/challenge/", + %StrDir = "./QF_BV/check2/", + %StrDir = "./QF_BV/dwp_formulas/", + %StrDir = "./QF_BV/ecc/", % NULL comparé a cvc4 + %StrDir = "./QF_BV/float/", + + %StrDir = "./QF_BV/galois/", % 2 BUGS / 4 fich (unknown) + + %StrDir = "./QF_BV/gulwani-pldi08/", + %StrDir = "./QF_BV/log-slicing/", + %StrDir = "./QF_BV/mcm/", + %StrDir = "./QF_BV/pipe/", + %StrDir = "./QF_BV/pspace/", + %StrDir = "./QF_BV/rubik/", + %StrDir = "./QF_BV/RWS/", + %StrDir = "./QF_BV/sage/", + + %StrDir = "./QF_BV/spear/", + StrDir = "./QF_BV/spear/samba_v3.0.24/", % des unknown ! + %StrDir = "./QF_BV/spear/inn_v2.4.3/", + + %StrDir = "./QF_BV/stp_samples/", + %StrDir = "./QF_BV/tacas07/", + %StrDir = "./QF_BV/uclid/", + %StrDir = "./QF_BV/uclid_contrib_smtcomp09/", + %StrDir = "./QF_BV/uum/", + %StrDir = "./QF_BV/VS3/", + %StrDir = "./QF_BV/wienand-cav2008/", + %StrDir = "./QF_BV/asp/", %StrDir = "./QF_BV/bench_ab/",%OK - %StrDir = "./QF_BV/bmc-bv/",%des core et TO !! - %StrDir = "./QF_BV/bmc-bv-svcomp14/",%des core et TO !! - %StrDir = "./QF_BV/brummayerbiere/",%des core et TO !! + %StrDir = "./QF_BV/bmc-bv/", + %StrDir = "./QF_BV/bmc-bv-svcomp14/", + %StrDir = "./QF_BV/brummayerbiere/", + %StrDir = "./QF_BV/brummayerbiere2/", + %StrDir = "./QF_BV/brummayerbiere3/", + %StrDir = "./QF_BV/brummayerbiere4/", + %StrDir = "./QF_BV/bruttomesso/", % plein de TO %StrDir = "./QF_BV/crafted/", %----------------------------------------------------------------------- %StrDir = "./QF_BVFP/", @@ -811,8 +856,9 @@ smt_test(TO,Size) :- %----------------------------------------------------------------- %StrDir = "QF_AX/", %StrDir = "QF_AX/storeinv/", - %StrDir = "QF_AX/swap/", + StrDir = "QF_AX/swap/", %StrDir = "QF_AX/storecomm/", + %StrDir = "QF_AX/cvc/", %StrDir = "QF_ALIA/qlock2/", % Des TO et core dump %StrDir = "QF_ALIA/cvc/", % TOUT OK @@ -886,8 +932,10 @@ smt_test0(TO,Size,StrDir) :- initNbCodes, get_flag(version_as_list,[Ver|_]), ((Ver == 7) -> - ECLIPSE = eclipse7 - ; ECLIPSE = eclipse), + ECLIPSE = eclipse7, + COL = "col_solve.eco" + ; ECLIPSE = eclipse, + COL = "col_solve.pl"), get_flag(hostarch,ARCH), ((ARCH == "i386_nt"; ARCH == "x86_64_nt") @@ -910,8 +958,7 @@ smt_test0(TO,Size,StrDir) :- get_flag(installation_directory,EDIR), os_file_name(OF,F), concat_string(["cmd.exe /D /C smt_test_file ",OF," ",TO],Com) -% ; concat_string(["timeout --signal=KILL --kill-after=0.1 ",TO,"s ",ECLIPSE," -b col_solve -g ",SizeM," -e \"seed(0),use_delta,setval(def_real_for_int,1)@colibri,smt_solve_test(\'",F,"\',",0,")\""],Com)), - ; concat_string(["timeout --signal=KILL --kill-after=0.1 ",TO,"s ",ECLIPSE," -b col_solve -g ",SizeM," -e \"seed(0),use_delta,setval(def_real_for_int,1)@colibri,setval(step_limit,0),smt_solve_get_stat(\'",F,"\')\""],Com)), + ; concat_string(["timeout --signal=KILL --kill-after=0.1 ",TO,"s ",ECLIPSE," -b ",COL," -g ",SizeM," -e \"seed(0),use_delta,setval(def_real_for_int,1)@colibri,setval(step_limit,0),setval(no_dolmen_warning,1)@eclipse,smt_solve_get_stat(\'",F,"\')\""],Com)), %; concat_string(["timeout --signal=KILL --kill-after=0.1 ",TO,"s cvc4 ",F],Com)), exec(Com,[],Pid), @@ -1023,6 +1070,54 @@ smt_unit_test(TO) :- %StrDir = "QF_AX/storeinv/", %StrDir = "QF_AX/swap/", %StrDir = "QF_AX/storecomm/", +%---------------------------------------------------------------------- + %StrDir = "./QF_BV/", + %StrDir = "./QF_BV/20170501-Heizmann-UltimateAutomizer/", + + %StrDir = "./QF_BV/20170531-Hansen-Check/", %OK + %StrDir = "./QF_BV/2017-BuchwaldFried/", + %StrDir = "./QF_BV/2018-Goel-hwbench/", + %StrDir = "./QF_BV/2019-Mann/", + %StrDir = "./QF_BV/2019-Wolf-fmbench/", + %StrDir = "./QF_BV/20200415-Yurichev/", + %StrDir = "./QF_BV/bmc-bv-svcomp14/", + %StrDir = "./QF_BV/calypto/", + %StrDir = "./QF_BV/challenge/", + %StrDir = "./QF_BV/check2/", + %StrDir = "./QF_BV/dwp_formulas/", + %StrDir = "./QF_BV/ecc/", % NULL comparé a cvc4 + %StrDir = "./QF_BV/float/", + %StrDir = "./QF_BV/galois/", % 2 BUGS / 4 fich (unknown) + %StrDir = "./QF_BV/gulwani-pldi08/", + %StrDir = "./QF_BV/log-slicing/", + %StrDir = "./QF_BV/mcm/", + %StrDir = "./QF_BV/pipe/", + %StrDir = "./QF_BV/pspace/", + %StrDir = "./QF_BV/rubik/", + %StrDir = "./QF_BV/RWS/", + %StrDir = "./QF_BV/sage/", + %StrDir = "./QF_BV/sage2/", + %StrDir = "./QF_BV/spear/", + %StrDir = "./QF_BV/stp/", + %StrDir = "./QF_BV/stp_samples/", + %StrDir = "./QF_BV/tacas07/", + %StrDir = "./QF_BV/uclid/", + %StrDir = "./QF_BV/uclid_contrib_smtcomp09/", + %StrDir = "./QF_BV/uum/", + %StrDir = "./QF_BV/VS3/", + %StrDir = "./QF_BV/wienand-cav2008/", + + %StrDir = "./QF_BV/asp/", + %StrDir = "./QF_BV/bench_ab/",%OK + %StrDir = "./QF_BV/bmc-bv/", + %StrDir = "./QF_BV/bmc-bv-svcomp14/", + %StrDir = "./QF_BV/brummayerbiere/", + %StrDir = "./QF_BV/brummayerbiere2/", + %StrDir = "./QF_BV/brummayerbiere3/", + %StrDir = "./QF_BV/brummayerbiere4/", + %StrDir = "./QF_BV/bruttomesso/", % plein de TO + %StrDir = "./QF_BV/crafted/", +%----------------------------------------------------------------------- %StrDir = "QF_ABV/bench_ab/", %StrDir = "QF_ABV/bmc-arrays/", @@ -1059,6 +1154,7 @@ smt_unit_test(TO) :- initNbCodes, setval(nbFile,0), setval(nbTO,0), + setval(no_dolmen_warning,1)@eclipse, getval(use_delta,UD)@eclipse, getval(use_simplex,US)@eclipse, length(SmtFileList,NFs), diff --git a/Src/COLIBRI/colibri.pl b/Src/COLIBRI/colibri.pl index 89cbb1b85ab854e156a4c61d15165f0fec59f33a..6202947d8a2e9d935ff4cecc1c2bd9ceb8b1ee96 100755 --- a/Src/COLIBRI/colibri.pl +++ b/Src/COLIBRI/colibri.pl @@ -165,6 +165,8 @@ init_colibri :- setval(step_stats,0)@eclipse, setval(step_limit,0)@eclipse, setval(nb_steps,0)@eclipse, + % pas warning pour dolmen par defaut + setval(no_dolmen_warning,1)@eclipse, % Initialision des trucs de benching des BV use_prod_bv_congr, diff --git a/Src/COLIBRI/lib/v5/x86_64_linux/simplex_ocaml.so b/Src/COLIBRI/lib/v5/x86_64_linux/simplex_ocaml.so index cb7f97356a5c6f02a55283acea5ae9c19e55b6c7..d52229e72fb6bd49bd9065911b84001fcbbcc355 100755 Binary files a/Src/COLIBRI/lib/v5/x86_64_linux/simplex_ocaml.so and b/Src/COLIBRI/lib/v5/x86_64_linux/simplex_ocaml.so differ diff --git a/Src/COLIBRI/lib/v7/x86_64_linux/simplex_ocaml.so b/Src/COLIBRI/lib/v7/x86_64_linux/simplex_ocaml.so index ca8c498f08c6e00317f18089b2f3672b72dec9d6..87e8299312dad66d8d80645a20e7df522a37bed8 100755 Binary files a/Src/COLIBRI/lib/v7/x86_64_linux/simplex_ocaml.so and b/Src/COLIBRI/lib/v7/x86_64_linux/simplex_ocaml.so differ diff --git a/Src/COLIBRI/lib/v7/x86_64_nt/simplex_ocaml.dll b/Src/COLIBRI/lib/v7/x86_64_nt/simplex_ocaml.dll index b5cbab234366afd9fba16028d2fb18b3a48b3d0c..625c57af47a2c08f0349b01a02001757eadc2b44 100644 Binary files a/Src/COLIBRI/lib/v7/x86_64_nt/simplex_ocaml.dll and b/Src/COLIBRI/lib/v7/x86_64_nt/simplex_ocaml.dll differ diff --git a/Src/COLIBRI/mbv_propa.pl b/Src/COLIBRI/mbv_propa.pl index 2ae6655e64763d9920f22e2f9ddda4caf918e759..90a270f57e708b05c4aa5ea64d4cdb87c2392bb3 100644 --- a/Src/COLIBRI/mbv_propa.pl +++ b/Src/COLIBRI/mbv_propa.pl @@ -156,11 +156,7 @@ launch_bveq(Sx,X,Sy,Y) :- (Sx > Sy -> bveq(Sy,Y,Sx,X) ; bveq(Sx,X,Sy,Y)). -/* -bveq(_, X, _, Y) ?- - !, - protected_unify(X,Y). -*/ + bveq(_,X,_,X) ?- !. bveq(Size, X, Size, Y) ?- !, @@ -201,6 +197,13 @@ filter_bveq(Sx, X, Sy, Y, Stop) :- % Forme normale Sx < Sy save_cstr_suspensions((X,Y)), get_saved_cstr_suspensions(LSusp), + ((member((_,bveq(Sx, XX, Sy, YY)),LSusp), + X == XX) + -> + Stop = 1, + protected_unify(Y,YY) + ; true). +/* % On peut factoriser sur les memes tailles % quand les plus petits/grands sont egaux ((member((_,bveq(Sx, XX, Sy, YY)),LSusp), @@ -215,7 +218,7 @@ filter_bveq(Sx, X, Sy, Y, Stop) :- Stop = 1, protected_unify(U1,U2) ; true). - +*/ % =================== And ==================== @@ -682,7 +685,7 @@ bvxor_bis(M,X,Y,Z) :- (var(Continue) -> true ; get_saved_cstr_suspensions(LSusp), - ((member((S,bvxor(M,XX,YY,ZZ)),LSusp), + ((member((S,bvxor_bis(M,XX,YY,ZZ)),LSusp), three_on_three([X,Y,Z],[XX,YY,ZZ],R1,R2)) -> protected_unify(R1,R2) @@ -879,10 +882,8 @@ bvsl_bis(M,X,Y,Z) :- set_priority(1), save_cstr_suspensions((X,Y,Z)), get_saved_cstr_suspensions(LSusp), - filter_bvsl_susps(M,X,Y,Z,LSusp,Stop), - (var(Stop) -> - bvsl_inst_free(M,X,Y,Z,Continue) - ; true), + filter_bvsl_susps(M,X,Y,Z,LSusp), + bvsl_inst_free(M,X,Y,Z,Continue), (var(Continue) -> true ; % TODO why here reduced Prod is done AFTER, while in and/or is done before @@ -929,55 +930,15 @@ sl_interval_ON(M,X,Y,Z) :- mfd:set_intervals(Z, ZInter) ; true). -filter_bvsl_susps(M,X,Y,Z,LSusp, Stop) :- -% For comments, see the bvsr counterpart - ((member_begin_end((S,Goal),LSusp,NLSusp,End,End), - (Goal = bvsl_bis(M,XX,YY,ZZ), - X == XX, - G = sl; - Goal = check_multN(u,M,A,B,Res,C,K,UO), - (X == A, number(B), B is 2^Y; - X == B, number(A), A is 2^Y), - G = mult; - Y == 1, - Goal = check_addN(u,M,A,B,Res,C,UO), - Z == C, - (X == A; - X == B), - G = add)) +filter_bvsl_susps(M,X,Y,Z,LSusp) :- + Goal = bvsl_bis(M,XX,YY,ZZ), + ((member((S,Goal),LSusp), + X == XX, + Y == YY) -> - (G == sl -> - (Y == YY -> - % factorisation - kill_suspension(S), - protected_unify(Z,ZZ) - ; (Z == ZZ -> - protected_unify(Z,0), - (Y < YY -> - kill_suspension(S) - ; Stop = 1) - ; ((Y < YY, - nonvar(Z)) - -> - Diff is YY - Y, - ZZ is Z << Diff, - kill_suspension(S) - ; ( YY < Y, nonvar(ZZ) -> - Diff is Y - YY, - Z is ZZ << Diff, - Stop = 1 - ; true)))) - ; % G = mult ou G = add - % on peut tuer le check_xxN mais - % on doit garder les autres contraintes - % car on ne sait pas si elles ont ete factorisees - %kill_suspension(S), - (G == mult -> - protected_unify(Z,C) - ; protected_unify(A,B))), - (var(Stop) -> - filter_bvsl_susps(M,X,Y,Z,NLSusp,Stop) - ; true) + % factorisation + kill_suspension(S), + protected_unify(Z,ZZ) ; true). % TODO : check what reactivating Continue=1 does @@ -1076,10 +1037,8 @@ bvsr_bis(M,X,Y,Z) :- set_priority(1), save_cstr_suspensions((X,Y,Z)), get_saved_cstr_suspensions(LSusp), - filter_bvsr_susps(M,X,Y,Z,LSusp,Stop), - (var(Stop) -> - bvsr_inst_free(M,X,Y,Z,Continue) - ; true), + filter_bvsr_susps(M,X,Y,Z,LSusp), + bvsr_inst_free(M,X,Y,Z,Continue), (var(Continue) -> true ; sr_constr(M, X, Y, Z), @@ -1137,41 +1096,13 @@ sr_interval([C|Inter], Off, [CC|IInter]) :- CC is (C >> Off), sr_interval(Inter, Off, IInter). -filter_bvsr_susps(M,X,Y,Z,LSusp,Stop) :- - ((member_begin_end((S,bvsr_bis(MM,XX,YY,ZZ)),LSusp,NLSusp,End,End), - X == XX) +filter_bvsr_susps(M,X,Y,Z,LSusp) :- + ((member((S,bvsr_bis(M,XX,YY,ZZ)),LSusp), + X == XX, + Y == YY) -> - (Y == YY -> - kill_suspension(S), - protected_unify(Z,ZZ) - ; (Z == ZZ -> - % le plus petit shift contient le plus - % d'informations - protected_unify(Z,0), - (Y < YY -> - kill_suspension(S) - ; % YY < Y - % on laisse l'autre travailler - Stop = 1) - ; ((Y < YY, - nonvar(Z)) - -> - % le plus petit shift contient le plus d'informations - % est on certain que Z et ZZ sont compatibles ? - % on peut le tester ici - Diff is YY - Y, - ZZ is Z >> Diff, - kill_suspension(S) - ; ((YY < Y, - nonvar(ZZ)) - -> - Diff is Y - YY, - Z is ZZ >> Diff - % Stop = 1 - ; true)))), - (var(Stop) -> - filter_bvsr_susps(M,X,Y,Z,NLSusp,Stop) - ; true) + kill_suspension(S), + protected_unify(Z,ZZ) ; true). bvsr_inst_free(M,A,B,C,Continue) :- @@ -1416,19 +1347,12 @@ bvconcat_v2(SX,X,SY,Y,Z) :- filter_concat_susp(SX,X,SY,Y,Z) :- save_cstr_suspensions((X,Y,Z)), get_saved_cstr_suspensions(LSusp), - SZ is SX + SY, ((member((Susp,bvconcat_v2_bis(SX, XX, SY, YY, ZZ)),LSusp), - (X == XX -> - (Y == YY -> - U1 = Z, U2 = ZZ - ; Z == ZZ,%? - U1 = Y, U2 = YY) - ; Y == YY, - Z == ZZ, - U1 = X, U2 = XX)) + X == XX, + Y == YY) -> kill_suspension(Susp), - protected_unify(U1,U2) + protected_unify(Z,ZZ) ; true). :- export bvconcat_v2_bis/5. @@ -1736,10 +1660,18 @@ bvconcat_v3_bis(SX, X, SY, Y, Z) :- :- export bvrotater/4, bvrotatel/4. % Size, Offset, X, Result +bvrotatel(1,I,X,Z) ?- !, + protected_unify(Z,X). +bvrotatel(M,0,X,Z) ?- !, + protected_unify(Z,X). bvrotatel(M,I,X,Z):- bvrotL(M,I,X,Z), bvrotR(M,I,Z,X). +bvrotater(1,I,X,Z) ?- !, + protected_unify(Z,X). +bvrotater(M,0,X,Z) ?- !, + protected_unify(Z,X). bvrotater(M,I,X,Z):- bvrotR(M,I,X,Z), bvrotL(M,I,Z,X). @@ -1986,6 +1918,7 @@ sign_extend(Sx, I, X, Y) :- % =================== Add ====================248474 :- export bvadd/4. + bvadd(M, X,Y,Z) :- bulk_lazy_doms([X,Y,Z],M), %MM is M + 1, diff --git a/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/expr.ml b/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/expr.ml index 08d437347129a33ed68b8071226afc4c1fcea653..f0abea8560d1cfb14a060c04976b2a1a34e3273b 100644 --- a/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/expr.ml +++ b/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/expr.ml @@ -1885,7 +1885,7 @@ module Term = struct let uge = with_cache ~cache:(Hashtbl.create 13) (fun n -> - Id.const ~builtin:Bitv_uge "bvsge" [] [Ty.bitv n; Ty.bitv n] Ty.prop + Id.const ~builtin:Bitv_uge "bvuge" [] [Ty.bitv n; Ty.bitv n] Ty.prop ) let slt = diff --git a/Src/COLIBRI/smt_import.pl b/Src/COLIBRI/smt_import.pl index 1cb895d8967c7f418f076749a584e22cd9c44743..9d9cfaa7fd4e501ef6e4f2f30027f81efa9edf0c 100644 --- a/Src/COLIBRI/smt_import.pl +++ b/Src/COLIBRI/smt_import.pl @@ -44,7 +44,6 @@ read_dolmen_terms(PEnv,Terms) :- ; Terms = [Term|ETerms]), read_dolmen_terms(PEnv,ETerms)). - dolmen_to_colibri_term(set_logic(SLog),Term) ?- !, Term = 'set-logic'(SLog). dolmen_to_colibri_term(exit,Term) ?- !, @@ -77,10 +76,12 @@ dolmen_to_colibri_term(error(String),_) ?- !, writeln(Error), exit_block(syntax). dolmen_to_colibri_term(warn(String),Term) ?- !, - split_string(String,"\"","",LNString), - join_string(LNString,"'",NString), - concat_string(["(warning \"",NString,"\")"],Error), - writeln(Error), + (getval(no_dolmen_warning,1)@eclipse -> + true + ; split_string(String,"\"","",LNString), + join_string(LNString,"'",NString), + concat_string(["(warning \"",NString,"\")"],Error), + writeln(Error)), Term = 'set-info'("Info",""). dolmen_to_colibri_term(set_info(app(symbol(SFlagInfo), [symbol(SInfo)])),Term) ?- !, @@ -384,35 +385,66 @@ get_col_id(SExt,bitv_sign_extend,[sign_extend,S]) :- !, number_string(S,SS). get_col_id(_,bitv_rotate_right(N),[rotate_right,N]) :- !. get_col_id(_,bitv_rotate_left(N),[rotate_left,N]) :- !. -get_col_id('Bitv_not',_,bvnot) :- !. -get_col_id('Bitv_and',_,bvand) :- !. -get_col_id('Bitv_or',_,bvor) :- !. -get_col_id('Bitv_xor',_,bvxor) :- !. -get_col_id('Bitv_nand',_,bvnand) :- !. -get_col_id('Bitv_nor',_,bvnor) :- !. -get_col_id('Bitv_xnor',_,bvxnor) :- !. -get_col_id('Bitv_comp',_,bvcomp) :- !. -get_col_id('Bitv_neg',_,bvneg) :- !. -get_col_id('Bitv_add',_,bvadd) :- !. -get_col_id('Bitv_sub',_,bvsub) :- !. -get_col_id('Bitv_mul',_,bvmul) :- !. -get_col_id('Bitv_udiv',_,bvudiv) :- !. -get_col_id('Bitv_urem',_,bvurem) :- !. -get_col_id('Bitv_sdiv',_,bvsdiv) :- !. -get_col_id('Bitv_srem',_,bvsrem) :- !. -get_col_id('Bitv_smod',_,bvsmod) :- !. -get_col_id('Bitv_shl',_,bvshl) :- !. -get_col_id('Bitv_shr',_,bvshr) :- !. -get_col_id('Bitv_ashr',_,bavshr) :- !. -get_col_id('Bitv_lshr',_,bvlshr) :- !. -get_col_id('Bitv_ult',_,bvult) :- !. -get_col_id('Bitv_ule',_,bvule) :- !. -get_col_id('Bitv_ugt',_,bvugt) :- !. -get_col_id('Bitv_uge',_,bvuge) :- !. -get_col_id('Bitv_slt',_,bvslt) :- !. -get_col_id('Bitv_sle',_,bvsle) :- !. -get_col_id('Bitv_sgt',_,bvsgt) :- !. -get_col_id('Bitv_sge',_,bvsge) :- !. + +get_col_id(_,bitv_not,bvnot) :- !. +%get_col_id('Bitv_not',_,bvnot) :- !. +get_col_id(_,bitv_and,bvand) :- !. +%get_col_id('Bitv_and',_,bvand) :- !. +get_col_id(_,bitv_or,bvor) :- !. +%get_col_id('Bitv_or',_,bvor) :- !. +get_col_id(_,bitv_xor,bvxor) :- !. +%get_col_id('Bitv_xor',_,bvxor) :- !. +get_col_id(_,bitv_nand,bvnand) :- !. +%get_col_id('Bitv_nand',_,bvnand) :- !. +get_col_id(_,bitv_nor,bvnor) :- !. +%get_col_id('Bitv_nor',_,bvnor) :- !. +get_col_id(_,bitv_xnor,bvxnor) :- !. +%get_col_id('Bitv_xnor',_,bvxnor) :- !. +get_col_id(_,bitv_comp,bvcomp) :- !. +%get_col_id('Bitv_comp',_,bvcomp) :- !. +get_col_id(_,bitv_neg,bvneg) :- !. +%get_col_id('Bitv_neg',_,bvneg) :- !. +get_col_id(_,bitv_add,bvadd) :- !. +%get_col_id('Bitv_add',_,bvadd) :- !. +get_col_id(_,bitv_sub,bvsub) :- !. +%get_col_id('Bitv_sub',_,bvsub) :- !. +get_col_id(_,bitv_mul,bvmul) :- !. +%get_col_id('Bitv_mul',_,bvmul) :- !. +get_col_id(_,bitv_udiv,bvudiv) :- !. +%get_col_id('Bitv_udiv',_,bvudiv) :- !. +get_col_id(_,bitv_urem,bvurem) :- !. +%get_col_id('Bitv_urem',_,bvurem) :- !. +get_col_id(_,bitv_sdiv,bvsdiv) :- !. +%get_col_id('Bitv_sdiv',_,bvsdiv) :- !. +get_col_id(_,bitv_srem,bvsrem) :- !. +%get_col_id('Bitv_srem',_,bvsrem) :- !. +get_col_id(_,bitv_smod,bvsmod) :- !. +%get_col_id('Bitv_smod',_,bvsmod) :- !. +get_col_id(_,bitv_shl,bvshl) :- !. +%get_col_id('Bitv_shl',_,bvshl) :- !. +get_col_id(_,bitv_shr,bvshr) :- !. +%get_col_id('Bitv_shr',_,bvshr) :- !. +get_col_id(_,bitv_ashr,bvashr) :- !. +%get_col_id('Bitv_ashr',_,bvashr) :- !. +get_col_id(_,bitv_lshr,bvlshr) :- !. +%get_col_id('Bitv_lshr',_,bvlshr) :- !. + +get_col_id(_,bitv_ult,bvult) :- !. +%get_col_id('Bitv_ult',_,bvult) :- !. +get_col_id(_,bitv_ule,bvule) :- !. +%get_col_id('Bitv_ule',_,bvule) :- !. +get_col_id(_,bitv_ugt,bvugt) :- !. +%get_col_id('Bitv_ugt',_,bvugt) :- !. +get_col_id(_,bitv_uge,bvuge) :- !. +%get_col_id('Bitv_uge',_,bvuge) :- !. +get_col_id(_,bitv_slt,bvslt) :- !. +%get_col_id('Bitv_slt',_,bvslt) :- !. +get_col_id(_,bitv_sle,bvsle) :- !. +%get_col_id('Bitv_sle',_,bvsle) :- !. +get_col_id(_,bitv_sgt,bvsgt) :- !. +%get_col_id('Bitv_sgt',_,bvsgt) :- !. +get_col_id(_,bitv_sge,bvsge) :- !. +%get_col_id('Bitv_sge',_,bvsge) :- !. get_col_id('fp.abs',_,'fp.abs') :- !. get_col_id('fp.neg',_,'fp.neg') :- !. @@ -1420,6 +1452,7 @@ new_index_elem_val(sort(Sort),Var) ?- !, ((atomic(Var),get_binding(Var,_,_); nonvar(Var),Var = select(_,_)) -> + % cas déjà traités true ; new_sort_val(Sort)). new_index_elem_val(_,_). @@ -2606,11 +2639,13 @@ smt_interp0(rotate_left(I,A),rotate_left(SA,NI,IA),uint(Size)) :- !, smt_interp(I,NI,int), integer(NI), NI >= 0, + SA = Size, smt_interp(A,IA,uint(Size)). smt_interp0(rotate_right(I,A),rotate_right(SA,NI,IA),uint(Size)) :- !, smt_interp(I,NI,int), integer(NI), NI >= 0, + SA = Size, smt_interp(A,IA,uint(Size)). smt_interp0(zero_extend(I,A),zero_extend(SA,NI,IA),uint(S)) :- !, smt_interp(I,NI,int), @@ -2744,6 +2779,12 @@ new_quantifier_abstraction(Res) :- setval(decl,ODecl-NEnd), Res = as(NVar,bool). +% on garde les realString +check_eval(Type,realString(Str),RE) ?- !, + RE = as(realString(Str),Type). +% on traverse les as +check_eval(_Type,as(E,Type),RE) ?- !, + check_eval(Type,E,RE). check_eval(Type,E,RE) :- (ground(E) -> (var(Type) -> @@ -2764,7 +2805,8 @@ add_as0(Type,I,AsI) :- nonvar(Type), (var(I); atomic(I); - functor(I,uninterp,_)), + functor(I,F,_), + occurs(F,(uninterp,realString))), !, AsI = as(I,Type). add_as0(Type,I,AsI) :- diff --git a/Src/COLIBRI/solve.pl b/Src/COLIBRI/solve.pl index d032e51f110966eee1e616fb1dec9e15dd5df1bb..fe28dee9258fa0f7a07ed497188e6444e9f8be7e 100644 --- a/Src/COLIBRI/solve.pl +++ b/Src/COLIBRI/solve.pl @@ -157,6 +157,7 @@ trans_col(or_seq_reif(X,_,Y,Z),(X or Y) #= Z). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % TODO : ajouter declaration type pour BV unfold_int_expr_block(E,D,C,T,R) :- + get_priority(P), call_priority( block(once unfold_int_expr(E,D,C,T,R), Tag, @@ -165,7 +166,9 @@ unfold_int_expr_block(E,D,C,T,R) :- ; exit_block(Tag))), 1), call(smt_check_disabled_delta)@eclipse, - garbage_collect. + garbage_collect, + set_priority(P), + wake. '#:'(L,I) :- (I == bool -> @@ -347,7 +350,9 @@ rnd_vars(T) :- insert_dep_inst(inst_cstr(0,X))))). array_vars(TypeI,TypeE0,[T|LT]) ?- !, - (real_type(TypeE0,TypeE) -> + ((TypeE0 \== real_int, + real_type(TypeE0,TypeE)) + -> true ; TypeE = TypeE0), (foreach(X,[T|LT]), @@ -361,7 +366,9 @@ array_vars(TypeI,TypeE0,[T|LT]) ?- !, array_vars(TypeI,TypeE0,X) :- var(X), !, - (real_type(TypeE0,TypeE) -> + ((TypeE0 \== real_int, + real_type(TypeE0,TypeE)) + -> true ; TypeE = TypeE0), (get_variable_type(X,array(TypeI,TypeE)) -> @@ -1045,39 +1052,19 @@ unfold_int_expr(bvnot(Size,EA), D, Cstr, Type, R) ?- integer(Size), Size > 0, Type = uint(Size), - (bvnot_expr(Size,EA,NotEA) -> - !, - unfold_int_expr(NotEA,D,Cstr,Type,R) - ; ND is D + 1, - ((Size == 1, - nonvar(R)) - -> - !, - NotR is (R+1) mod 2, - unfold_int_expr(EA,ND,Cstr,Type,NotR) - ; unfold_int_expr(EA,ND,CA,Type,A), - !, - (number(A) -> - bvnot(Size,A,R0), - blocked_unify(R,R0), - Cstr = CA - ; (fail,Size == 1 -> - int_vars(Type,R) - ; set_int_type(Type,R)), - insert_dep_inst(dep(R,D,[A])), - make_conj(CA, bvnot(Size,A,R),Cstr)))). + !, + unfold_int_expr(EA,D,CA,Type,A), + insert_dep_inst(dep(R,D,[A])), + make_conj(CA, bvnot(Size,A,R),Cstr). unfold_int_expr(bvnand(Size,EA,EB), D, Cstr, Type, R) ?- !, - ND is D - 1, - unfold_int_expr(bvnot(Size,bvand(Size,EA,EB)), ND, Cstr, Type, R). + unfold_int_expr(bvnot(Size,bvand(Size,EA,EB)), D, Cstr, Type, R). unfold_int_expr(bvnor(Size,EA,EB), D, Cstr, Type, R) ?- !, - ND is D - 1, - unfold_int_expr(bvnot(Size,bvor(Size,EA,EB)), ND, Cstr, Type, R). + unfold_int_expr(bvnot(Size,bvor(Size,EA,EB)), D, Cstr, Type, R). unfold_int_expr(bvxnor(Size,EA,EB), D, Cstr, Type, R) ?- !, - ND is D - 1, - unfold_int_expr(bvnot(Size,bvxor(Size,EA,EB)), ND, Cstr, Type, R). + unfold_int_expr(bvnot(Size,bvxor(Size,EA,EB)), D, Cstr, Type, R). unfold_int_expr(bvcomp(Size,EA,EB), D, Cstr, RType, R) ?- ND is D + 1, @@ -1101,43 +1088,26 @@ unfold_int_expr(bvcomp(Size,EA,EB), D, Cstr, RType, R) ?- insert_dep_inst(dep(R,D,[A,B])), make_conj(CAB, eq_int_reif(Type,A,B,R),Cstr)). +/* +Size = 6, +int_vars(uint(Size),(A,NA)), +DpSize is 2^Size, +bvneg(Size,A) #= NA, +uintN_from_int(Size,(as(DpSize,int) - int_from_uintN(Size,A)) mod DpSize) #\= + NA, +solve_cstrs. +*/ unfold_int_expr(bvneg(Size,EA), D, Cstr, Type, R) ?- !, integer(Size), Size > 0, Type = uint(Size), - %ça risque pas de fail parce qu'on est en unsigned? + % ça risque pas de fail parce qu'on est en unsigned? (Size == 1 -> get_reif_var_depth_from_labchoice(DD), insert_dep_inst(dep(inst_cstr(DD,R))) ; true), unfold_int_expr(-EA, D, Cstr, Type, R). -%% unfold_int_expr(bvadd(Size,EA,EB), D, Cstr, Type, R) ?- -%% ND is D + 1, -%% integer(Size), -%% Size > 0, -%% Type = uint(Size), -%% unfold_int_expr(EA,ND,CA,Type,A), -%% unfold_int_expr(EB,ND,CB,Type,B), -%% !, -%% insert_dep_inst(dep(R,D,[A,B])), -%% (Size == 1 -> -%% get_reif_var_depth_from_labchoice(DD), -%% insert_dep_inst(dep(inst_cstr(DD,R))) -%% ; true), -%% Mask is \ (-1 << Size), -%% make_conj(CA,CB,CAB), -%% %% make_conj(CAB, (add(Type,D,A,B,R,UO), -%% %% bvand(Size, A, Mask, AA), -%% %% bvand(Size, B, Mask, BB), -%% %% bvand(Size, R, Mask, RR)%, -%% %% %bvadd(Size, AA, BB, RR) -%% %% ), -%% %% Cstr). -%% %make_conj(CAB, (add(Type,D,A,B,R,UO), bvadd(Size, A, B, R)),Cstr). -%% make_conj(CAB, (add(Type,D,A,B,R,UO) ),Cstr). -%% %make_conj(CAB, ( bvadd(Size, A, B, R)),Cstr). - /* Size = 8, int_vars(uint(Size),[A,B]), bvadd(Size,A,B) #\= uintN_from_int(Size,int_from_uintN(Size,A) + int_from_uintN(Size,B)), @@ -1148,9 +1118,6 @@ unfold_int_expr(bvadd(Size,EA,EB), D, Cstr, Type, R) ?- Size > 0, !, Type = uint(Size), - (fail,Size == 1 -> - int_vars(Type,R) - ; true), unfold_int_expr(EA + EB, D, Cstr, Type, R). /* @@ -1163,10 +1130,15 @@ unfold_int_expr(bvsub(Size,EA,EB), D, Cstr, Type, R) ?- Size > 0, !, Type = uint(Size), - (fail,Size == 1 -> - int_vars(Type,R) - ; true), + unfold_int_expr(bvadd(Size,EA,bvneg(Size,EB)), D, Cstr, Type, R). +/* +unfold_int_expr(bvsub(Size,EA,EB), D, Cstr, Type, R) ?- + integer(Size), + Size > 0, + !, + Type = uint(Size), unfold_int_expr(EA - EB, D, Cstr, Type, R). +*/ /* Size = 6, int_vars(uint(Size),[A,B]), @@ -1178,33 +1150,36 @@ unfold_int_expr(bvmul(Size,EA,EB), D, Cstr, Type, R) ?- Size > 0, !, Type = uint(Size), - (fail,Size == 1 -> - int_vars(Type,R) - ; true), unfold_int_expr(EA * EB, D, Cstr, Type, R). /* - Size = 6, int_vars(uint(Size),[A,B]), - bvmul(Size,A,B) #\= uintN_from_int(Size,int_from_uintN(Size,A) * int_from_uintN(Size,B)), - solve_cstrs. +Size = 6, int_vars(uint(Size),[A,B,Q]), +DpSizeM1 is (2^Size)-1, +uintN_from_int(Size,ite(B#=0,as(DpSizeM1,int),int_from_uintN(Size,A) div +int_from_uintN(Size,B))) #= Q, +bvudiv(Size,A,B) #\= Q, +solve_cstrs. */ unfold_int_expr(bvudiv(Size,EA,EB), D, Cstr, Type, R) ?- integer(Size), Size > 0, !, Type = uint(Size), - (fail,Size == 1 -> - int_vars(Type,R) - ; true), unfold_int_expr(EA // EB, D, Cstr, Type, R). + +/* +Size = 6, int_vars(uint(Size),[A,B,R]), +DpSizeM1 is (2^Size)-1, +uintN_from_int(Size,ite(B#=0,int_from_uintN(Size,A),int_from_uintN(Size,A) rem +int_from_uintN(Size,B))) #= R, +bvurem(Size,A,B) #\= R, +solve_cstrs. +*/ unfold_int_expr(bvurem(Size,EA,EB), D, Cstr, Type, R) ?- integer(Size), Size > 0, !, Type = uint(Size), - (fail,Size == 1 -> - int_vars(Type,R) - ; true), unfold_int_expr(EA rem EB, D, Cstr, Type, R). @@ -1232,7 +1207,33 @@ unfold_int_expr(bvsdiv(Size,EA,EB), D, Cstr, Type, R) ?- Size > 0, !, Type = uint(Size), - unfold_int_expr(uintN_from_intN(Size,intN_from_uint(Size,EA) // intN_from_uint(Size,EB)),D,Cstr,Type,R). + PSize is Size - 1, + DDD is D + 2, + DD is D + 1, + unfold_int_expr(EA,DDD,CA,Type,A), + unfold_int_expr(extract(Size,PSize,PSize,A),DD,CSA,uint(1),SA), + make_conj(CA,CSA,CstrA0), + unfold_int_expr(ite(as(SA,uint(1))#=0, + A, + bvneg(Size,A)), + DD,CabsA,Type,AbsA), + make_conj(CstrA0,CabsA,CstrA), + unfold_int_expr(EB,DDD,CB,Type,B), + unfold_int_expr(extract(Size,PSize,PSize,B),DD,CSB,uint(1),SB), + make_conj(CB,CSB,CstrB0), + unfold_int_expr(ite(as(SB,uint(1))#=0, + B, + bvneg(Size,B)), + DD,CabsB,Type,AbsB), + make_conj(CstrB0,CabsB,CstrB), + make_conj(CstrA,CstrB,CAB), + unfold_int_expr(ite(as(SA,uint(1)) #= SB, + bvudiv(Size,AbsA,AbsB), + bvneg(Size,bvudiv(Size,AbsA,AbsB))), + D,CR,Type,R), + make_conj(CAB,CR,Cstr). +% FAUX +% unfold_int_expr(uintN_from_intN(Size,intN_from_uint(Size,EA) // intN_from_uint(Size,EB)),D,Cstr,Type,R). /* Test definition bvsrem Size = 8, @@ -1258,7 +1259,35 @@ unfold_int_expr(bvsrem(Size,EA,EB), D, Cstr, Type, R) ?- Size > 0, !, Type = uint(Size), - unfold_int_expr(uintN_from_intN(Size,intN_from_uint(Size,EA) rem intN_from_uint(Size,EB)),D,Cstr,Type,R). + PSize is Size - 1, + DDD is D + 2, + DD is D + 1, + unfold_int_expr(EA,DDD,CA,Type,A), + unfold_int_expr(extract(Size,PSize,PSize,A),DD,CSA,uint(1),SA), + make_conj(CA,CSA,CstrA0), + unfold_int_expr(ite(as(SA,uint(1)) #= 0, + A, + bvneg(Size,A)), + DD,CabsA,Type,AbsA), + make_conj(CstrA0,CabsA,CstrA), + unfold_int_expr(EB,DDD,CB,Type,B), + unfold_int_expr(extract(Size,PSize,PSize,B),DD,CSB,uint(1),SB), + make_conj(CB,CSB,CstrB0), + unfold_int_expr(ite(as(SB,uint(1)) #= 0, + B, + bvneg(Size,B)), + DD,CabsB,Type,AbsB), + make_conj(CstrB0,CabsB,CstrB), + make_conj(CstrA,CstrB,CAB), + unfold_int_expr(bvurem(Size,AbsA,AbsB),DDD,CU,Type,U), + make_conj(CAB,CU,CABU), + unfold_int_expr(ite(as(SA,uint(1)) #= 0, + U, + bvneg(Size,U)), + D,CR,Type,R), + make_conj(CABU,CR,Cstr). +% FAUX +% unfold_int_expr(uintN_from_intN(Size,intN_from_uint(Size,EA) rem intN_from_uint(Size,EB)),D,Cstr,Type,R). /* Test definition bvsmod Size = 8, @@ -1289,7 +1318,42 @@ unfold_int_expr(bvsmod(Size,EA,EB), D, Cstr, Type, R) ?- Size > 0, !, Type = uint(Size), - unfold_int_expr(uintN_from_intN(Size,intN_from_uint(Size,EA) mod intN_from_uint(Size,EB)),D,Cstr,Type,R). + PSize is Size - 1, + DDD is D + 2, + DD is D + 1, + unfold_int_expr(EA,DDD,CA,Type,A), + unfold_int_expr(extract(Size,PSize,PSize,A),DD,CSA,uint(1),SA), + make_conj(CA,CSA,CstrA0), + unfold_int_expr(ite(as(SA,uint(1)) #= 0, + A, + bvneg(Size,A)), + DD,CabsA,Type,AbsA), + make_conj(CstrA0,CabsA,CstrA), + unfold_int_expr(EB,DDD,CB,Type,B), + unfold_int_expr(extract(Size,PSize,PSize,B),DD,CSB,uint(1),SB), + make_conj(CB,CSB,CstrB0), + unfold_int_expr(ite(as(SB,uint(1)) #= 0, + B, + bvneg(Size,B)), + DD,CabsB,Type,AbsB), + make_conj(CstrB0,CabsB,CstrB), + make_conj(CstrA,CstrB,CAB), + unfold_int_expr(bvurem(Size,AbsA,AbsB),DDD,CU,Type,U), + make_conj(CAB,CU,CABU), + unfold_int_expr(ite(as(U,Type) #= 0, + U, + ite((as(SA,uint(1)) #= 0) and (as(SB,uint(1)) #= 0), + U, + ite((as(SA,uint(1)) #= 1) and (as(SB,uint(1)) #= 0), + bvadd(Size,bvneg(Size,U),B), +% bvsub(Size,B,U), + ite((as(SA,uint(1)) #= 0) and (as(SB,uint(1)) #= 1), + bvadd(Size,U,B), + bvneg(Size,U))))), + D,CR,Type,R), + make_conj(CABU,CR,Cstr). +% FAUX +% unfold_int_expr(uintN_from_intN(Size,intN_from_uint(Size,EA) mod intN_from_uint(Size,EB)),D,Cstr,Type,R). unfold_int_expr(bvashr(Size,EA,EB), D, Cstr, Type, R) ?- ND is D + 1, @@ -1313,6 +1377,23 @@ unfold_int_expr(bvashr(Size,EA,EB), D, Cstr, Type, R) ?- insert_dep_inst(dep(R,D,[A,B])), make_conj(CAB,bvasr(Size,A,B,R),Cstr)). +/* +% preuve bvudiv +int_vars(uint(6),A), +member(B,[0,1,2,3,4,5]), +bvlshr(6,A,as(B,uint(6))) #= as(R,uint(6)), +DpB is 2^B, +bvudiv(6,A,as(DpB,uint(6))) #\= as(R,uint(6)), +solve_cstrs. + +% preuve zero_extend/extract +int_vars(uint(6),A), +member(B,[0,1,2,3,4,5]), +bvlshr(6,A,as(B,uint(6))) #= as(R,uint(6)), +SE is 6 - B, +zero_extend(SE,B,extract(6,5,B,A)) #\= as(R,uint(6)), +solve_cstrs. +*/ unfold_int_expr(bvlshr(Size,EA,EB), D, Cstr, Type, R) ?- ND is D + 1, integer(Size), @@ -1321,9 +1402,6 @@ unfold_int_expr(bvlshr(Size,EA,EB), D, Cstr, Type, R) ?- unfold_int_expr(EA,ND,CA,Type,A), unfold_int_expr(EB,ND,CB,Type,B), !, - (fail,Size == 1 -> - int_vars(Type,R) - ; true), make_conj(CA,CB,CAB), ((number(A), number(B)) @@ -1335,6 +1413,26 @@ unfold_int_expr(bvlshr(Size,EA,EB), D, Cstr, Type, R) ?- insert_dep_inst(dep(R,D,[A,B])), make_conj(CAB,bvlsr(Size,A,B,R),Cstr)). +/* ?????? +% preuve bvmul +int_vars(uint(6),A), +member(B,[0,1,2,3,4,5]), +bvshl(6,A,as(B,uint(6))) #= as(R,uint(6)), +DpB is 2^B, +bvmul(6,A,as(DpB,uint(6))) #\= as(R,uint(6)), +solve_cstrs. + +% preuve concat/extract +int_vars(uint(6),A), +member(B,[0,1,2,3,4,5]), +bvshl(6,A,as(B,uint(6))) #= as(R,uint(6)), +Bp1 is B + 1, +H is 6-Bp1, +SBeg is H+1, +concat(SBeg,extract(6,H,0,A),B,as(0,uint(B))) #= as(R1,uint(6)), +as(R1,uint(6)) #\= as(R,uint(6)), +solve_cstrs. +*/ unfold_int_expr(bvshl(Size,EA,EB), D, Cstr, Type, R) ?- ND is D + 1, integer(Size), @@ -1350,43 +1448,49 @@ unfold_int_expr(bvshl(Size,EA,EB), D, Cstr, Type, R) ?- bvsl(Size,A,B,R0), blocked_unify(R,R0), Cstr = CAB - ; (fail,Size == 1 -> - int_vars(Type,R) - ; set_int_type(Type,R)), - insert_dep_inst(dep(R,D,[A,B])), + ; insert_dep_inst(dep(R,D,[A,B])), make_conj(CAB,bvsl(Size,A,B,R),Cstr)). unfold_int_expr(concat(SizeA,EA,SizeB,EB), D, Cstr, Type, R) ?- - Type = uint(Size), - ND is D + 1, - integer(SizeA), - SizeA > 0, - integer(SizeB), - SizeB > 0, - unfold_int_expr(EA,ND,CA,uint(SizeA),A), - unfold_int_expr(EB,ND,CB,uint(SizeB),B), - !, - Size is SizeA+SizeB, - make_conj(CA,CB,CAB), - ((number(R) -> - (number(A); - number(B)) - ; (number(A), - number(B))) + ((SizeA == 0, + AB = EB; + SizeB == 0, + AB = EA) -> - (bvconcat(SizeA,A,SizeB,B,R) -> - true - ; exit_block(unsat)), - Cstr = CAB - ; insert_dep_inst(dep(R,D,[A,B])), - (fail,SizeA == 1 -> - int_vars(uint(1),A) - ; true), - (fail,SizeB == 1 -> - int_vars(uint(1),B) - ; true), - make_conj(CAB, bvconcat(SizeA,A,SizeB,B,R),Cstr)). + !, + unfold_int_expr(AB,D,Cstr,Type,R) + ; Type = uint(Size), + ND is D + 1, + integer(SizeA), + SizeA > 0, + integer(SizeB), + SizeB > 0, + unfold_int_expr(EA,ND,CA,uint(SizeA),A), + unfold_int_expr(EB,ND,CB,uint(SizeB),B), + !, + Size is SizeA+SizeB, + make_conj(CA,CB,CAB), + ((number(R) -> + (number(A); + number(B)) + ; (number(A), + number(B))) + -> + (bvconcat(SizeA,A,SizeB,B,R) -> + true + ; exit_block(unsat)), + Cstr = CAB + ; insert_dep_inst(dep(R,D,[A,B])), + make_conj(CAB, bvconcat(SizeA,A,SizeB,B,R),Cstr))). +/* +int_vars(uint(6),A), +extract(6,5,4,A) #= as(Beg,uint(2)), +extract(6,3,2,A) #= as(Mid,uint(2)), +extract(6,1,0,A) #= as(End,uint(2)), +concat(4,concat(2,Beg,2,Mid),2,End) #\= A, +solve_cstrs. +*/ unfold_int_expr(extract(SizeA,I,J,EA), D, Cstr, Type, R) ?- Type = uint(N), integer(SizeA), integer(I), integer(J), @@ -1460,6 +1564,15 @@ unfold_int_expr(repeat(Size,I,EA), D, Cstr, Type, R) ?- /*NoDeltaBV*/ make_conj(CA, repeat(Size,I,A,R), Cstr)). %%/*DeltaBV*/make_conj(CA, (repeat(Size,I,A,R), launch_geq(R,A)), Cstr)). +/* +Size = 8,I = 3, +SizeR is Size + I, +int_vars(uint(Size),A), +int_vars(uint(SizeR),R), +concat(I,repeat(1,I,as(0,uint(1))),Size,A) #= R, +zero_extend(Size,I,A) #\= R, +solve_cstrs. +*/ unfold_int_expr(zero_extend(Size,I,EA), D, Cstr, Type, R) ?- Type = uint(SizeR), integer(Size), @@ -1492,6 +1605,16 @@ unfold_int_expr(zero_extend(Size,I,EA), D, Cstr, Type, R) ?- D,Cstr,Type,R). */ +/* +Size = 8,I = 3, +SizeR is Size + I, +int_vars(uint(Size),A), +int_vars(uint(SizeR),R), +extract(Size,7,7,A) #= as(SA,uint(1)), +concat(I,repeat(1,I,SA),Size,A) #= R, +sign_extend(Size,I,A) #\= R, +solve_cstrs. +*/ unfold_int_expr(sign_extend(Size,I,EA), D, Cstr, Type, R) ?- integer(Size), integer(I), @@ -1537,7 +1660,19 @@ unfold_int_expr(bvugt(EA, EB), D, Cstr, Type, R) ?- unfold_int_expr(bvuge(EA, EB), D, Cstr, Type, R) ?- !, unfold_int_expr(EA >= EB, D, Cstr, Type, R). - +/* +Size = 5,PSize is Size - 1, +int_vars(uint(Size),(S,T)), +int_vars(uint(1),(Ss,St)), +extract(Size,PSize,PSize,S) #= as(Ss,uint(1)), +extract(Size,PSize,PSize,T) #= as(St,uint(1)), +bvslt(Size,S,T) #= as(B,bool), +ite((Ss #= as(1,uint(1))) and (St #= as(0,uint(1))), + as(1,bool), + (Ss #= St) and bvult(S,T)) #= as(NB,bool), +as(NB,bool) #\= as(B,bool), +solve_cstrs. +*/ unfold_int_expr(bvslt(N, EA, EB), D, Cstr, Type, R) ?- !, unfold_int_expr(intN_from_uint(N,EA) < intN_from_uint(N,EB),D,Cstr,Type,R). @@ -1558,6 +1693,20 @@ unfold_int_expr(bvslt(N, EA, EB), D, Cstr, Type, R) ?- bvult(as(A,uint(N)),as(B,uint(N))))), D, Cstr, Type, R). */ + +/* +Size = 5,PSize is Size - 1, +int_vars(uint(Size),(S,T)), +int_vars(uint(1),(Ss,St)), +extract(Size,PSize,PSize,S) #= as(Ss,uint(1)), +extract(Size,PSize,PSize,T) #= as(St,uint(1)), +bvsle(Size,S,T) #= as(B,bool), +ite((Ss #= as(1,uint(1))) and (St #= as(0,uint(1))), + as(1,bool), + (Ss #= St) and bvule(S,T)) #= as(NB,bool), +as(NB,bool) #\= as(B,bool), +solve_cstrs. +*/ unfold_int_expr(bvsle(N, EA, EB), D, Cstr, Type, R) ?- !, unfold_int_expr(intN_from_uint(N,EA) =< intN_from_uint(N,EB), D, Cstr, Type, R). @@ -1825,15 +1974,7 @@ unfold_int_expr(EA // EB,D,Cstr,Type,R) ?- insert_dep_inst(dep(Rem,D,[UO])), make_conj(CA,CB,CAB), make_conj(CAB,Cond,CABCond), - ((number(A), - number(B), - CABCond == true) - -> - chk_undef_div_rem(Bool,Type,A,B,R0,Rem,UO), - blocked_unify(R,R0), - Cstr = CABCond - ; make_conj(CAB,Cond,CABCond), - make_conj(CABCond,chk_undef_div_rem(Bool,Type,A,B,R,Rem,UO),Cstr)). + make_conj(CABCond,chk_undef_div_rem(Bool,Type,A,B,R,Rem,UO),Cstr). unfold_int_expr(EA rem EB,D,Cstr,Type,R) ?- ND is D + 1, unfold_int_expr(EA,ND,CA,Type,A), @@ -1856,14 +1997,7 @@ unfold_int_expr(EA rem EB,D,Cstr,Type,R) ?- insert_dep_inst(dep(Q,D,[UO])), make_conj(CA,CB,CAB), make_conj(CAB,Cond,CABCond), - ((number(A), - number(B), - CABCond == true) - -> - chk_undef_div_rem(Bool,Type,A,B,Q,R0,UO), - blocked_unify(R,R0), - Cstr = CABCond - ; make_conj(CABCond,chk_undef_div_rem(Bool,Type,A,B,Q,R,UO),Cstr)). + make_conj(CABCond,chk_undef_div_rem(Bool,Type,A,B,Q,R,UO),Cstr). unfold_int_expr(EA div EB,D,Cstr,Type,R) ?- ND is D + 1, unfold_int_expr(EA,ND,CA,Type,A), @@ -1881,14 +2015,7 @@ unfold_int_expr(EA div EB,D,Cstr,Type,R) ?- insert_dep_inst(dep(Rst,D,[A,B,Bool,R])), make_conj(CA,CB,CAB), make_conj(CAB,Cond,CABCond), - ((number(A), - number(B), - CABCond == true) - -> - chk_undef_ediv_mod(Bool,Type,A,B,R0,Rst), - blocked_unify(R,R0), - Cstr = CABCond - ; make_conj(CABCond,chk_undef_ediv_mod(Bool,Type,A,B,R,Rst),Cstr)). + make_conj(CABCond,chk_undef_ediv_mod(Bool,Type,A,B,R,Rst),Cstr). unfold_int_expr(EA mod EB,D,Cstr,Type,R) ?- ND is D + 1, unfold_int_expr(EA,ND,CA,Type,A), @@ -1906,14 +2033,7 @@ unfold_int_expr(EA mod EB,D,Cstr,Type,R) ?- insert_dep_inst(dep(Q,D,[A,B,Bool,R])), make_conj(CA,CB,CAB), make_conj(CAB,Cond,CABCond), - ((number(A), - number(B), - CABCond == true) - -> - chk_undef_ediv_mod(Bool,Type,A,B,Q,R0), - blocked_unify(R,R0), - Cstr = CABCond - ; make_conj(CABCond,chk_undef_ediv_mod(Bool,Type,A,B,Q,R),Cstr)). + make_conj(CABCond,chk_undef_ediv_mod(Bool,Type,A,B,Q,R),Cstr). unfold_int_expr(EA ^ EN,D,Cstr,Type,R) ?- ND is D + 1, @@ -1975,18 +2095,7 @@ unfold_int_expr(EA #= EB,D,Cstr,Type0,R) ?- !, unfold_int_expr(neg(alldiff(Type,[as(A,Type),EB])),D,CEq,bool,R), make_conj(CA,CEq,Cstr) - ; (R == 1 -> - A = B - ; ((R == 0, - number(A), - (Type == bool; - Type == uint(1))) - -> - (Type == bool -> - not_expr(A,B) - ; bvnot_expr(1,as(A,Type),B)) - ; true)), - unfold_int_expr(EB,ND,CB,Type,B), + ; unfold_int_expr(EB,ND,CB,Type,B), !, (R == 1 -> blocked_unify(A=B) @@ -2052,18 +2161,7 @@ unfold_int_expr(EA #\= EB,D,Cstr,Type0,R) ?- !, unfold_int_expr(alldiff(Type,[as(A,Type),EB]),D,CDiff,bool,R), make_conj(CA,CDiff,Cstr) - ; (R == 0 -> - A = B - ; ((R == 1, - number(A), - (Type == bool; - Type == uint(1))) - -> - (Type == bool -> - not_expr(A,B) - ; bvnot_expr(1,as(A,Type),B)) - ; true)), - unfold_int_expr(EB,ND,CB,Type,B), + ; unfold_int_expr(EB,ND,CB,Type,B), !, (R == 0 -> blocked_unify(A=B) @@ -3012,7 +3110,7 @@ unfold_int_expr(isInfinite(ERF),D,Cstr,Type,R) ?- make_conj(C,isInfinite(RType,RF,R),Cstr)). unfold_int_expr(isZero(ERF),D,Cstr,Type,R) ?- - ND is D - 1, + ND is D + 1, Type = bool, (R == 1 -> ensure_not_NaN(RF) @@ -3229,7 +3327,7 @@ unfold_int_expr(uninterp(Term),D,Cstr,Type,R) ?- !, fromto(true,IC,OC,ACstrs), param(D) do functor(TypeArg,T,_), - (occurs(T,(bool,int,uint,sort,rnd)) -> + (occurs(T,(bool,int,uint,sort,rnd,array)) -> unfold_int_expr(Arg,D,AC,TypeArg,AR), SetType = int_vars(TypeArg,AR) ; unfold_real_expr(Arg,D,AC,TypeArg,AR), @@ -3294,8 +3392,10 @@ get_reif_var_depth_from_labchoice(D) :- D = 0 ; D is 2^32). +/* bvnot_expr(Size,bvnot(Size,EA),E) ?- !, E = EA. +*/ bvnot_expr(Size,bvand(Size,EA,EB),E) ?- !, E = bvor(Size,bvnot(Size,EA),bvnot(Size,EB)). bvnot_expr(Size,bvor(Size,EA,EB),E) ?- !, @@ -3306,9 +3406,9 @@ bvnot_expr(1,as(1,_),R) ?- !, blocked_unify(R,0). not_expr(0,B) ?- !, - blocked_unify(B = 1). + blocked_unify(B,1). not_expr(1,B) ?- !, - blocked_unify(B = 0). + blocked_unify(B,0). not_expr(neg(A),NA) ?- !, NA = A. not_expr(A => B,E) ?- @@ -3367,11 +3467,12 @@ not_expr(bvsge(A,B),E) ?- !, not_expr(bvsgt(A,B),E) ?- !, E = bvsle(A,B). not_expr(alldiff(Type,[A,B]),E) ?- - (Type == int -> - E = (as(A,Type) #= as(B,Type)) - ; atomic(Type), - occurs(Type,(real,real_int)), - E = (as(A,Type) $= as(B,Type))), + nonvar(Type), + !, + functor(Type,FType,_), + (real_type(FType,_) -> + E = (as(A,Type) $= as(B,Type)) + ; E = (as(A,Type) #= as(B,Type))), !. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -3944,17 +4045,18 @@ smtlib_select(array(TypeI,TypeE),A,I,E) :- smtlib_select(A,A,Sure,I,E,TypeI,TypeE). smtlib_select(A,Start,Sure,I,E,TypeI,TypeE) :- - get_priority(P), + get_priority(P0), + %pour scheduling v7 (mise à 2 au réveil) + P = 4, + max(P0,P,NP), set_priority(1), get_array_start(Start,NStart), (var(NStart) -> save_cstr_suspensions(NStart) ; true), - (smtlib_select_bis(A,Sure,I,E,TypeI,TypeE) -> - true - ; smtlib_select_bis(A,Sure,I,E,TypeI,TypeE)), - set_priority(P), - wake_if_other_scheduled(P). + smtlib_select_bis(A,Sure,I,E,TypeI,TypeE), + set_priority(NP), + wake_if_other_scheduled(NP). smtlib_select_bis(A,Sure,I,E,TypeI,TypeE) :- ((nonvar(I), @@ -4373,7 +4475,10 @@ eq_array0(Type,A,B) :- wake_if_other_scheduled(P). eq_array(Type,Diff,A,B,Seen,SureA,SureB) :- - get_priority(P), + get_priority(P0), + %pour la v7 (2 au réveil) + P = 5, + max(P0,P,NP), set_priority(1), % on garde les over-write non egaux % et on etend les sure (index non unifiables) @@ -4391,7 +4496,7 @@ eq_array(Type,Diff,A,B,Seen,SureA,SureB) :- move_inst_seen(Seen,NSeen), eq_clean_array(Type,Diff,NA,NB,NSeen,NSureA,NSureB), set_priority(P), - wake_if_other_scheduled(P). + wake_if_other_scheduled(NP). eq_clean_array(Type,Diff,A,B,Seen,SureA,SureB) :- % Seen contient tout les index sures de A ou B @@ -4427,7 +4532,7 @@ eq_clean_array(Type,Diff,A,B,Seen,SureA,SureB) :- ; % DiffA et DiffB contiennent les select en attente % on doit attendre qu'ils disparaissent pour % unifier - call(spy_here)@eclipse, + % call(spy_here)@eclipse, (DiffA == [] -> (foreach((I,E),DiffB), param(Type,NA) do @@ -4763,11 +4868,26 @@ diff_array(Type,A,B) :- % Il existe un indice commun ou les elements sont non % unifiables check_diff_array(A,B) + ; Type = array(TI,TE), + (real_type(TI,_) -> + real_vars(TI,I) + ; % ok pour les "sort" aussi + int_vars(TI,I)), + (real_type(TE,_) -> + real_vars(TE,[EA,EB]) + ; % ok pour les "sort/array" aussi + int_vars(TE,[EA,EB])), + smtlib_select(Type,A,I,EA), + smtlib_select(Type,B,I,EB), + diff_reif(TE,_,EA,EB,1)), +/* +% ANCIENNE VERSION MOINS RAPIDE QUE LES "select" !!! ; hash_create(SureA), hash_create(SureB), clean_array(A,NA,(SureA,[]),NSureA), clean_array(B,NB,(SureB,[]),NSureB), diff_clean_array(Type,NA,NB,NSureA,NSureB)), +*/ set_priority(P), wake_if_other_scheduled(P). @@ -4779,7 +4899,9 @@ diff_array1(Type,const_array(TI,TE,Const),A,_,_) ?- !, diff_array1(Type,A,const_array(TI,TE,Const),_,_) ?- !, diff_array1(Type,const_array(TI,TE,Const),A,_,_). diff_array1(Type,A0,B0,SureA,SureB) :- - get_priority(P), + get_priority(P0), + % pour la v7 + P is max(P0,5), set_priority(1), clean_array(A0,A,SureA,NSureA), clean_array(B0,B,SureB,NSureB), @@ -4814,8 +4936,8 @@ diff_clean_array(Type,A0,B0,SureA,SureB) :- ; % on est bloque sur les elements des index communs LEAB = [_,EA,EB|_], ite_diff_array(Type,EA,EB,NA,NB,SureA,SureB)) - ; ((var(NA),V=NA,T=NB,Sure = SureB; - var(NB),V=NB,T=NA,Sure = SureA) + ; ((var(NA),T=NB,Sure = SureB; + var(NB),T=NA,Sure = SureA) -> % Si un index de T n'est pas sure, il est bloquant % ainsi que les index sures unifiables @@ -6154,6 +6276,9 @@ real_vars(Type,T) :- ; true) ; launch_float_number(X))). +set_real_type(real_int,V) ?- !, + set_lazy_domain(real,V), + launch_float_int_number(V). set_real_type(Type,V) :- set_lazy_domain(Type,V). @@ -6422,7 +6547,10 @@ unfold_real_expr(ceiling(EA),D,Cstr,Type,R) :- make_conj(CACond,fp_ceiling(BCond,RType,A,R),Cstr)). % Conversions depuis int -unfold_real_expr(real_from_int(EA),D,Cstr,real,R) :- +unfold_real_expr(real_from_int(EA),D,Cstr,Type,R) :- + (var(Type) -> + Type = real + ; real_type(Type,_)), ND is D + 1, unfold_int_expr(EA,ND,CA,int,A), !, @@ -7361,7 +7489,7 @@ unfold_real_expr(uninterp(Term),D,Cstr,Type,R) ?- !, fromto(true,IC,OC,ACstrs), param(D) do functor(TypeArg,T,_), - (occurs(T,(bool,int,uint,sort,rnd)) -> + (occurs(T,(bool,int,uint,sort,rnd,array)) -> unfold_int_expr(Arg,D,AC,TypeArg,AR), SetType = int_vars(TypeArg,AR) ; unfold_real_expr(Arg,D,AC,TypeArg,AR), @@ -9975,14 +10103,21 @@ same_sign_div_mod(A,B) :- %% Pas vraiment un undef pour B = 0 et bvudiv/bvurem -%% Nouvell semantique: Q tout a 1 et R a 0 +%% Nouvelle semantique: Q tout a 1 et R a 0 chk_undef_div_rem(Bool,Type,A,B,Q,R,UO) :- % // et rem pour int,intN et uintN check_overflow(UO), - (nonvar(Bool) -> - (Bool == 0 -> + ((nonvar(Bool); + nonvar(B)) + -> + ((Bool == 0; + B \== 0) + -> + protected_unify(Bool,0), div_mod(Type,A,B,Q,R,UO) - ; protected_unify(B,0), + ; % Bool == 1 et/ou B == 0 + protected_unify(Bool,1), + protected_unify(B,0), set_int_type(Type,A), set_int_type(Type,Q), set_int_type(Type,R), @@ -10005,39 +10140,14 @@ chk_undef_div_rem(Bool,Type,A,B,Q,R,UO) :- undef_div_rem(int,A,Q,R,UO) :- !, uninterp_trigger(div_rem_int,[int],int,Trigger), uninterp(div_rem_int,Trigger,[A],(Q,R)). -/* -undef_div_rem(int,A,Q,R,UO) :- !, - get_priority(Prio), - set_priority(1), - (ground(A) -> - (check_seen_expr(undef_div_rem(A),(QQ,RR,UUO),Type) -> - protected_unify(Q,QQ), - protected_unify(R,RR), - protected_unify(UO,UUO) - ; add_seen_expr(undef_div_rem(A),(Q,R,UO),Type)) - ; save_cstr_suspensions(A), - get_saved_cstr_suspensions(LSusp), - ((member((Susp,undef_div_rem(Type,AA,QQ,RR,UUO)),LSusp), - AA == A) - -> - protected_unify(Q,QQ), - protected_unify(R,RR), - protected_unify(UO,UUO) - ; my_suspend(undef_div_rem(Type,A,Q,R,UO),0, - A->suspend:constrained))), - set_priority(Prio), - wake_if_other_scheduled(Prio). -*/ undef_div_rem(Type,A,Q,R,UO) :- - % int(N) et uint(N) + % uint(N) + % Q = 0 arg(1,Type,N), All1 is 2^N-1, - protected_unify(R,A), - protected_unify(UO,0), - (Type = uint(N) -> - protected_unify(Q,All1) - ; Type = int(N), - uintN_to_intN(N,All1,Q,_)). + %protected_unify(UO,0), + protected_unify(Q,All1), + protected_unify(R,A). diff --git a/Src/COLIBRI/util.pl b/Src/COLIBRI/util.pl index ae356bdcb012d2d69b31806baee24c1da12c72c9..b64f05c540b788f202114476694b39c67a1a7271 100755 --- a/Src/COLIBRI/util.pl +++ b/Src/COLIBRI/util.pl @@ -246,6 +246,16 @@ protected_unify(X,Y) :- protected_unify(X = Y) ?- protected_unify(X,Y). +:- export protected_occurs_in_list/2. +protected_occurs_in_list(X,L) :- + (var(X);atomic(X)), + nonvar(L), + L = [_|_], + once (number(X) -> + member(XX,L), + XX == X + ; occurs(X,L)). + %%:- mode unify_vars(+). unify_vars([A|L]) :- unify_vars(A,L).