これを書く場合、Prologで:
delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L).
結果は次のようになります。
L = [ (1, 2), (3, 4)].
_ 変数は最初の要素で 1 にバインドされ、(1,1) のさらに要素を検索して削除するため、正常です。
この統合が行われ、フォーム (1,_) のすべてのメンバーが削除されないようにする方法はありますか。その場合、結果は次のようになります: L = [ (3, 4)]。
これを書く場合、Prologで:
delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L).
結果は次のようになります。
L = [ (1, 2), (3, 4)].
_ 変数は最初の要素で 1 にバインドされ、(1,1) のさらに要素を検索して削除するため、正常です。
この統合が行われ、フォーム (1,_) のすべてのメンバーが削除されないようにする方法はありますか。その場合、結果は次のようになります: L = [ (3, 4)]。
delete_pattern([], _, []).
delete_pattern([H|T], P, O) :-
( H \= P
-> O = [H|O1],
delete_pattern(T, P, O1)
; delete_pattern(T, P, O) ).
==/2
またはのようにわずかに異なるセマンティクスになるフィルタリング用の他の述語を使用することもできます=@=/2
。
ここに別のバージョンがあります。実際、純粋なもの:
list_el_deleted([], _, []).
list_el_deleted([X|Xs], X, Ys) :-
list_el_deleted(Xs, X, Ys).
list_el_deleted([X|Xs], E, [X|Ys]) :-
dif(X,E),
list_el_deleted(Xs, E, Ys).
クエリで試してみると、問題のステートメントのあいまいさの実際の原因が明らかになります。
?- list_el_deleted([(1,1),(1,2),(1,1),(3,4)],(1,X),L).
X = 1,
L = [ (1, 2), (3, 4)] ;
X = 2,
L = [ (1, 1), (1, 1), (3, 4)] ;
L = [ (1, 1), (1, 2), (1, 1), (3, 4)],
dif(X, 1),
dif(X, 2),
dif(X, 1).
したがって、すべてはX
実際の内容 (1、2、またはその他) に依存します。ここで説明する以前のバージョンは、実際のインスタンス化に依存しているため、推論がはるかに困難になることに注意してください。
?- delete([a],X, Xs), X = c.
false.
?- X = c, delete([a],X, Xs).
X = c,
Xs = [a].