0
count([], 0).

count([H,H1|T], N) :- (H == H1,
                  count([H1|T], N));

                  (N1 is N-1,
                  count([H1|T], N1)).   

我的直觉是,第一个“if”只是移动到“下一个头”,如果相邻元素相同,N 不会递减,但是如果它们不同,第二个会递减。然后,当列表清空时,它是真的。

也许我稍微误解了 Prolog 中的回溯,但这不应该产生正确的答案吗?

例如,我收到此错误:

?- count([3,4,5,6],C).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:    [8] count([3,4|...],_972)
ERROR:    [7] <user>
4

1 回答 1

0

N1 is N-1意味着N必须是一个数字。但是你在那个位置count([3,4,5,6],C)用非实例化的调用。C

它变成N然后is失败,因为它还没有被实例化。

你为什么要减去呢?要计算出现次数,您应该在检测到此类事件时将递归找到的计数加 1,而不是减去。

或者完全忘记is,切换到约束,然后使用#=. 有关更多信息,请参见

于 2019-03-03T20:24:29.170 回答