我想最大化两个变量之间的差异:
:- 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.
最佳答案
没有限制来表达最大差异。也没有任何限制来表达最大值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
Labeling is always complete, always terminates, and yields no redundant solutions.
这是一个非常有力的保证!
如果您现在只想要第一个解决方案,请将 once/1
包裹在 labeling/2
周围,但请记住,您随后离开了纯粹、单调程序的领域.
脚注 1:可以表达两个变量的最大值 max(X,Y)
但这并不将最大值限制为最大可能值!它只是 X
和 Y
中的最大值。
关于prolog - SWI-Prolog(clpfd) 中变量值之间的距离最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204899/