我想最大化两个变量之间的差异:
:- use_module(library(clpfd)).
maximize(X) :-
X = [A,B],
X ins 1..5,
% I want to write a constraint to have maximum difference between A and B.
答案 0 :(得分:6)
没有约束来表达最大差异。也没有任何约束来表达最大 1 。为了允许这样的构造,将需要某种形式的量化。和/或单调性问题会出现。
但是,有一些相关的内容:您可能希望生成值,以便首先生成最大值:
:- use_module(library(clpfd)).
maximize(Xs) :-
Xs = [A,B],
Xs ins 1..5,
labeling([max(abs(A-B))],Xs).
?- maximize(Xs).
Xs = [1, 5] ;
Xs = [5, 1] ;
Xs = [1, 4] ;
Xs = [2, 5] ;
Xs = [4, 1] ...
所以它从最大的距离开始,然后逐个降低它。
首先,这种行为可能让您感到惊讶,但请回忆what the manual states
标签始终完整,始终终止,并且不会产生冗余解决方案。
这是一个非常有力的保证!
如果您现在只想要第一个解决方案,请在once/1
周围包裹labeling/2
,但请记住,您随后离开了纯粹的单调程序领域。
脚注1:可以表示最多两个变量max(X,Y)
,但这并不会将最大值限制为最大可能值!它只是X
和Y
的最大值。