prolog未捕获异常错误

时间:2015-04-27 06:13:08

标签: prolog

嗨,我是Prolog的新手,我试图创建一个基本的家谱,所以我有这个:

/* 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(arnold, chris). /* arnold is the father of chris */
father_of(louis, mark).
father_of(mark, arnold).    
mother_of(ella, sonya).
mother_of(jodi, ella).
mother_of(jodi, mark).

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

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.

但是,我试图这样做: 如果X是某人的父亲,则定义(添加到数据库中)一个名为is_male(X)的规则,该规则返回“yes”(或“true”)。 注意,如果系统找到“真实”答案并且不存在更多真实答案,则系统将返回“是”。系统将返回“true?”如果它找到“真实”答案并且仍有可能进一步匹配。在 在这种情况下,如果输入“enter”,它将返回“yes”并停止。如果您键入“;”,它将继续搜索更多答案。 1.2定义名为is_female(X)的规则,如果X是某人的母亲,则返回“是”或“真”。
1.3删除(注释掉)已添加到数据库中的非必要事实(已被新规则is_male / 1和is_female / 1涵盖)。

所以我添加了这个

/ *家庭数据库。它由事实和规则组成。 * /

/* Facts */
female(ella).
female(jodi). 
female(sonya).
male(arnold).
male(chris).
male(louis).
male(mark).
father_of(arnold, chris). /* arnold is the father of chris */
father_of(louis, mark).
father_of(mark, arnold).    
mother_of(ella, sonya).
mother_of(jodi, ella).
mother_of(jodi, mark).

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

 is_male(X, Y) :-
        father_of(X, Y).

 is_female(X, Y) :-
          mother_of(X, Y).

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.

但是当我运行它时,它给了我这个代码: 未捕获的异常:错误(exist_error(procedure,is_male / 1),top_level / 0)

1 个答案:

答案 0 :(得分:3)

错误error(existence_error(procedure,is_male/1),top_level/0)表示您正在调用一元谓词is_male,即您正在调用is_male(X)或类似内容。但是,您只定义了二元谓词is_male(谓词的arity通过将/N附加到N - ary谓词的名称来表示。

也许您想将is_male定义为:

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

请注意,此规则不够。 您可能想要扩展它,因为您的KB中可能有人是男性,但不是其他人的父亲。

完成is_male/1的定义后,您可以通过调用p而不是检查事实is_male(p)来确定某人male(p)的性别。 有些人的事实male(p)是多余的,因为他们也是其他人的父亲。你应该按照要求删除那些多余的事实。

相关问题