В CLP (FD) нам часто нужно указать: "Это список целых чисел и конечных доменных переменных в (иногда: строго) порядке возрастания/убывания".
Существует ли какая-либо CLP (FD) система, которая предоставляет общее (параметризуемое) встроенное ограничение для этой задачи?
SWI-Prolog предоставляет ограничение под названием chain/2
, которое похоже на то, что я ищу. Однако имя немного слишком специфично, чтобы охватить все отношения, которые может описывать ограничение (например: #<
не является частичным порядком, но допустимым в chain/2
, что приводит к последовательности — взято как набор целых чисел — no более длинный подсчет как цепочка, определенная в математической теории порядка). Следовательно, имя не полностью описывает то, что на самом деле реализует ограничение.
Пожалуйста, дайте самое общее определение относительно обычных двоичных ограничений 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).