我正在使用 SWI Prolog 为大学考试学习 Prolog,我对以下问题的两种不同解决方案之间的差异有一些疑问:
定义子句count(X, L, NumX),其中 X 是一个原子,L 是一个列表,NumX 是 X 在 L 中出现的次数。
这是第一个解决方案:
count0(_,[],0).
count0(A, [A|Tail], N) :-
count0(A,Tail,N1), % L'elemento cercato appare N1 volte nella sottolista
N is N1+1. % N vale N1+1
count0(A, [B|Tail], N) :-
A\=B, % A è diverso da B
count0(A,Tail,N). % N è il numero di occorrenze di A nella sottolista
这是第二种解决方案:
count1(_,[],0).
count1(A, [A|Tail], N) :- !,
count1(A, Tail, N1),
N is N1+1.
count1(A, [_|Tail], N) :- count1(A, Tail, N).
我的问题是我不明白 CUT 在第二个版本中扮演什么角色
我知道 CUT 可以防止在放置 CUT 的特定点回溯。
程序的第一个版本在第二条规则中检查 A 是否与 B 不同(我需要这个吗?如果第一条规则失败,则意味着 A 不与列表的 HEAD 统一,因此列出它与 A 中的元素不同)
第二个版本不在第二条规则中执行此检查,而是在第一条规则中进行了删减......
这可能取决于(在第二个版本中)如果我不阻止回溯发生的事实:在那之后,Prolog 给我第一个(正确的)响应,如果我强制回溯使用 ; 发生使用第二条规则:
count1(A, [_|Tail], N) :- count1(A, Tail, N).
在计算中采用不同的分支,在那个分支中我没有 N 是 N+1 吗?