Prolog族树编译错误

Prolog族树编译错误,prolog,Prolog,编译此文件时,我收到两条错误消息: "Clauses of (-)/1 are not together in source-file" and "Singleton variables: [X]" …这两个是我一直犯的错误的例子 我试着删除源代码中的一些事实,这样就不会有任何事实冲突,我试着把人定义为原子而不是从句……它们都没有像我希望的那样工作,有什么想法吗 male(X). female(X). parent(X,Y). father(X,Y):- male(X), parent(X,Y

编译此文件时,我收到两条错误消息:

"Clauses of (-)/1 are not together in source-file" and
"Singleton variables: [X]"
…这两个是我一直犯的错误的例子

我试着删除源代码中的一些事实,这样就不会有任何事实冲突,我试着把人定义为原子而不是从句……它们都没有像我希望的那样工作,有什么想法吗

male(X).
female(X).
parent(X,Y).
father(X,Y):- male(X), parent(X,Y).
mother(X,Y):- female(X), parent(X,Y).
descendant(X,Y):- parent(Y,X).
sibling(X,Y):- descendant(X,Z), descendant(Y,Z).
brother(X,Y):- male(X), sibling(X,Y).
sister(X,Y):- female(X), sibling(X,Y).
grandparent(X,Y):- parent(X,Z), parent(Z,Y).
paternalgrandparent(X,Y):- father(X,Z), father(Z,Y).
ancestor(X,Y):- parent(X,Y).
ancestor(X,Y):- ancestor(X,Z), parent(Z,Y).
male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).
male(claude).
male(matthew).
female(stephania).
male(kurt).
male(david).
male(mark).
male(raymond).
female(therese).
female(nadine).
female(nathalie).
male(richard).
female(mary).
male(john).
female(lilian).
female(inez).
male(william).
female(rose).
male(richie).
female(alice).
brother(edward,vicky).
brother(kevin,sean).
brother(sean,vicky).
sister(vicky,edward).
brother(malcolm,claude).
brother(claude,malcolm).
brother(matthew,stephania).
brother(kurt,matthew).
sister(stephania,kurt).
brother(david,mark).
brother(mark,david).
sister(therese,nadine).
sister(nadine,therese).
sister(lilian,inez).
sister(inez,lilian).
father(david,edward).
mother(therese,edward).
father(mark,malcolm).
mother(nathalie,malcolm).
father(raymond,matthew).
mother(nadine,matthew).
father(richard,david).
mother(mary,david).
father(john,therese).
mother(lilian,therese).
paternalgrandparent(richard,edward).
grandparent(mary,edward).
grandparent(lilian,edward).
grandparent(john,edward).
paternalgrandparent(richard,malcolm).
grandparent(mary,malcolm).
grandparent(lilian,matthew).
grandparent(john,matthew).
father(william,richard).
mother(rose,richard).
paternalgrandparent(william,david).
grandparent(rose,david).
father(richie,william).
mother(alice,william).
paternalgrandparent(richie,richard).
grandparent(alice,richard).
ancestor(richie,william).
ancestor(alice,william).
ancestor(william,richard).
ancestor(rose,richard).
ancestor(richard,david).
ancestor(mary,david).
ancestor(david,edward).
ancestor(therese,edward).
ancestor(lilian,therese).
ancestor(john,therese).
ancestor(lilian,nadine).
ancestor(john,nadine).
ancestor(richard,mark).
ancestor(mary,mark).
“子句不在一起”是要修复的最简单错误:只需重新安排程序的事实,使具有相同名称的所有事实(例如,
male/1
male/1
等)一起出现在程序源代码中

“单例变量”错误来自以下几行:

male(X).
female(X).
parent(X,Y).
当一个变量在enture规则或一个事实中只被提及一次时,它就是单态变量。如果您确实需要这些变量,则应将它们替换为下划线。但是,在您的情况下,您不需要这些变量:否则,需要这样的规则

