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