私はPrologが初めてで、理解しようとしています。
私はいくつかの簡単なプログラムから始めました。これは次のようにする必要があります。
- 要素がリストの残りの部分に含まれているかどうかを確認します
- FALSE の場合は何もしない
- TRUE の場合、2 番目のリストに追加します。(2 番目のリストには char を 1 回だけ追加する必要があります)。
期待される結果の例:
?- occ([a,b,c,a,a,b,e,f,g], Y).
Y = [a,b].
?- occ([a,a,a,a,a], Y).
Y = [a].
?- occ([a,b,c,d,e,f,g], Y).
Y = [].
これが私が書いたコードですが、いくつか問題があります (常に を返しますtrue
)。
occ([],[]).
occ([],_Y).
occ([X|Xs],[X|Y]) :-
occ(Xs,Y),
member(X,Xs),
not(member(X,Y)),
!.
occ([_X|_Xs],_Y).
デバッガーを使用してみましたが、not(member(X,Y))
is alwaysfalse
であり、バインディング セクションにはX
and Xs
and neverしかないことがわかりましたY
。どんなアドバイスでも大歓迎です!ありがとうございました。
アップデート
私はそれを解決したと思います、これがコードです:
occ([],[]).
occ([X|Xs],[X|Y]) :-
occ(Xs,Y),
member(X,Xs),
not(member(X,Y)),
!.
occ([_X|_Xs],[]).
しかし、なぜ今それが機能するのかよくわかりません... 3番目にwithocc
を変更しました..しかし、なぜ結果が変わるのですか?_Y
[]