:- (op(50,fx,goto)). :- (op(50,fx,pickup)). :- (op(50,fx,drop)). room(porch). room('entrance hall'). room('dining room'). room('study'). room('sitting room'). room(kitchen). room('downstairs bathroom'). room('upstairs bathroom'). room(pantry). room('master bedroom'). room('guest room'). room(cellar). room(conservatory). room(landing). door(porch,'entrance hall'). door('entrance hall','dining room'). door('entrance hall','sitting room'). door('entrance hall',study). door('entrance hall','downstairs bathroom'). door('entrance hall',kitchen). door('entrance hall',landing). door('sitting room',conservatory). door(kitchen,pantry). door(kitchen,cellar). door(kitchen,'dining room'). door(landing,'master bedroom'). door(landing,'guest room'). door(landing,'upstairs bathroom'). item(spanner). item(lightbulb). item('can of spam'). item(herring). item(bone). item(katana). item(raincoat). item(plant). item(chocolate). item('a handful of sweets'). loc(spanner,cellar). loc(lightbulb,cellar). loc('can of spam',kitchen). loc(herring,kitchen). loc(bone,porch). loc(katana,'entrance hall'). loc(raincoat,porch). loc(plant,porch). loc(chocolate,kitchen). inv('a handful of sweets'). inv('a dry-roasted peanut'). loccurrent(porch). link(X,Y) :- door(X,Y). link(X,Y) :- door(Y,X). cango(X) :- loccurrent(Y), link(X,Y). goto(X) :- cango(X), loccurrent(Y), retract(loccurrent(Y)), assert(loccurrent(X)), write('You have entered the '), write(X). look :- loccurrent(X), write('You are in the '), write(X), nl, litems, nl, ldoors. look. litems :- loccurrent(X), write('You can see:'), item(Y), loc(Y,X), nl, write(Y), fail. ldoors :- loccurrent(X), write('Peering through open doors as you stroll around the room you see: '), link(X,Z), nl, write('the '), write(Z), fail. l :- look. inventory :- write('You rummage in your bag and find:'), inv(X), nl, write(X), fail. inventory. i :- inventory. pickup(X) :- loccurrent(Y), loc(X,Y), retract(loc(X,Y)), assert(inv(X)), write('You picked up '), write(X). drop(X) :- inv(X), loccurrent(Y), retract(inv(X)), assert(loc(X,Y)), write('You dropped '), write(X). start :- repeat, nl, write('Enter command: '), read(X), do(X), nl, terminate(X). do(goto(X)):- goto(X). do(pickup(X)):- pickup(X). do(drop(X)):- drop(X). do(look):- look. do(inventory):- inventory. do(i):- i. do(l):- l. terminate(end). terminate(X):- inv(katana), nl, write('Congratulations, you won').