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)
表达最大差异没有约束.也没有任何约束来表达最大值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价值X和Y.