clpz icon indicating copy to clipboard operation
clpz copied to clipboard

Bug CLP(B) and CLP(FD) dont work together

Open ghost opened this issue 3 years ago • 2 comments

I am not assuming that CLP(B) from SWI-Prolog uses branch and bound for weighted_maximum/2. But theoreticall CLP(B) branch and bound should work for any constraints, given as freeze/2, when/2, CLP(FD) etc..

I tried this theoretical claim. In my system I get:

/* Jekejeke Prolog 1.5.0 */
?- List = [Alice, Bob, Carla, David], weighted_maximum([5,-3,7,-9], List, Max).
List = [1, 0, 1, 0],
Max = 12 ;
No

?- List = [Alice, Bob, Carla, David], Alice*5-Bob*3+Carla*7-David*9 #<10, 
   weighted_maximum([5,-3,7,-9], List, Max).
List = [1, 1, 1, 0],
Max = 9 ;
No

But in SWI-Prolog I get:

/* SWI-Prolog 8.3.20 */
?- List = [Alice, Bob, Carla, David], weighted_maximum([5,-3,7,-9], List, Max).
List = [1, 0, 1, 0],
Max = 12.

?- List = [Alice, Bob, Carla, David], Alice*5-Bob*3+Carla*7-David*9 #<10, 
   weighted_maximum([5,-3,7,-9], List, Max).
false.

Is this unavoidable in SWI-Prolog? Does CLP(Z) fare better?

ghost avatar Mar 04 '21 19:03 ghost

In Scryer Prolog, I currently also get:

?- List = [Alice, Bob, Carla, David], Alice*5-Bob*3+Carla*7-David*9 #
false.

Definitely a wrong result.

triska avatar Mar 04 '21 20:03 triska

The problem carries over to sat_count/2:

/* SWI-Prolog 8.3.20 */
?- List = [Alice, Bob, Carla, David], Alice*5-Bob*3+Carla*7-David*9 #<10, sat_count(+[1|List], Count).
List = [Alice, Bob, Carla, David],
Count = 16,
5*Alice+7*Carla#=<3*Bob+9*David+9.

?- List = [Alice, Bob, Carla, David], Alice*5-Bob*3+Carla*7-David*9 #<10, aggregate_all(count, labeling(List), Count).
List = [Alice, Bob, Carla, David],
Count = 15,
5*Alice+7*Carla#=<3*Bob+9*David+9.

Seems ok on my side:

/* Jekejeke Prolog 1.5.0 */
?- List = [Alice, Bob, Carla, David], Alice*5-Bob*3+Carla*7-David*9 #<10, sat_count(+[1|List], Count).
List = [Alice, Bob, Carla, David],
Count = 15,
9*David #> 5*Alice-3*Bob+7*Carla-10

ghost avatar Mar 05 '21 00:03 ghost