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

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.