21

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

4

3 に答える 3

9

Hoogle はあまり役に立ちませんでしたが、Hayoo は役に立ちました。

foldcmpl

したがって、これはリストの特別な形式の折り畳みですが、回数には適用されずlength list、1 回少ない回数に適用されます。

isSortedBy

その名前では完全に一般的ではありませんが、その署名です。おそらく、最も一般的な名前を主張することはあまり役に立ちません。そうでなければ、エンティティがいたるところにあるだけですか?

定義は次のとおりです。

isSortedBy 関数は、述語がリスト内のすべての隣接する要素のペアに対して true を返す場合に True を返します。

たぶん: all_adjacent_pairs(R_2, Xs). adjacent_pairこれは、何らかの修飾子を持つループ構造を持った後に少し聞こえます。

于 2014-11-25T15:01:23.620 に答える