fiore@hope.UUCP (David Fiore) (08/19/86)
This is my first attempt at writting a prolog problem and I have come to
a point where I don't know why the program doesn't work and I have run out
of ideas on how to make it work. Could anyone out there in netland help me
out with this?
ADVthanksANCE
-David Fiore
/* This program is supposed to solve a logic puzzle I read in R.
Smullyn's book "What Is The Name Of This Book?". The problem
is as follows:
On a certain island in the pacific is an island
of knights and knaves. Now knights by nature allways
tell the truth, as far as they know it, while knaves
by nature allways tell lies, as far as they know it.
A visitor to the Island of Knights and Knaves comes
across three inhabitants of the island standing together
in a garden. We will call them Larry, Curly, and Moe.
The stranger says to Larry: "Are you a knight or a
knave?". Larry answers but, rather indistinctly, so the
stranger could not make out what Larry said. So the
stranger says to Curly: "What did Larry say?". Curly
says: "Larry said that he was a knave." At this point,
the third man Moe says: "Don't believe Curly, he's lying!"
The question is what are Curly and Moe?
It is immediately obvious that whatever Curly is, Moe is the
opposite. What is not immediately obvious to everyone is that
independant of Moe's statement, we can see that Curly is lying
because it is impossible for any inhabitant to claim to be a
knave. We can therefore deduce that Curly is a knave and Moe is
a knight.
*/
is_knight (X) :-
is_knave (X),!,false.
is_knight (X) :- /* Someone is a knight if he */
says (X, Y), Y. /* says something and that */
/* thing is true. */
is_knave (X) :-
is_knight (X), !, false.
is_knave (X) :- /* Someone is a knave is he */
says (X, Y), not (Y). /* says something and that */
/* thing is not true. */
legal (X, Y) :-
Y, is_knight (X).
legal (X, Y) :-
not (Y), is_knave (X).
says (larry, Z):- /* We don't know what he said */
legal (larry, Z).
says (curly, says (larry, is_knave (larry))). /* Says larry claims knavehood */
says (moe, is_knave (curly)). /* Says curly is a knave */
--
||
|| David Fiore, University of California at Riverside.
=============
|| Slow mail : 1326 Wheaton Way
|| Riverside, Ca. 92507
|| E-Mail
|| UseNet : ...!ucdavis!ucrmath!hope!fiore
|| BITNET : consult@ucrvms
Have another day!
"...and at warp eight, we're going nowhere mighty fast"