0

私はプロローグに不慣れです。

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

期待される出力:

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

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

1 に答える 1

1

手始めに、重複の削除とレベルの表示という2つのステップを分離することをお勧めします。

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

1レベルの3倍の定数が私を困惑させていることを認めなければなりません。どういうわけかもっと意味のあるものにすべきではないと確信していますか?

また、リスト要素の順序は重要ではないと想定しましたremove_dups。最後の要素を除いて、重複した要素のすべての出現箇所を削除します。最初のオカレンスを保持したい場合は、remove_dups変更する必要があります。

于 2012-05-01T19:47:27.700 に答える