Максимальное расстояние между значениями переменных в 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.

person dev    schedule 21.04.2014    source источник


Ответы (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] ...

Таким образом, он начинается с самого большого расстояния, а затем уменьшается одно за другим.

Сначала такое поведение может вас удивить, но вспомните то, что указано в руководстве

Маркировка всегда завершена, всегда завершается и не приводит к дублированию решений.

Это очень сильная гарантия!

Если теперь вам нужно только первое решение, оберните once/1 вокруг labeling/2, но имейте в виду, что тогда вы вышли из области чистых, монотонных программ.


Сноска 1: можно выразить максимум двух переменных max(X,Y), но это не ограничивает максимальное значение максимально возможным значением! Это будет только самое большое значение X и Y.

person false    schedule 21.04.2014
comment
@TanaySoni: Обратите внимание на упрощение, позволяющее избежать этой временной переменной D - person false; 22.04.2014