Наиболее общее ограничение высшего порядка, описывающее последовательность целых чисел, упорядоченных по отношению
В CLP (FD) нам часто нужно указывать: «Это список целых чисел и переменных конечной области в (иногда:строго) в порядке возрастания / убывания. "
Существует ли какая-либо система CLP (FD), которая обеспечивает общее (параметризуемое) встроенное ограничение для этой задачи?
SWI-Prolog предоставляет ограничение, называемоеchain/2
, который похож на то, что я ищу. Однако имя является слишком конкретным, чтобы охватить все отношения, которые может описать ограничение (пример:#<
не частичный порядок, но допустимый вchain/2
, приводя к последовательности - взятой как набор целых чисел - больше не считается цепочкой, как это определено в математической теории порядка). Следовательно, имя не полностью описывает то, что фактически реализует ограничение.
Пожалуйста, дайтесамый общий определение относительно обычных двоичных ограничений CLP (FD) - или подходящего подмножества, которое содержит по крайней мере#<
, #>
, #=<
а также#>=
— в том числе собственное имя в соответствии с алгебраической структурой, определяемой ограничением. Условие состоит в том, что ограничение описываетфактический математическая структура, которая имеет собственное имя в литературе.
Для начала рассмотрим SICStus Prolog или SWI:
:- use_module(library(clpfd)).
connex(Relation_2, List) :-
connex_relation(Relation_2),
connex_(List, Relation_2).
connex_relation(#=).
connex_relation(#<).
connex_relation(#=<).
connex_relation(#>).
connex_relation(#>=).
connex_([], _).
connex_([L|Ls], Relation_2) :-
foldl(adjacent(Relation_2), Ls, L, _).
adjacent(Relation_2, X, Prev, X) :- call(Relation_2, Prev, X).
Примеры случаев:
?- connex(#<, [A,B,C]).
A#=<B+-1,
B#=<C+-1.
?- connex(#=, [A,B,C]).
A = B, B = C,
C in inf..sup.
?- maplist(connex(#<), [[A,B],[C,D]]).
A#=<B+-1,
C#=<D+-1.
Обратите внимание, что было бы даже допустимо разрешить#\=
потому что отношение будетеще опишите связь, известную в математической теории порядка. Следовательно, приведенный выше код не является наиболее общим в отношении обычных двоичных ограничений CLP (FD).