我是 Prolog 的新手,我正在努力理解它。
我从一些简单的程序开始,这个程序应该:
- 检查一个元素是否包含在列表的其余部分中
- 如果 FALSE 什么都不做
- 如果 TRUE 将其添加到第二个列表。(只有一次出现的 char 应该添加到第二个列表中)。
一些具有预期结果的示例:
?- 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
andXs
和 never Y
。非常感谢任何建议!谢谢你。
更新
我想我解决了,代码如下:
occ([],[]).
occ([X|Xs],[X|Y]) :-
occ(Xs,Y),
member(X,Xs),
not(member(X,Y)),
!.
occ([_X|_Xs],[]).
但我不太确定为什么它现在可以工作......在第 3 次occ
我改变了_Y
with []
.. 但为什么它会改变结果?