Die Wumpus-Welt entstammt einem Text-Adventure aus den 70'er Jahren. Sie
besteht aus einem rechteckigen Raster, das von einer undurchdringlichen Mauer
umgeben ist. Oben ist Norden, unten ist Süden, links ist Westen, rechts
ist Osten.
Unser Held - der Agent - startet immer im äussersten Süd-Westen,
also unten links auf dem Feld [1,1]. Hierher muss er auch zurückkehren um
die Welt zu verlassen.
Der Agent kann sich immer nur um ein Feld in waagerechter oder senkrechter
Richtung bewegen. Er nimmt immer nur die Attribute des Feldes wahr, auf dem er
sich gerade befindet, verfügt aber über ein gutes Gedächtniss
um sich alle zuvor besuchten Felder - und deren Attribute - zu merken.
Das Ziel des Agenten ist es das Gold, das irgenwo in der Wumpus-Welt herum
liegt, einzusammeln, und mit ihm die Welt zu verlassen. Das Gold ist nur auf
dem Feld wahrzunehmen, auf dem es sich befindet.
Wie in der wirklichen Welt auch, ist das Einsammeln von Gold mit Gefahren
verbunden, die das Leben des Agenten kosten können.
Eine grosse Gefahr ist der Wumpus. Er ist ein übelriechender Zeitgenosse,
der irgendwo auf einem Feld steht. Auf diesem Feld bleibt er bis zum Ende des
Spieles stehen. Betritt der Agent das Feld, auf dem sich der Wumpus befindet,
und ist dieser noch am Leben, so wird der Agent vom Wumpus verspeisst, ein
Entkommen ist unmöglich. Allerdings ist der Gestank des Wumpus so stark,
dass er in den waagerecht und senkrecht an das durch den Wumpus besetzten
Feldes wahrzunehmen ist.
Als Verteidigung gegen den Wumpus hat der Agent Pfeil und Bogen. Der Pfeil
wird in die Richtung abgeschossen, in die der Agent schaut. Der Pfeil fliegt
solange, bis er den Wumpus oder eine Mauer trifft. Wird der Wumpus durch den
Pfeil getroffen, stirbt der Wumpus, und ist keine Gefahr mehr für den
Agenten, nur noch für dessen Nase...
Eine weitere für den Agenten tödliche Gefahr, sind die endlosen
Löcher. Diese Löcher sind so tief, dass sie in den waagerecht und
senkrecht an sie angrenzenden Felder einen wahrnehmbaren Luftzug verursachen.
Beispiel einer Wumpus-Welt
Im ersten Ansatz wird eine Grammatik erstellt, mit deren Hilfe alle
möglichen Aktionen und Zustände, die in der Wumpus-Welt möglich
sind, ausgedrückt werden können.
s --> np,vp. % the wumpus + is dead np --> (article,noun); % the + wumpus (pronoun). % i vp --> verb; % go verb,(adverb; % go + back adjective; % is + dead pp; % go + to the north np). % shoot + the arrow pp --> preposition,article,noun. % to + the + north % load knowledgebase :- consult('knowledgebase_0.pl').
Bislang waren auch Sätze wie "i goes north" möglich, eine
Unterscheidung nach unterschiedlichen Personen fand nicht statt. Dieses wird
nun durch die Zuordnung von der Person eingeführt.
Zusätzlich werden von nun an Sätze, die die erste Person als Objekt
haben, nicht mehr zu gelassen.
s --> np(Person),vp(Person). np(1) --> pronoun(1). np(3) --> pronoun(3); (article,noun). vp(Person) --> verb(Person); verb(Person),(adverb; adjective; pp; np(3)). pp --> preposition,article,noun. % load knowledgebase :- consult('knowledgebase_1.pl').
In diesem Schritt wird die vorhergehende Grammatik dahingehend verfeinert,
dass von nun an Pronomen in Nomen-Phrasen (np) entsprechend ihrem
Auftreten als Subjekt oder Objekt unterschieden werden.
s --> np(subjective,Person),vp(Person). np(Case,1) --> pronoun(Case,1). np(Case,3) --> pronoun(Case,3); (article,noun). vp(Person) --> verb(Person); verb(Person),(adverb; adjective; pp; np(objective,3)). pp --> preposition,article,noun. % load knowledgebase :- consult('knowledgebase_2.pl').
Da die bisherigen Grammatiken nur bedingt der Grammatik der englischen Sprache
entsprachen (Sätze wie "i shoot me" - sinnlos, aber trotzdem
syntaktisch und semantisch korrekt - wurden nicht zugelassen), wurde die
Grammatik entsprechend angepasst.
s --> np(Person,nominative),vp(Person). np(Person,Case) --> pronoun(Person,Case). np(3,_) --> article,noun. vp(Person) --> verb(Person); verb(Person),(adverb; adjective; pp; np(_,accusative)). pp --> preposition,article,noun. % load knowledgebase :- consult('knowledgebase_3.pl').
Bislang wurde nur die Syntax geprüft. In der folgenden Grammatik wird der
Parsetree als Semantik ausgegeben. Dieses ist vor allem beim Debuggen von
Nutzen.
s(s(NP,VP)) --> np(Person,nominative,NP),vp(Person,VP). np(Person,Case,np(Pronoun)) --> pronoun(Person,Case,Pronoun). np(3,_,np(Article,Noun)) --> article(Article),noun(Noun). vp(Person,vp(Verb)) --> verb(Person,Verb). vp(Person,vp(Verb,Adverb)) --> verb(Person,Verb),adverb(Adverb). vp(Person,vp(Verb,Adjective)) --> verb(Person,Verb),adjective(Adjective). vp(Person,vp(Verb,PP)) --> verb(Person,Verb),pp(PP). vp(Person,vp(Verb,NP)) --> verb(Person,Verb),np(_,accusative,NP). pp(pp(Preposition,Article,Noun)) --> preposition(Preposition), article(Article), noun(Noun). % load knowledgebase :- consult('knowledgebase_4.pl').
In der letzten, nun folgenden Grammatik, werden zwei Variablen - Actor und
Action - genutzt, um Semantik auszugeben. Aus den Werten der Variablen lassen
sich - bislang allerdings nur gedanklich - Funtionsaufrufe generieren, mit
denen der Agent in der Wumpus-Welt gesteuert werden kann.
s(Actor,Action) --> np(Person,nominative,Actor),vp(Person,Action). np(Person,Case,Actor) --> pronoun(Person,Case,Actor). np(3,_,Actor) --> article,noun(Actor). vp(Person,Action) --> verb(Person,Action,Param),(adverb(Param); adjective(Param); pp(Param); np(_,accusative,Param)). pp(Param) --> preposition,article,noun(Param). % load knowledgebase :- consult('knowledgebase_5.pl').