Prolog 序言:计算返回多个答案的列表中元素的出现次数

Prolog 序言:计算返回多个答案的列表中元素的出现次数,prolog,Prolog,我有点麻烦。我编写了一个函数,返回列表中元素的出现次数。代码如下: occurencesHelp(X,[],N,N). occurencesHelp(X,[X|T],N,Y) :- N1 is N+1, occurencesHelp(X,T,N1,Y). occurencesHelp(X,[H|T],N,Y) :- occurencesHelp(X,T,N,Y). occurences(X,List,N) :- occurencesHelp(X,List,0

我有点麻烦。我编写了一个函数,返回列表中元素的出现次数。代码如下:

occurencesHelp(X,[],N,N).

occurencesHelp(X,[X|T],N,Y) :-
    N1 is N+1,
    occurencesHelp(X,T,N1,Y).

occurencesHelp(X,[H|T],N,Y) :-
    occurencesHelp(X,T,N,Y).

occurences(X,List,N) :-
    occurencesHelp(X,List,0,N).
这很好,我得到的第一个答案是:

N = 5 ?
但还有多种答案,例如:

N = 4 ? ;
N = 4 ? ;
N = 3 ? ;
N = 4 ? ;
N = 3 ? ;
等等。我试着通过追踪来看看我是否能理解为什么会这样,但我无法理解。我认为使用切割会对我有所帮助,但我们被明确告知不要使用切割,所以这不是一个选项。任何帮助都将不胜感激


谢谢。

当我在SWI Prolog中加载您的代码时,我收到以下警告:

Warning: /home/isabelle/occ.pl:1:
    Singleton variables: [X]
Warning: /home/isabelle/occ.pl:7:
    Singleton variables: [H]
这些警告很重要。单例变量通常是您犯了严重逻辑错误的标志。在您的情况下,让我们看看第7行。在这一条款中:

occurencesHelp(X,[H|T],N,Y) :-
    occurencesHelp(X,T,N,Y).
Prolog告诉我们,
H
是一个单变量。这意味着它在这个子句中只出现一次,这意味着我们忘记将
H
与其他变量联系起来

上一条规定(按程序):“如果列表的标题是
X
,则递增计数器”。相反,该条款应说明:“如果列表的标题不是
X
,则保持计数器不变”。但它并没有提到榜首:事实上,它没有提到任何关于
H
(因此发出警告)

因此,您需要添加一个目标,表示
X
H
应该不相等。表达这一点的两种方法是
X\=H
dif(X,H)
。在您的情况下,选择取决于您在课程中所学的内容


(在这种情况下,第1行的单例警告是良性的;您可以将
X
替换为
\ux
,告诉Prolog您明确希望忽略该变量。)

非常感谢您的回复,添加X\=H确实解决了问题。为了清楚起见,为什么需要明确说明这一点?根据我的理解,如果X=H,它将使用递增计数器的子句,如果X\=H,它将使用保持计数器不变的子句。为什么会有这样一个子句实例,使计数器X=H保持不变?抱歉,如果这是琐碎的,只是想让我的头围绕它。谢谢。@Faz,因为如果您的第二个案例没有明确强制执行
X\=H
,那么案例
X=H
将匹配这两种情况。请记住:Prolog寻求符合您的规则的所有可能的解决方案。