我试图在Prolog中修改一个接受项目,列表和数字的谓词,并检查项目是否在列表中的次数。例如
count(7,[3,7],X).
会返回X=1
。
count(7,[3,7],1).
会返回true
这是我到目前为止所拥有的
count_occur(A,[0|B],D).
count_occur(A,[A|C],D) :- count_occur(A,C,D1), D is D1+1.
count_occur(A,[B|C],D) :- count_occur(A,C,D).
我是Prolog的新手,并且很难理解这种编程范式。
我要做的是查看列表中的第一项是否与传入的值(A)匹配,如果它确实递增D并再次检查列表的其余部分。这就是我用lisp或其他语言做的方式。可以真正使用一些帮助,已经有一段时间了,它只是没有点击给我。
答案 0 :(得分:1)
我现在没有测试它,但我会这样尝试:
count_occur(A, [], 0).
count_occur(A, [A|T], D):- count_occur(A, T, D1), D is D1 + 1.
count_occur(A, [B|T], D):- A \= B, count_occur(A, T, D).
这个想法是,如果列表为空,则每个元素都会出现0次。其余几乎与你的相同,因为我认为它是正确的。
唯一的区别是我添加了A \= B
,这应该是A \neq B
。我认为否则会接受A == B
,这可能导致count_occur(3, [3], 0).
成立。你应该检查一下。
我希望这有帮助!