【问题标题】:Maximize distance between variables' value in SWI-Prolog(clpfd)最大化 SWI-Prolog(clpfd) 中变量值之间的距离
【发布时间】:2014-04-21 19:54:44
【问题描述】:

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

:- 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.

【问题讨论】:

    标签: prolog swi-prolog constraint-programming clpfd


    【解决方案1】:

    没有限制来表达最大差异。也没有任何约束来表达最大值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 的最大值。

    【讨论】:

    • @TanaySoni:请注意避免这个临时变量D
    猜你喜欢
    • 2016-01-16
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2014-01-31
    • 2012-03-10
    • 2019-01-26
    相关资源
    最近更新 更多