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) 制約に関して最も一般的ではありません。