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

标签 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。为了允许这样的构造,某种形式的量化是必要的。和/或会出现单调性问题。

但是,有一些相关的事情:您可能希望生成值,以便首先生成最大值:

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

关于prolog - SWI-Prolog(clpfd) 中变量值之间的距离最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204899/

相关文章:

prolog - 如果 Element 和 Element1 不同,为什么我不需要检查 member_of_set?

numbers - Prolog 中的数字和

prolog - Prolog 中是否可以接受具有可变数量的谓词?

prolog - 内置 Prolog 谓词的性能 (is)/2

Prolog:将列表的元素限制在一个范围内

prolog - "Who is the barber"Prolog 中的逻辑谜题

unit-testing - 声明仅在 SWI-Prolog 中的单个单元测试范围内正确的事实

php - prolog 与 php 和 mysql 的接口(interface)

optimization - 为什么从可行解决方案开始的 ORTOOLS 引导局部搜索被视为约束规划?

Java Choco CSP 使用变量总和进行优化