我正在根据以下link
做运动这是知识库:
house_elf(dobby).
witch(hermione).
witch(’McGonagall’).
witch(rita_skeeter).
magic(X):- house_elf(X).
magic(X):- wizard(X).
magic(X):- witch(X).
我希望以下查询返回true:
?- magic(’McGonagall’).
但是,我在Windows 7上的SWI-Prolog(AMD64,多线程,版本7.6.4)返回以下内容:
ERROR: Stream user_input:450:4 Syntax error: Unexpected end of clause
?- magic('McGonagall').
ERROR: Undefined procedure: wizard/1
ERROR: In:
ERROR: [9] wizard('McGonagall')
ERROR: [8] magic('McGonagall') at c:/users/some_user/google drive/projects/nlp/prolog/code/ex2_2.pl:6
ERROR: [7] <user>
Exception: (9) wizard('McGonagall') ? creep
Exception: (8) magic('McGonagall') ? creep
?-
为什么会失败?
答案 0 :(得分:2)
在magic/1
谓词中,您调用wizard/1
,这是未定义的:
magic(X):- house_elf(X).
magic(X):- wizard(X).
magic(X):- witch(X).
结果是Prolog错误,因为它调用了未定义的谓词。
例如,您可以定义一个wizard/1
谓词,表示总是失败:
% a world without wizards (if you do not specify extra wizards)
wizard(_) :- fail.
或使用向导填充您的“世界”,例如:
wizard(dumbledore).
wizard(remus_lupin).
%% ...