嗨,我是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)
答案 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)
是多余的,因为他们也是其他人的父亲。你应该按照要求删除那些多余的事实。