0

Prolog で問題が発生しました。これが私が使用するコードの一部です。

has_same_elements([X|_],Y) :-
    permutation(X,Xnew),        
    member(Xnew,Y), !.
has_same_elements([_|Tail],Y) :-
    has_same_elements(Tail,Y).

これは、リストの 2 つのリストを入力として取得し、同じ要素を持つリストが含まれているかどうかを判断します。たとえば[[1,2],[3,4]]、 と同じ要素があり[[2,1],[4,3]]ます。これはうまくいきます。

今私のfindall:

findall(V, (verdeling2(S,Perm,V), \+X^(X\=V,verdeling2(S,Perm,X),has_same_elements(X,V))) ,Verd).

知っておくべき重要なことは、verdeling2/3 は (前述のように) リストの異なるリストを返す節であり、[1,2,3,4,...] の順列から構築されるということです。 verdeling2 のいくつかの異なる出力/3 (入力としての順列による) は次のとおりです。

V = [[[1, 2], [3, 4]]] ;
V = [[[2, 1], [3, 4]]] ;
V = [[[2, 3], [1, 4]]] ;
V = [[[2, 3], [4, 1]]] ;
V = [[[1, 3], [2, 4]]] ;
V = [[[3, 1], [2, 4]]] ;
V = [[[3, 2], [1, 4]]] ;
V = [[[3, 2], [4, 1]]] ;
V = [[[1, 3], [4, 2]]] ;
V = [[[3, 1], [4, 2]]] ;
V = [[[3, 4], [1, 2]]] ;
V = [[[3, 4], [2, 1]]] ;
V = [[[1, 2], [4, 3]]] ;
V = [[[2, 1], [4, 3]]] ;
V = [[[2, 4], [1, 3]]] ;
V = [[[2, 4], [3, 1]]] ;
V = [[[1, 4], [2, 3]]] ;
V = [[[4, 1], [2, 3]]] ;
V = [[[4, 2], [1, 3]]] ;
V = [[[4, 2], [3, 1]]] ;
V = [[[1, 4], [3, 2]]] ;
V = [[[4, 1], [3, 2]]] ;
V = [[[4, 3], [1, 2]]] ;
V = [[[4, 3], [2, 1]]] ;

ここで、同じ要素を含まないすべてのリストの概要を表示できるものが必要です (has_same_elements を使用)。findall を使用すればうまくいくはずだと思いましたが、不要なパケットをフィルタリングするのではなく、完全なパケットを返します。

4

1 に答える 1

2

制約ロジック プログラミング言語などを使用しているとA\=Bは限りません\+ A=B

X\=Vその背後にある目標が実行されないように常に失敗し、否定\+は常に真であると思います。

X はコンテキスト内の新しい変数であるためX\=V、常に成功するため、常に失敗します。X=V

おそらく、いくつかの並べ替えが役立つでしょう。

よろしくお願いします

于 2010-11-09T18:00:06.233 に答える