1

私がしたいのは、別のリストで指定されたリストの一部を削除することです。

?- deleteSome([1,4,3,3,2,2],[1,2,4],Z).
Z = [3,3,2].

私は最初に次のように定義しました。問題ありません。

deleteOne(X, [X|Z], Z).
deleteOne(X, [V|Z], [V|Y]) :-
    X \== V,
    deleteOne(X,Z,Y).

そうすると、以下は期待通りに動作しません。

deleteSome([], [], _).
deleteSome([X|Xs], Y, Zs) :- 
    deleteSome(Xs, Y, [X|Zs]).
deleteSome([X|Xs], Y, Zs) :- 
    member(X,Y),
    deleteOne(X,Y,Y),
    deleteSome(Xs, Y, Zs).          
4

2 に答える 2

2

強力なselect/3ビルトインを使用します

deleteSome(L, D, R) :-
  select(E, L, L1),
  select(E, D, D1),
  !, deleteSome(L1, D1, R).
deleteSome(L, _, L).

テスト:

?- deleteSome([1,4,3,3,2,2],[1,2,4],Z).
Z = [3, 3, 2].
于 2012-11-28T15:46:28.773 に答える
1

私は認めなければなりません、私はあなたのdeleteSomeコードをまったく理解していません。これが私がすることです(ここにはプロローグがないので、エラーが含まれている可能性があります):

deleteSome(X, [], X).
deleteSome(X, [Y|Ys], Z) :-
    deleteOne(Y, X, T),
    deleteSome(T, Ys, Z).

つまり、削除するものがない場合、変更はありません。それ以外の場合は、最初の削除対象を削除してから、残りの削除を削除した結果になります。

deleteOne(Original、ToDelete、Result)パラメーターがあり、 (ToDelete、Original、Result)パラメーターがあるように見えるという点で混乱がありますdeleteSome。一貫性を保つために、署名に互換性があるように書き直したいと思います。

deleteSome([], Y, Y).
deleteSome([X|Xs], Y, Z) :-
    deleteOne(X, Y, T),
    deleteSome(Xs, T, Z).
于 2012-11-28T15:36:16.553 に答える