2011-11-11 3 views
5

可能性の重複:
Prolog delete: doesn't delete all elements that unify with ElementPrologで統一することなく、リストのすべてのメンバーを削除する

Prologで

あなたがこれを書いた場合:

delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L). 

結果は次のようになります。

L = [ (1, 2), (3, 4)]. 

_変数が最初の要素の1とバインドし、(1,1)の要素をさらに検索して削除するため、通常の動作と同じです。

フォーム(1、_)のすべてのメンバーの削除と削除を防ぐ方法がありますか。 その場合、結果は次のようになります。 L = [(3,4)]。

答えて

3
delete_pattern([], _, []). 
delete_pattern([H|T], P, O) :- 
    ( H \= P 
    -> O = [H|O1], 
     delete_pattern(T, P, O1) 
    ; delete_pattern(T, P, O)). 

あなたは==/2または[email protected]=/2など若干異なる意味論につながるフィルタリングのために他の述語を使用したいことがあります。

+0

原則的に動作しますが、リスト項目が不十分時間 'delete_pattern/3'が実行される時にインスタンス化されている場合は休憩:ここで説明する以前のバージョンでは推論がはるかに困難になり、実際のインスタンス化に依存することに注意してください。 – repeat

3

ここに別のバージョンがあります。実際には、純粋な1:クエリでそれをしよう

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). 

はあなたの問題文で曖昧さの実際の情報源を明らかに:、1、2:

?- 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に依存しますまたは、他の何か。

?- delete([a],X, Xs), X = c. 
false. 

?- X = c, delete([a],X, Xs). 
X = c, 
Xs = [a]. 
+1

@repeat:あなたのソリューションをここに入れる(http://stackoverflow.com/questions/8100586/prolog-delete-doesnt-delete-all-elements-that-unify-with-element#)。 – false

関連する問題