计算列表中忽略相邻重复项的元素数

时间:2019-03-03 20:13:47

标签: list prolog instantiation-error

merge

我的直觉是,如果相邻元素相同,则第一个“ if”仅移至“下一个头部”,并且N不会递减,但是如果它们不同则第二个会递减。然后,当列表为空时为true。

也许我对Prolog中的回溯略有误解,但这不应该得出正确的答案吗?

例如,我得到此错误:

count([], 0).

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

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

1 个答案:

答案 0 :(得分:0)

N1 is N-1表示N必须是数字。但是您在未实例化的count([3,4,5,6],C)处于该位置的情况下致电C

它变为N,然后is失败,因为它仍未被实例化。

您为什么还要减去?要对出现的事件进行计数,应在检测到此类事件时将1加到递归找到的计数上,而不要减去。

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