Er is een duistere wereld waarin een stinkend monster leeft. De zogenaamde wumpus.
Deze wumpus is heel boos omdat hij door de AI onderzoekers is opgesloten werd in
deze wereld die dan ook nog eens vol bodemloze putten zit. Bovendien is zijn
naam wumpus wat hem ook niet zo gelukkig stemt, hij zou namelijk graag annita
heten.
Onze wumpus heeft echter iets wat de AI onderzoekers heel graag willen, een hoop
glinsterend goud. Daarom sturen ze een robot de wereld in om het goud te vinden.
Deze robot heeft twee sensoren: een anemometer en een snuffelaar. Hiermee moet
hij het goud zien te vinden. Voor het geval de robot de whumpus tegen zou komen
is hij ook uitgerust met een pijl om mee te schieten.
Gegeven een veld van N bij N vakjes met daarop minstens één bodemloze put (pit) en juist één wumpus.
Op het veld krijgt elk vakje een coördinaat waarbij het eerste cijfer de rij aangeeft en het tweede cijfer de kolom. Je begint op vakje (0,0) in de linkerbovenhoek.
Het is de bedoeling goud (een vakje met de eigenschap glitter) te vinden. Hierbij mag je geen vakje met een bodemloze put of de wumpus onderzoeken. Op de vakjes naast (niet diagonaal)
een bodemloze put is een briesje (breeze). Op de vakjes naast de whumpus hangt er een stank (stench).
Voor een geldig ground coördinaat (X,Y) kun je een de oproep grid:shoot((X,Y)) gebruiken, dat zal er voor zorgen dat als de wumpus zich op (X,Y) bevindt hij geneutraliseerd wordt.
Je kunt grid:shoot/1 maar 1 keer oproepen. Stel dit dus zo lang mogelijk uit.
Voor een geldig ground coördinaat (X,Y) kun je een de oproep grid:query((X,Y), Meting)
doen waarbij Meting wordt geünificeerd met een lijst van metingen. Deze lijst kan volgende termen bevatten
stench((X,Y)): het stinkt op positie (X,Y), de Wumpus is een aanliggend (niet diagonaal) vakno_stench((X,Y)): het stinkt niet op positie (X,Y)breeze((X,Y)): er is een briesje op positie (X,Y), er is een put in een aanliggend (niet diagonaal) vakno_breeze((X,Y)): het is windstil op (X,Y)glitter((X,Y)): er is goud op (X,Y)no_glitter((X,Y)): er is geen goud op (X,Y)wumpus((X,Y)): de wumpus bevind zich op (X,Y), als je hier niet eerst hebt geschoten faalt de grid:query/2.Als je grid:query/2 uitvoert op een pit of de ongeschoten wunpus zal het falen en kun je geen verdere queries meer doen.
Schrijf een predicaat search(N, Plaats) dat aangeeft dat het goud zich bevind op Plaats in een N bij N bord.
In je zoektocht mag je beginnen van de informatie [no_breeze((0,0)),no_stench((0,0)), no_glitter((0,0))], dus je weet al dat vakje (0,0) veilig is en dat er geen briesje, stank of glitter is.
Bezoek eerst alle velden waarvan je zeker bent dat ze veilig zijn. Een veld die
op zijn minst 1 naburig veld heeft dat geen briesje bevat is zeker geen gat. Analoog
weet je dat als er geen stank is, er geen wumpus op het vak ernaast is.
Stel het schieten zo lang mogelijk uit. Schiet enkel als er geen enkel vak is waarvan
je zeker bent dat het veilig is (geen whumpus en geen pit). Schieten doe je in
dit geval op het vak dat lexicografisch het eerste is dat zeker geen pit is
maar wel een wumpus zou kunnen zijn.
Vind je het goud niet, of kun je geen zeker veilige zetten meer doen? Dan mag het predicaat falen.
Om je code te testen kun je gebruik maken van grid.pl1, een module die je kunt importeren met :- use_module("grid.pl")..
Deze module geeft je een grid:query en grid:shoot die uitgebreid zijn met debug informatie.
Met debug informatie
?- search(4, Plaats).
Investigating 0,1,
found: []
Investigating 0,0,
found: []
Investigating 0,2,
found: [stench]
Investigating 1,0,
found: []
Investigating 1,1,
found: [stench]
Investigating 2,0,
found: []
Investigating 2,1,
found: [breeze]
Investigating 3,0,
found: []
Investigating 3,1,
found: []
Investigating 3,2,
found: [breeze]
Pang! You shot at 0,3
Investigating 0,3,
found: [glitter]
Plaats = (0, 3).
wumpus wereld(hoort niet bij het code voorbeeld)