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)).
答案 0 :(得分:0)
N1 is N-1
表示N
必须是数字。但是您在未实例化的count([3,4,5,6],C)
处于该位置的情况下致电C
。
它变为N
,然后is
失败,因为它仍未被实例化。
您为什么还要减去?要对出现的事件进行计数,应在检测到此类事件时将1加到递归找到的计数上,而不要减去。
或者完全忘记is
,切换到约束,然后使用#=
。有关更多信息,请参见clpfd。