プロローグ内のリストから重複するエントリを削除しようとしています。リスト[a、b、a、c、b、a]は[a、b、c]を返します。私は組み込みの関数を使うことはできません。私はここで検索し、このコードを見つけました。プロローグ:重複の削除
member(X,[X|_]) :- !.
member(X,[_|T]) :- member(X,T).
set([],[]).
set([H|T],[H|Out]) :- not(member(H,T)), set(T,Out).
set([H|T],Out) :- member(H,T), set(T,Out).
しかし、それは、[C、B、]ない私のリストを取得して返します[、bは、C]私は、要素とリストを取り、リストを返しますコードを削除してい
リスト内のその要素の出現が削除されます。だから私はそれを私の重複削除メソッドに組み込もうとしましたが、プロローグを理解できないのでうまく動作しません。論理的には、新しいリストの再帰呼び出しから頭のすべての出現を差し引いたリストを頭に入れたいと思う。これは、コードがsmlのように見えるでしょう。
fun remv(_,nil) = nil
| remv(a,x::xs) = if x=a then remv(a,xs) else x::remv(a,xs);
fun remvdub (nil) = nil
| remvdub(x::xs) = x::remvdub(remv(x,xs));
だから、これは私が何をしないのですプロローグに
remv(_,[],[]).
remv(X,[X|T],Ans) :- remv(X,T,Ans).
remv(X,[H|T],[H|K]) :- remv(X,T,K).
remvdub([],[]).
remvdub([H|T],[H|Ans]) :- remvdub(Ans1,Ans), remv(H,T,Ans1).
を試してみました何ですか?
ありがとうSQBはまさに私がやろうとしていたことの論理です。あなたのコードを見ても、私が間違いを犯した場所を見つけることができないようで、私に同じことを読んでいます。しかし、あなたの作品はうまくいっています。 – user3043403
ねえ、私はそれを考え出したと思います。 remvdub([H | T]、[H | Ans]):remvdub(Ans1、Ans)、remv(H、T、Ans1)。 remvdub([H | T]、[H | Ans]):remv(H、T、Ans1)、remvdub(Ans1、Ans)です。 – user3043403