2

特定のリストで (1 つではなく) 複数の要素を選択することで、prolog のselect/3を改善したいと考えています。たとえば、このリスト[1,2,3]でX = 1Y = 2を選択すると、結果は[3]になります。

これが私がこれまでに持っているものです:

select_pair(X,Y,[X|Xs],Xs) :- member(Y,Xs).
select_pair(X,Y,[H|T1],[H|T2]) :- select_pair(X,Y,T1,T2).

結果は次のとおりです。

?- select_pair(X,Y,[1,2,3],Zs).
X = 1,
Y = 2,
Zs = [2, 3] ;
X = 1,
Y = 3,
Zs = [2, 3] ;
X = 2,
Y = 3,
Zs = [1, 3] ;

ただし、正しい結果は Zs = [3]、[2]、[1] である必要があります。この 2 つの値をどうにかして交差させなければならないことはわかっています。したがって、交差メソッドは次のとおりです。

intersect([],M,[]).
intersect([X|L],M,[X|I]) :- member(X,M), intersect(L,M,I).
intersect([X|L],M,I) :- \+ member(X,M), intersect(L,M,I).

メンバーメソッドの代わりに交差メソッドを使用する必要があると思います。

誰か助けてくれませんか?

4

1 に答える 1

2

あなたはとても近いです!select/3の代わりに使用member/2:

select_pair(X, Y, [X|Xs], Result) :- select(Y, Xs, Result).
select_pair(X, Y, [H|T1], [H|T2]) :- select_pair(X,Y,T1,T2). % unmodified

?- select_pair(X, Y, [1,2,3], Z).
X = 1,
Y = 2,
Z = [3] ;
X = 1,
Y = 3,
Z = [2] ;
X = 2,
Y = 3,
Z = [1] ;
false.

比較のために、次のようにコーディングしたいと思います。

select_pair(X, Y, In, Out) :- 
  select(X, In, Mid), select(Y, Mid, Out).

ただし、これは実際には組み合わせではなく順列を生成しますが、これはあなたが望むものではないと推測します。

この問題で交差することができるとは思いません。直感的に、やりたいことは次のようなものです。

select_pair(X, Y, In, Out) :- intersection([X,Y], Out, In).

問題は、intersect/3上記または SWI ビルトインintersection/3がそのように生成しないことです。なぜそうしないのかは理にかなっています.2つのセットの内容を交差に基づいて知る方法はありません.そのデータは単に生き残っていないからです.

于 2013-04-10T05:41:53.790 に答える