4

プロローグのリストから値を削除するのに問題があります。色のリストがあり、それに色のリストを追加し、重複していないすべての値を保持して残りを削除したいと考えています。

[green, red, blue, purple, yellow, brown, orange, black, purple]

紫がこのリストに 2 回表示されているので、両方とも削除したいと思います。これは私が返したいリストです。

[green, red, blue, yellow, brown, orange, black]

私は現在、すべての重複を削除するためにこれを持っていますが、両方の紫を出すことはできません.

mymember(X,[H|_]) :- X==H,!.
mymember(X,[_|T]) :- mymember(X,T).

not(A) :- \+ call(A).

set([],[]).
set([Head|Tail],[Head|Out]) :-
    not(mymember(Head,Tail)),
    set(Tail, Out).
set([Head|Tail],Out) :-
    mymember(Head,Tail),
    set(Tail, Out).

これは私が今得た結果です:

[green, red, blue, yellow, brown, orange, black, purple]
4

5 に答える 5

3

との併用tfilter/3でピュアにlist_uniqmember_t/3

list_uniqs(Es, Us) :-
   tfilter(list_uniqmember_t(Es), Es, Us).

OP によって指定されたサンプル クエリには、期待される結果があります。

?- list_uniqs([green,red,blue,purple,yellow,brown,orange,black,purple], Xs).
Xs = [green,red,blue,yellow,brown,orange,black]. % succeeds deterministically

より一般的なクエリに対しても、論理的に適切な回答が得られるでしょうか?

?- list_uniqs([A,B,A], [])。
   A=B
; 間違い。

?- list_uniqs([A,B,A], [_])。
dif(A,B)。

?- list_uniqs([A,B,A], [_,_])。
間違い。

?- list_uniqs([A,B,A], Xs).
   Xs = [] 、A=B
; Xs = [B], dif(A,B)。

はい!もう少し一般的なものはどうでしょうか。

?- list_uniqs([A,B,C],Xs).
   Xs = [] 、A=B 、B=C
; Xs = [C] , A=B , dif(B,C)
; Xs = [B] , A=C , dif(B,C)
; Xs = [A] , dif(A,C), B=C
; Xs = [A、B、C]、dif(A、B)、dif(A、C)、dif(B、C)。

できます!

于 2015-10-22T19:23:33.227 に答える
3

簡単な方法...ワンライナー:

singletons(Xs,Zs) :-
  findall( X , ( append(P,[X|S],Xs), \+member(X,P), \+member(X,S) ) , Zs )
  .
于 2015-10-22T18:17:38.840 に答える
0

私はこれを行うことでそれを修正しました:

my_delete(Res, [], Res).
my_delete(Colorslist, [Head|Tail], R) :-  
    my_delete_worker(Colorslist, Head, Result), 
    my_delete(Result, Tail, R).

my_delete_worker([], _, []).
my_delete_worker([X|T], X, R) :-
    my_delete_worker(T, X, R).
my_delete_worker([H|T], X, [H|R]) :-
    X \= H,
    my_delete_worker(T, X, R).

最初の色の結果を 2 番目の色のカラーリストに入れるのを忘れていました。ベースケースに到達したら、カラーリストを結果と統合します。助けてくれてありがとう!

于 2015-10-21T17:42:09.583 に答える