address #995: wrong results for popcount/1

Many thanks to @notoria and @flexoron for very useful test cases!
This commit is contained in:
Markus Triska
2021-06-21 21:19:37 +02:00
parent ee393c66dd
commit 3e7cd24814

View File

@@ -2959,6 +2959,12 @@ expr_conds(popcount(A0), Count) -->
expr_conds(A0, A),
[I is A, arithmetic:popcount(I, Count)].
no_popcount_t(Gs, T) :-
( member(arithmetic:popcount(_, _), Gs) ->
T = false
; T = true
).
clpz_expandable(_ in _).
clpz_expandable(_ #= _).
clpz_expandable(_ #>= _).
@@ -2998,14 +3004,16 @@ clpz_expansion(X0 #= Y0, Equal) :-
phrase(expr_conds(Y0, Y), CsY),
list_goal(CsX, CondX),
list_goal(CsY, CondY),
no_popcount_t(CsY, YT),
no_popcount_t(CsX, XT),
expansion_simpler(
( CondX ->
( var(Y) -> Y is X
( YT, var(Y) -> Y is X
; CondY -> X =:= Y
; T is X, clpz:clpz_equal(T, Y0)
)
; CondY ->
( var(X) -> X is Y
( XT, var(X) -> X is Y
; T is Y, clpz:clpz_equal(X0, T)
)
; clpz:clpz_equal(X0, Y0)