最大化SWI-Prolog中变量值之间的距离(clpfd)

时间:2014-04-21 19:54:44

标签: prolog swi-prolog constraint-programming clpfd

我想最大化两个变量之间的差异:

:- 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 个答案:

答案 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),但这并不会将最大值限制为最大可能值!它只是XY的最大值。