程序不适用于';prolog中的evey模式不起作用

程序不适用于';prolog中的evey模式不起作用,prolog,counter,Prolog,Counter,我试着找出一个人有多少个孩子。创建了我的示例空间,在查找过程中,我应该计算子对象的数量并打印值 输入/输出示例: ?- find(joe,Result). false. 我试图改变查找(X,R)如下: find(X,R) :- R is 0 . R is R+1 , father(X,Y). write(R). 然后它的输入/输出变成了这样 ?- find(joe,R). R = 0. 我尝试了我所知道的关于prolog的知识,但我认为我没有什么知识来完成这

我试着找出一个人有多少个孩子。创建了我的示例空间,在查找过程中,我应该计算子对象的数量并打印值

输入/输出示例:

?- find(joe,Result).
false.
我试图改变
查找(X,R)
如下:

find(X,R) :-
   R is 0 .
   R is R+1 ,    
   father(X,Y).
   write(R).
然后它的输入/输出变成了这样

?- find(joe,R).
R = 0.
我尝试了我所知道的关于prolog的知识,但我认为我没有什么知识来完成这项任务。欢迎所有建议。谢谢你的关心

:- [library(clpr)].

mother(susan, sue).
father(joe, eric).
father(joe, smith).
father(joe, barrack).
father(sue, john).
father(eric, bill).
father(bill, george).

find(X,R):-
   R is 0,
   R is R+1 ,
   father(X,Y).

要查找特定人员的所有子女的数量,您需要收集父亲(父亲,子女)或母亲(母亲,子女)的所有解决方案,并对其进行计数。例如:

number_of_childrens(Person, N) :-
    findall(Children, (father(Person, Children); mother(Person, Children)), Childrens),
    length(Childrens, N).
?- number_of_childrens(joe, N).
N = 3.
例如:

number_of_childrens(Person, N) :-
    findall(Children, (father(Person, Children); mother(Person, Children)), Childrens),
    length(Childrens, N).
?- number_of_childrens(joe, N).
N = 3.

Prolog是一种声明性语言:这意味着一旦设置了变量(
R
),就不能将其设置为其他值。请注意,您键入了一个句点
,其中逗号
属于第二个代码块,介于
R=0
R=R+1
之间。正如CommuSoft所指出的,后一种说法不会起到任何作用,或者至少不会达到您在这里所希望的效果。我不明白为什么它会起作用。finall和length是在prolog基本库中声明的过程吗?我试图在我的其他prolog代码中实现numberofchildrens过程,但没有成功。您的代码是否只对静态过程有效?因为实现的过程是动态的。它的工作原理是一样的。唯一改变的地方是事实库。
findall/3
length/2
谓词都是大多数Prolog实现中的内置谓词,包括用于标记问题的谓词。代码和示例结果在您的问题中使用了
父亲/2
母亲/2
事实的知识库。这些谓词是动态的还是静态的并不重要。至少一些
sort/2
会消除多余的答案和对特定顺序的依赖性。@false问题文本和示例显示了在绑定person(我们想知道其子代数)的情况下调用的谓词。我的回答是假设数据库中没有人同时是父亲和母亲,并且存在重复的事实。如果不是这样,或者如果第一个参数可以解除绑定,则可以使用
setof/3
而不是
findall/3
来避免这些问题。不幸的是,对于所有没有孩子的人,您无法轻松地将
findall/3
替换为
setof/3
。在任何情况下,您现在在本评论中陈述的这些隐含假设都需要明确。