male(_).
会断言任何人都是男性,而你不希望这种情况发生。您只需删除这些规则即可消除单例错误

然而,您的程序最大的问题是,您试图为已经通过规则定义的内容定义事实。您需要的事实是
男性/1
女性/1
,以及
家长/2
。其他一切都可以通过规则正确派生。

要纠正的最简单错误是“子句不在一起”:只需重新安排程序的事实,使同名的所有事实(例如,
男性/1
女性/1
等)一起出现在程序源代码中

“单例变量”错误来自以下几行:

male(X).
female(X).
parent(X,Y).
当一个变量在enture规则或一个事实中只被提及一次时,它就是单态变量。如果您确实需要这些变量,则应将它们替换为下划线。但是,在您的情况下,您不需要这些变量:否则,需要这样的规则

male(_).
会断言任何人都是男性,而你不希望这种情况发生。您只需删除这些规则即可消除单例错误


然而,您的程序最大的问题是,您试图为已经通过规则定义的内容定义事实。您需要的事实是
男性/1
女性/1
,以及
家长/2
。其他一切都可以通过规则正确派生。

它们应该只是警告而不是错误。 第一条消息是告诉您一起定义谓词

比如说

male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).
male(X).
这不好。 原因是你传播了男性的定义,代码变得完全不可读

第二个是告诉你,如果你在头脑中使用变量,你应该在身体中使用它

比如说

male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).
male(X).
这不好。你可以写

male(_).

同样,单例变量常常会在您试图编写的内容中导致错误,因此最好使用u来明确它们的用法。

它们应该只是警告而不是错误。 第一条消息是告诉您一起定义谓词

比如说

male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).
male(X).
这不好。 原因是你传播了男性的定义,代码变得完全不可读

第二个是告诉你,如果你在头脑中使用变量,你应该在身体中使用它

比如说

male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).
male(X).
这不好。你可以写

male(_).

同样,单例变量常常会在您试图编写的内容中导致错误,因此最好使用u来明确它们的用途。

在堆栈溢出时格式化程序的最简单方法是选择要格式化的部分,然后单击大括号按钮
{}
在顶部的编辑器工具栏上。谢谢各位,你们的回答确实帮了我的忙,但我显然还有另一个问题。。。我不断地提出疑问,但即使对于错误的陈述,我也得到了“真实”的回报……即使原子不存在(提出疑问“祖先(leo,edward)”,并且得到了真实…知道为什么会发生这种情况吗?如果这与yahoo answers类似,我宁愿等到投票,因为这两个答案都帮了我的忙..而且后续问题是关于这个程序的,而不是另一个,所以我认为在同一页上处理与这个程序相关的问题是个好主意…问题和答案go发布时的投票。虽然后续问题与同一个程序有关,但我认为该程序有点不同,您所问的是逻辑错误,而不是编译错误。因此,较新的问题往往会引起更多关注(尽管在较少使用的标记中,如
[Prolog]
问题往往会在较长时间内保持新状态)。您可以从新问题中发布指向此问题的链接,但下面答案中的信息不会有多大帮助,因为两个答案都专注于解决语法问题,而不是逻辑问题。在堆栈溢出时格式化程序的最简单方法是选择要格式化的部分,然后单击大括号按钮
{}
在编辑器顶部的工具栏上。谢谢各位,你们的回答确实帮了我的忙,但我显然还有另一个问题……我一直在提出疑问,但即使是错误的陈述,我也得到了“真实”的回报……即使原子不存在(提出疑问“祖先(leo,edward)”,并且得到了真实的结果”…知道为什么会发生这种情况吗?如果这与yahoo answers类似,我宁愿等到投票,因为这两个答案都帮了我的忙..而且后续问题是关于这个程序的,而不是另一个,所以我认为在同一页上处理与这个程序相关的问题是个好主意…问题和答案g尽管后续问题与同一个节目有关,但我想这个节目会有很大的不同,你会问