【问题标题】:Prolog complication errorProlog并发症错误
【发布时间】:2015-04-29 02:20:20
【问题描述】:

我有一个关于我遇到的错误的快速问题。我是 prolog 的新手,所以如果它是一个简单的修复,请原谅。

这是我想要做的:

考虑问题 1 中创建的数据库。在实现以下规则时,您可以添加额外的规则以使您的实现更容易。


2.1 添加以下规则集以扩展成员之间的家庭关系: (1)parent_of,(2)兄弟姐妹,(3)uncle_of,(4)uncleOrAunt_of,(5)配偶,和(6)后代


2.2 将至少 10 个事实添加到数据库中。这些新事实应显示家庭成员之间的一致关系,并且必须确保 (1) 没有冲突事实,(2) 没有冗余信息,(3) 问题 2.1 中定义的每个规则都可以为至少一组参数返回“是”值.


2.4 在数据库末尾添加一个名为fullQuestions 的规则,以测试您在作业中定义的所有规则。包括足够的书面陈述,以便打印个别问题的答案。确保复合问题可以终止(不会导致“死循环”)。将输出包含为 cmets。

这是我目前得到的:

/* Database for family. It consists of facts and
rules. */

/* Facts */
/* female(ella).
female(jodi).
female(sonya).
/*
male(arnold).
*/
male(chris).
/*
male(louis).
male(mark).
 */
father_of(X,Y) :- 
   parent_of(X,Y), is_male(X).
father_of(arnold, chris). /* arnold is the father of chris */
father_of(louis, mark).
father_of(mark, arnold).

mother_of(X,Y) :- 
  parent_of(X,Y), is_female(X).
mother_of(ella, sonya).
mother_of(jodi, mark).

child(X, Y) :-
    parent_of(Y, X).

parent_of(X, Y) :-
    child(Y, X).

parent_of(jodi, ella).
parent_of(jodi, mark).
parent_of(louis, mark).
parent_of(mark, arnold).
parent_of(jose, sergio).
parent_of(ana, sergio).
parent_of(jose, gio).
parent_of(ana, gio).
parent_of(joe, jose).
parent_of(mary, jose).

/* Rules */


grandmother_of(X, Z) :-
            mother_of(X, Y),
            (mother_of(Y, Z); father_of(Y, Z)).

is_male(X) :-
    father_of(X, _).
is_female(X) :-
    mother_of(X, _).

sibling_of(X, Y) :-
 parent_of(Z, X), parent_of(Z, Y).

sister(X,Y) :- 
   siblings(X,Y), is_female(X), X \= Y.

brother(X,Y) :- 
    siblings(X,Y), is_male(X), X \= Y.

uncle_of(X,Y) :- 
brother(X,Z), mother_of(Z,Y).
uncle_of(X,Y) :- 
 brother(X,Z), father_of(Z,Y).

uncleOrAunt_of(X, Y) :-
    brother(X,Z), mother_of(Z,Y).
uncleorAunt_of(X, Y) :-
    brother(X,Z), father_of(Z,Y).
uncleorAunt_of(X, Y) :-
    sister(X,Z), father_of(Z,Y).
uncleorAunt_of(X, Y) :-
    sister(X,Z), mother_of(Z,Y).

spouse_of(X,Y) :-
    child(P, X), child(P, Y).

ancestor( X , Y ) :-
  parent_of( X , Y ).
ancestor( X , Y ) :-
     parent_of( X , Z ) , ancestor( Z , Y ).

descendant_of(X, Y) :-
    ancestor(Y, X).

familyquestions :-
    grandmother_of(X, arnold),
    write('The grandmother of Arnold is '), write(X), nl,
    father_of(Y, mark),
    write(Y), write(' is the father of Mark'), nl, nl.

但是,当我尝试编译它时,我得到了多个错误:

/tmp/gplcExLkpg.o:在函数`predicate(sister/2)'中:

(.text+0x7b3): 未定义引用`predicate(siblings/2)'

/tmp/gplcExLkpg.o:在函数`predicate(brother/2)'中:

(.text+0x843): 对`predicate(siblings/2)'的未定义引用

collect2: 错误:ld 返回 1 个退出状态

编译失败

【问题讨论】:

  • 您在parent_of(mary, jose), 中有错字。它应该以点而不是逗号结尾。
  • 哦,好的,谢谢!我修复了它,但现在我有两个不同的错误?
  • family.pl:64-65:警告:不连续谓词 parent_of/2 - 子句忽略 family.pl:75:致命错误:重新定义控制构造 (',')/2 编译失败

标签: prolog


【解决方案1】:

“警告:不连续谓词 parent_of/2 - 子句忽略错误”弹出,因为 parent_of/2 谓词分离。 尝试parent_of(X, Y) :- child(Y, X). 就在parent_of(mary, jose). 下方

像这样:

father_of(X,Y) :- parent_of(X,Y), is_male(X).
father_of(arnold, chris). /* arnold is the father of chris */
father_of(louis, mark).
father_of(mark, arnold).

mother_of(X,Y) :- parent_of(X,Y), is_female(X).
mother_of(ella, sonya).
mother_of(jodi, mark).

parent_of(X, Y) :- child(Y, X).
parent_of(jodi, ella).
parent_of(jodi, mark).
parent_of(louis, mark).
parent_of(mark, arnold).
parent_of(jose, sergio).
parent_of(ana, sergio).
parent_of(jose, gio).
parent_of(ana, gio).
parent_of(joe, jose).
parent_of(mary, jose).

等等。

我不记得确切的语法,但几乎可以肯定“;” (或)应该工作:

uncleOrAunt_of(X, Y) :-
    (brother(X,Z), mother(Z,Y));
    (brother(X,Z), father(Z,Y));
    (sister(X,Z), father(Z,Y));
    (sister(X,Z), mother(Z,Y)).

试一试,让我知道。 无论如何,您都可以通过重写来修复致命错误

uncleOrAunt_of(X, Y) :-brother(X,Z), mother(Z,Y).
uncleOrAunt_of(X, Y) :-brother(X,Z), father(Z,Y).
uncleOrAunt_of(X, Y) :-sister(X,Z), father(Z,Y).
uncleOrAunt_of(X, Y) :-sister(X,Z), mother(Z,Y).

希望把事情说清楚,我是对的。

.................................................. .....

【讨论】:

  • 谢谢,但是在我进行更改后,我得到了几个不同的错误
  • 不再出现致命错误。您是否尝试对谓词进行分组?
  • 组队是什么意思?
  • 同一谓词的规则和事实一个接一个。查看答案编辑。
  • 我认为可能是循环引起的错误。 prolog 开始从数据库的第一行寻找答案,直到它找到一些东西:当调用姐妹(X,Y)时:-兄弟姐妹(X,Y),is_female(X),X \= Y。它寻找兄弟姐妹(X, Y) :-parent_of(Z, X), parent_of(Z, Y)。然后 parent_of(X, Y) :- child(Y, X)。然后是孩子(X,Y):- parent_of(Y,X)。因为下一个调用将是 gain 的父级,它将循环。尝试在规则之前为 child(/2) 或 parent_of 事实添加一些可靠的事实。