prolog:修复多个答案(使用剪切?)

v_a*_*tia 5 prolog

我正在计算列表中的实例数...

count(_,[],N,N).
count(Elem,[Elem|List],N,M) :- !, N1 is N+1, count(Elem,List,N1,M). 
count(Elem,[_|List],N,M) :- count(Elem,List,N,M). 
Run Code Online (Sandbox Code Playgroud)

所以,我在prolog中写了两个方法,第一个工作(上面),但我很想知道为什么第二个没有(或者更确切地说,会给我多个答案 - 只有第一个是正确的)为什么是这个?

非常感谢

count(Z,X,R) :- count2(Z,X,R,0).
count2(W,[H|T],L,A):- (W == H), Lnew is A+1, count2(W,T,L,Lnew).
count2(W,[H|T],L,A):- count2(W,T,L,A).
count2(W,[],A,A).
Run Code Online (Sandbox Code Playgroud)

Vin*_*nie 0

你的问题包括答案……剪辑。切割总是成功的,并且具有“切断”派生树的副作用。基本上你不能回溯通过切线。

如果目标与第二条规则一致,第一个示例将执行剪切。从某种意义上说,这种选择变得固定了。如果出现失败或回溯,则不会在剪切后回溯,从而消除多个答案。当答案相互排斥时,剪切很有用。也就是说,当你找到第一个答案时,其他答案就没有意义了。