2012-05-01 9 views
0

私はプロローグを初めて使用しています。PROLOGコードのエラー

PROLOGのコードでは、次のような出力が期待されます。私が間違っているところを教えてください。

コードは基本的に重複を削除し、必要な形式でo/pを生成します。

remove_dups([],_L2,_L2). 
remove_dups([A|B],L2,L3) :- 
    functor(A,Pr,Ar),(member(level(Pr,Ar,1) ,L2) -> remove_dups(B,L2,L2); append([level(Pr,Ar,1)],L2,L3),remove_dups(B,L3,L3)). 

予想される出力:レベルの重複の除去とプレゼンテーション:私は2つのステップを分離することが好ましいだろう手始めに

?- remove_dups([a,b,a],[],L). 

L = [level(a,0,1),level(b,0,1)]. 

答えて

1

remove_dups([],[]). 
    remove_dups([X|Xs],Ys) :- member(X,Xs), !, remove_dups(Xs,Ys). 
    remove_dups([X|Xs],[X|Ys]) :- remove_dups(Xs,Ys). 

    levels([],[]). 
    levels([X|Xs],[level(N,A,1)|Ys]):- functor(X,N,A), levels(Xs,Ys). 

    go(L,R):- remove_dups(L,RL), levels(RL,R). 

私は、レベルtripplesの定数1が私を困惑ことを認めざるを得ません。何かもっと意味があるべきではないと確信していますか?

リスト要素の順序は重要ではないとも考えました。remove_dupsは、最後のものを除いて複製された要素のすべての出現を削除します。最初の出現を維持したい場合は、remove_dupsを変更する必要があります。

+0

お返事ありがとうございます@アレキサンダー。レベルマッピングと層別化のために私のプログラムで1を使用します。注文を維持する必要はありません..もう一度ありがとう –

+0

あなたはようこそ! –