user1700890
user1700890

Reputation: 7732

Prolog - is the following query satisfied?

I am doing exercise from the following link

Here is knowledge base:

house_elf(dobby). 
witch(hermione). 
witch(’McGonagall’). 
witch(rita_skeeter). 
magic(X):-  house_elf(X). 
magic(X):-  wizard(X). 
magic(X):-  witch(X).

I am expecting the following query to return true:

?-  magic(’McGonagall’).

However, my SWI-Prolog (AMD64, Multi-threaded, version 7.6.4) on Windows 7 returns the following:

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
?- 

Why does it fail?

Upvotes: 1

Views: 127

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477230

In the magic/1 predicate, you call wizard/1, which is not defined:

magic(X):-  house_elf(X). 
magic(X):-  wizard(X).
magic(X):-  witch(X).

The result is that Prolog errors, since it calls a predicate that is nowhere defined.

You can for example define a wizard/1 predicate that always fails:

% a world without wizards (if you do not specify extra wizards)
wizard(_) :- fail.

or populate your "world" with wizards, like:

wizard(dumbledore).
wizard(remus_lupin).
%% ...

Upvotes: 2

Related Questions