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

Tan*_*nay 2 prolog constraint-programming swi-prolog 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.
Run Code Online (Sandbox Code Playgroud)

fal*_*lse 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] ...
Run Code Online (Sandbox Code Playgroud)

所以它从最大的距离开始,然后逐个降低.

起初,这种行为可能会让您感到惊讶,但请回想一下手册中的内容

标签始终完整,始终终止,并且不会产生冗余解决方案.

这是一个非常有力的保证!

如果您现在只想要第一个解决方案,请once/1四处走动,labeling/2但请记住,您随后离开了纯粹的单调程序领域.


脚注1:可以表示最多两个变量,max(X,Y)但这并不会将最大值限制为最大可能值!这将是唯一的largst价值XY.