AI-Prolog
view release on metacpan or search on metacpan
data/sleepy.pro view on Meta::CPAN
/* "Sleepy" -- a sample adventure game, by David Matuszek. */
% http://www.csc.vill.edu/~dmatusze/resources/prolog/sleepy.html
/* In standard Prolog, all predicates are "dynamic": they
can be changed during execution. SWI-Prolog requires such
predicates to be specially marked. */
% :- dynamic at/2, i_am_at/1, i_am_holding/1, alive/1,
% lit/1, visible_object/1.
/* This routine is purely for debugging purposes. */
%dump :- listing(at), listing(i_am_at), listing(i_am_holding),
% listing(alive), listing(lit), listing(visible_object).
/* This defines my current location. */
i_am_at(bedroom).
i_am_holding(nothing).
/* These facts describe how the rooms are connected. */
path(bedroom, n, den) :- lit(bedroom).
data/sleepy.pro view on Meta::CPAN
% are located.
at(flyswatter, den).
at(fly, bedroom).
at('light switch', den).
at('light switch', bedroom).
/* These facts specify some game-specific information. */
alive(fly).
lit(bedroom).
lit(den).
visible_object('light switch').
/* These rules describe how to pick up an object. */
take(fly) :-
print('It is too fast for you!'), nl,
data/sleepy.pro view on Meta::CPAN
lit(den),
print('The light from the den is keeping you awake.'), nl,
!, fail.
sleep :-
or(i_am_holding(flyswatter), at(flyswatter, bed)),
print('What? Sleep with a dirty old flyswatter?'), nl,
!, fail.
sleep :-
alive(fly),
print('As soon as you start to doze off, a fly lands'), nl,
print('on your face and wakes you up again.'), nl,
make_visible(fly),
make_visible(flyswatter),
!, fail.
sleep :-
print('Ahhh...you (yawn) made...it...zzzzzzzz.'), nl, nl,
finish.
data/sleepy.pro view on Meta::CPAN
i_am_at(Place),
not(lit(Place)),
print('You flail aimlessly in the dark!'), nl.
swat :-
not(i_am_holding(flyswatter)),
print('You are not holding the flyswatter.'), nl,
!, fail.
swat :-
not(alive(fly)),
print('He is dead, Jim.'), nl.
swat :-
i_am_at(Place),
not(at(fly, Place)),
print('You swish the flyswatter through the air.'), nl.
/* Have flyswatter, room is lit, fly is here and alive. */
swat :-
buzz_off,
print('The fly escapes into the other room.'), nl.
swat :-
print('Success! You killed that pesky fly!'), nl,
retract(alive(fly)).
swat :- /* For debugging... */
print('You must have forgotten a case!', nl).
make_visible(X) :-
visible_object(X).
make_visible(X) :-
assert(visible_object(X)).
data/spider.pro view on Meta::CPAN
print('The door appears to be locked.'), nl,
fail.
% These facts tell where the various objects in the game are located.
at(ruby, spider).
at(key, cave_entrance).
at(flashlight, building).
at(sword, closet).
% This fact specifies that the spider is alive.
alive(spider).
% These rules describe how to pick up an object.
take(X) :-
at(X, in_hand),
print('You are already holding it!'),
nl.
take(X) :-
i_am_at(Place),
data/spider.pro view on Meta::CPAN
die.
kill :-
i_am_at(cave),
print('This is not working. The spider leg is about as tough'), nl,
print('as a telephone pole, too.'), nl.
kill :-
i_am_at(spider),
at(sword, in_hand),
retract(alive(spider)),
print('You hack repeatedly at the back of the spider. Slimy ichor'), nl,
print('gushes out of the back of the spider, and gets all over you.'), nl,
print('I think you have killed it, despite the continued twitching.'),
nl.
kill :-
i_am_at(spider),
print('Beating on the back of the spider with your fists has no'), nl,
print('effect. This is probably just as well.'), nl.
data/spider.pro view on Meta::CPAN
describe(closet) :-
print('This is nothing but an old storage closet.'), nl.
describe(cave_entrance) :-
print('You are in the mouth of a dank cave. The exit is to'), nl,
print('the south; there is a large, dark, round passage to'), nl,
print('the east.'), nl.
describe(cave) :-
alive(spider),
at(ruby, in_hand),
print('The spider sees you with the ruby and attacks!!!'), nl,
print(' ...it is over in seconds....'), nl,
die.
describe(cave) :-
alive(spider),
print('There is a giant spider here! One hairy leg, about the'), nl,
print('size of a telephone pole, is directly in front of you!'), nl,
print('I would advise you to leave promptly and quietly....'), nl.
describe(cave) :-
print('Yecch! There is a giant spider here, twitching.'), nl.
describe(spider) :-
alive(spider),
print('You are on top of a giant spider, standing in a rough'), nl,
print('mat of coarse hair. The smell is awful.'), nl.
describe(spider) :-
print('Oh, gross! You are on top of a giant dead spider!'), nl.
( run in 1.107 second using v1.01-cache-2.11-cpan-df04353d9ac )