在Prolog中遇到谓词问题

时间:2014-05-16 22:08:11

标签: list prolog

我试图在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或其他语言做的方式。可以真正使用一些帮助,已经有一段时间了,它只是没有点击给我。

1 个答案:

答案 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).成立。你应该检查一下。

我希望这有帮助!