| Geschrieben um 13:52 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Student Gumby Beiträge: 31 | <td valign="top"><div class="post"><p>In meinem Textadventure besitzt die Spielfigur eine Art Taschencomputer (‘Compu-Tex’), mit dem diverse Dinge abgefragt werden können. Das ganze sieht so aus:</p> <p>“`</p> <p>…</p> <p> before [;</p> <p> consult:</p> <p> switch (second) {</p> <p> Tlatex:</p> <p> “Elasto-Spezial-Latex ist ein äusserst flexibles Material,</p> <p> welches aus dem Milchsaft der Raktarakntrek</p> <p> (Wüstenspringmäuse) hergestellt wird. Hingegen</p> <p> hartnäckiger Gerüchte ist es NICHT essbar.”;</p> <p> […]</p> <p> default:</p> <p> “Darüber sind keine Informationen verfügbar.”; } ],</p> <p> has neuter legible;“`</p> <p>Das Problem besteht nun darin, dass immer wenn man z.B >schau xyz eingibt (um einen Gegenstand zu untersuchen/sich anzusehen), als Antwort ‘(nach in Compu-Tex) Darüber sind keine Informationen verfügbar.’ erscheint. Bei ‘schau xyz’ müsste doch eigentlich ‘examine’ ausgeführt werden - oder wo liegt da mein Denkfehler?</p> </div></td> |
| Geschrieben um 17:08 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Dr Gumby Beiträge: 181 | Ich vermute mal dass der Fehler in der Extend-Anweisung liegen könnte. Wenn du mit *legible *arbeitest, wie hast du denn dann die Verben erweitert? |
| Geschrieben um 17:35 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Student Gumby Beiträge: 31 | <td valign="top"><div class="post"><p>Okay, ich hab’s. Mit</p> <p>“`Extend ‘schau’ replace</p> <p> * noun ‘an’ -> Consult</p> <p> * noun -> Consult;“`</p> <p>funktioniert es.</p> </div></td> |
| Geschrieben um 18:26 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Dr Gumby Beiträge: 181 | Bist du sicher? Genau damit würdest du ja beim “anschauen” automatisch “konsultieren”. Ausserdem nimmst du durch replace jegliche alte Funktion von schau. |
| Geschrieben um 18:45 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Student Gumby Beiträge: 31 | <td valign="top"><div class="post"><p>Jo, hast recht. Funktioniert nur in Kombination mit</p> <p>“`Extend ‘schau’ first</p> <p> * noun ‘an’ -> examine</p> <p> * noun -> examine;“`</p> <p>Nicht sehr elegant, oder?! ^^</p> </div></td> |
| Geschrieben um 19:42 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Dr Gumby Beiträge: 181 | <td valign="top"><div class="post"><p>Hmm…</p> <p>hörst sich jetzt eher so an als hättest du damit (fast) wieder den Urzustand hergestellt.</p> <p>Kann es sein dass du das Verb ‘schau’ etwas durcheinander gebracht hast?</p> <p>Aus der germang:</p> <p>“`</p> <p>Verb ‘schau’ ‘seh’ ‘l//’ ‘sieh’ ‘blick’</p> <p> * -> Look</p> <p> * ‘dich’/’mich’ ‘um’ -> Look</p> <p> * ‘herum’/’umher’ -> Look</p> <p> * noun ‘an’ -> Examine</p> <p> * noun -> Examine</p> <p> * ‘auf’/’durch’ noun -> Examine</p> <p> * ‘in’/’aus’/’nach’/’neben’ noun -> Search</p> <p> * ‘in’/’auf’/’neben’ noun ‘nach’ -> Search</p> <p> * ‘in’ noun hinein -> Search</p> <p> * xhinein -> Search</p> <p> * ‘unter’/’hinter’ noun -> LookUnder</p> <p> * ‘unter’/’hinter’ noun ‘nach’ -> LookUnder</p> <p> * topic ‘nach’ ‘in’ noun -> Consult</p> <p> * ‘nach’ topic ‘in’ noun -> Consult</p> <p> * ‘in’ noun ‘ob’/’ueber’ topic ‘nach’ -> Consult</p> <p> * ‘ueber’/’ob’ topic ‘in’ noun ‘nach’ -> Consult;“`</p> <p>Im DM4 auf den Seiten 131/132 ist ein gutes Beispiel wie man ohne jegliche Eingriffe in ein Verb mit consult arbeiten kann.</p> </div></td> |
| Geschrieben um 21:48 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Retired Gumby Beiträge: 702 | <td valign="top"><div class="post"><p>Das Problem hat nichts damit zu tun, dass du ein Nachschlagewerk definiert hast, es tritt bei allen deutschen Inform-Spielen auf und sorgt öfters für Ärger.</p> <p>Schuld ist das <strong>topic</strong>-Token, das in Graham Nelsons Originalfassung jede beliebige Folge von Wörtern bis zum Ende oder bis zu einem Stoppwort, in unserem Fall ‘nach’, zulässt. Die Fehlermeldung kommt dann, wenn nach ‘sieh’ kein gültiges Objekt kommt: Die Zeile</p> <p>“`</p> <p> * noun -> Examine</p> <p>“`</p> <p>schlägt dann fehl, weil <strong>noun</strong> nicht erkannt wird. Das ist die Stunde des <strong>topic</strong>-Tokens, gierig saugt es das fehlerhafte Wort (und alle weiteren Wörter) auf, bis es ans Ende stößt. Die Zeile</p> <p>“`</p> <p> * topic ‘nach’ ‘in’ noun -> Consult</p> <p>“`</p> <p>bleibt zwar größtenteils ungeparst, aber hier dann eine Fähigkeit des Inform-Parsers zum Zuge, die eigentlich gut, in diesem Falle aber nicht erwünscht ist: Fehlende Tokens können impliziert werden, und das geht auch, wenn eine Präposition vorangeht, schließlich sind die zweiten Objekte, die man gerne weglässt ja indirekte Objekte. Wie wir sehen, geht das sogar, wenn mehrere Präpositionen vorangehen, vermutlich weil Präpositionen im Sinne von Inform nicht immer Präpositionen im grammatischen Sinne sein müssen. Das Nachschalgewerk wird in deinem Fall nur implizit angenommen, weil es das einzige sichtbare Objekt ist, das nicht scenery ist, meistens kommt die unselige “…aber was, wie, womit?”-Meldung.</p> <p>Ich vermute, <strong>TLatex</strong> ist nur ein Topic-Hilfsobjekt, du verwendest GInfo.h, richtig? In diesem Falle solltest du überlegen, ob du beliebige Eingaben zulassen möchtest oder nicht. Mit einer Konstante kann man in GInfo.h von <a href="http://if.frob.de">Frank Borger</a> die “alte”, Nelsonsche Topic-Grammatik anhängen, per Default wird sie aber ersetzt. Dann sollte es keine Probleme mehr mit missinterpretierten Topics geben.</p> <p>Im Englischen funktioniert das ‘look’ mit fehlerhaftem Objekt nur, weil in jedem Fall dem <strong>topic</strong>-Token eine Präposition vorangeht:</p> <p>“`</p> <p> ‘look’ * ‘up’ topic ‘in’ noun</p> <p> ‘consult’ * noun ‘about’ topic</p> <p> ‘ask’/’tell’ * creature ‘about’ topic</p> <p>“`</p> <p>Wenn man sagen könnte “look figure 1.b up in textbook” gäbe es hier auch Probleme. Und natürlich bei Objekten, die ‘up’ im Namen haben.</p> <p>Dumm auch, dass das ‘nach’, das ja eigentlich von ‘nachschauen’ abgetrennt ist, nicht als zum Verb gehörig erkannt wird. (Eine Verbklammer wird nur dann als solche erkannt, wenn kein weiteres “Ergebnis-Token”, wie halt <strong>noun</strong> folgt.) Mein erster Gedanke, das ‘nach’ in der Lib durch eine Routine zu ersetzen und so - womöglich - sein Vorhandensein zu erzwingen, ist leider fehlgeschlagen.</p> </div></td> |
| Geschrieben um 23:54 am 20.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Retired Gumby Beiträge: 702 | <td valign="top"><div class="post"><p>Okay, hier der dreckige Hack des Tages. Absolut unelegant, aber es funktioniert. Statt:</p> <p>“`</p> <p> * topic ‘nach’ ‘in’ noun -> Consult</p> <p>“`</p> <p>schreibt man einfach Folgendes:</p> <p>“`</p> <p> * meta_on</p> <p> pruefe<em>auf</em>nach<em>und</em>in</p> <p> topic -> VagueExamine</p> <p> * meta_off</p> <p> topic ‘nach’ pruefe<em>auf</em>in_vorher</p> <p> ximplizit_nach -> Consult</p> <p> * topic ‘nach’</p> <p> pruefe<em>auf</em>in_vorher ‘in’ noun -> Consult</p> <p> * topic ‘in’ noun ‘nach’ -> Consult</p> <p> * topic ‘in’ noun ‘nach’ -> Consult</p> <p>“`</p> <p>Natürlich mit den Ergänzungen:</p> <p>“`</p> <p>[ VagueExamineSub;</p> <p> L__M(##Miscellany, 30);</p> <p>];</p> <p>[ meta_on;</p> <p> meta = true;</p> <p> return GPR_PREPOSITION;</p> <p>];</p> <p>[ meta_off;</p> <p> meta = false;</p> <p> return GPR_PREPOSITION;</p> <p>];</p> <p>[ pruefe<em>auf</em>nach<em>und</em>in w n;</p> <p> w = wn;</p> <p> n = NextWordStopped();</p> <p> while (n ~= -1) {</p> <p> if (n == ‘nach’ or ‘in’) return GPR_FAIL;</p> <p> n = NextWordStopped();</p> <p> }</p> <p> wn = w;</p> <p> return GPR_PREPOSITION;</p> <p>];</p> <p>[ pruefe<em>auf</em>in_vorher ww;</p> <p> ww = wn;</p> <p> wn = verb_wordnum;</p> <p> while (wn < ww) {</p> <p> if (NextWord()==’in’) return GPR_FAIL;</p> <p> }</p> <p> return GPR_PREPOSITION;</p> <p>];</p> <p>[ ximplizit p x;</p> <p> wn—;</p> <p> if (NextWordStopped() ~= p) return GPR_FAIL;</p> <p> x = PronounValue(’spez.’);</p> <p> if (x && TestScope(x, actor)) return x;</p> <p> return GPR_FAIL;</p> <p>];</p> <p>[ ximplizit_nach; return ximplizit(’nach’); ];</p> <p>[ ximplizit_in; return ximplizit(’in’); ];</p> <p>“`</p> <p>Damit sind dann Dialoge möglich wie:</p> <p>“`</p> <p>Du siehst hier drei Bälle, acht Bälle, einen Bauern,</p> <p>ein Buch, einen Almanach und eine Beamtin.</p> <blockquote> <p>schau buch</p> </blockquote> <p>Du entdeckst an dem Buch nichts Spezielles.</p> <p>Der Wind heult scharf.</p> <blockquote> <p>schau uzht</p> </blockquote> <p>Du kannst nichts dergleichen sehen.</p> <blockquote> <p>schau trfa nach</p> </blockquote> <p>Du findest nichts über ‘trfa’ in dem Buch.</p> <p>Von irgendwoher weht eine leise Melodie.</p> <blockquote> <p>schau trfa nach im almanach</p> </blockquote> <p>Du findest nichts über ‘trfa’ in dem Almanach.</p> <p>Raubvögel schreien in der Ferne.</p> <blockquote> <p>schau trfa im buch nach</p> </blockquote> <p>Du findest nichts über ‘trfa’ in dem Buch.</p> <p>Der Wind heult scharf.</p> <blockquote> <p>schau nach</p> </blockquote> <p>Du wolltest vermutlich folgendes: “schaue in…”</p> <ul> <li>aber was, wie, womit?</li> </ul> <p>“`</p> <p>Durch das Setzen von <strong>meta</strong> wird verhindert, dass <strong>VagueExamine</strong> als gelungene Eingabe gewertet wird, der each_turn-Satz erscheint nicht. Mit <strong>ximplizit</strong> werden die Sätze, bei denen das Nachschlagewerk impliziert wird, vorher von Hand abgefangen. Mit den <strong>pruefe_auf</strong>-Routinen wird gecheckt, dass im Topic nicht schon ein ‘in’ oder ‘nach’ steht.</p> <p>Das bedeutet natürlich, dass Topics nie ‘in’ oder ‘nach’ enthalten dürfen, Workarounds mit <strong>parse_name</strong> greifen bei Topics ja nicht. “Schaue Hühnerleber in Weißweinsoße im Rezeptbuch nach” oder “schaue im Atlas die Straße nach Tipperary nach” fallen also aus.</p> <p><strong>Graham Nelson:</strong></p> <blockquote> <p>The Inform parser has two cardinal principles: firstly, it is designed to be as “open-access” as possible…</p> </blockquote> <p>Äh, ja. Das alles ist ein ganz schönes Gefrickel und war wohl auch mehr eine Feierabend-Denksportaufgabe für mich als ein sinnvoller Beitrag zur Lib. Wahrscheinlich müsste man das Topic-Token einmal überarbeiten - oder GInfo als Standard in der Lib verwenden.</p> <p>Wahrscheinlich gibt es nämlich noch viele Fehler im Code, nicht abgefangene Fälle, Fälle, in denen das Nachschlagewerk als Teil des Topics gewertet wird, und so weiter. Schon das bloße “schau nach” bringt uns schon wieder unseren alten Bekannten, den “Deine Antwort”-Prompt. (Ich antworte da immer mit “nein”.) Und “schlage nach” funktioniert auch noch nicht. (“This is left as an exercise to the reader”, oder wie heißt’s immer so schön.)</p> <p>Ach ja: mit “trace on/off” beziehungsweise “trace <em>trace level (1-4)</em>” kann man sich die Arbeit des Parsers anschauen. Bereits in Level 1 zeigt er einem, für welche Zeile aus der Verb-Definition er sich entschieden hat.</p> </div></td> |
| Geschrieben um 17:09 am 21.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Student Gumby Beiträge: 31 | Schonmal vielen Dank für die Mühe, die du dir gemacht hast. Da muss ich mich jetzt erstmal durchkämpfen. |
| Geschrieben um 17:40 am 21.08.2004 | Zitat | Editieren | Löschen | |
Mitglied Retired Gumby Beiträge: 702 | <td valign="top"><div class="post"><p>Okay, neue Idee, diesmal etwas kürzer. Um Eingaben wie “schau Eimer” nicht als <strong>Consult</strong> misszuinterpretieren, fügt man bei den Consult-Topics die Routine <strong>force_nach</strong> ein. Diese lässt das gesamte Satzmuster fehlschlagen, wenn das Wort ‘nach’ nicht auftaucht, ohne den Wortzähler weiterzubewegen. Eine zweite Routine, <strong>force<em>nach</em>in</strong>, verlangt, dass im Topic vor ‘nach’ kein ‘in’ vorkommt. Damit schlägt bei der Eingabe ‘schau Bosonen im Handbuch der Sternenflotte nach’ das Satzmuster</p> <p>“`</p> <p> * force<em>nach</em>in</p> <p> topic ‘nach’ ‘in’ noun -> Consult</p> <p>“`</p> <p>fehl, die Analyse wird an folgende Satzmuster weitergeleitet, die dann die Eingabe korrekt verarbeiten können.</p> <p>“`</p> <p>[ force mandatory fail w n;</p> <p>! Erzwingt das erste Wort, schlägt aber fehl,</p> <p>! wenn das zweite Wort vorher kommt</p> <p> w = wn;</p> <p> if (fail == 0) fail = -1;</p> <p> wn = verb_wordnum + 1;</p> <p> n = NextWordStopped();</p> <p> while (n ~= -1) {</p> <p> if (n == fail) return GPR_FAIL;</p> <p> if (n == mandatory) {</p> <p> wn = w;</p> <p> return GPR_PREPOSITION;</p> <p> }</p> <p> n = NextWordStopped();</p> <p> }</p> <p> return GPR_FAIL;</p> <p>];</p> <p>[ force_nach; return force(’nach’); ];</p> <p>[ force<em>nach</em>in; return force(’nach’, ‘in’); ];</p> <p>Verb ‘schau’ ‘seh’ ‘l//’ ‘sieh’ ‘blick’</p> <p> * -> Look</p> <p> * ‘dich’/’mich’ ‘um’ -> Look</p> <p> * ‘herum’/’umher’ -> Look</p> <p> * noun ‘an’ -> Examine</p> <p> * noun -> Examine</p> <p> * ‘auf’/’durch’ noun -> Examine</p> <p> * ‘in’/’aus’/’nach’/’neben’ noun -> Search</p> <p> * ‘in’/’auf’/’neben’ noun ‘nach’ -> Search</p> <p> * ‘in’ noun hinein -> Search</p> <p> * xhinein -> Search</p> <p> * ‘unter’/’hinter’ noun -> LookUnder</p> <p> * ‘unter’/’hinter’ noun ‘nach’ -> LookUnder</p> <p> * force<em>nach</em>in</p> <p> topic ‘nach’ ‘in’ noun -> Consult</p> <p> * ‘nach’ topic ‘in’ noun -> Consult</p> <p> * force_nach ‘in’ noun</p> <p> ‘ob’/’ueber’ topic ‘nach’ -> Consult</p> <p> * force_nach ‘ueber’/’ob’</p> <p> topic ‘in’ noun ‘nach’ -> Consult</p> <p> * force_nach</p> <p> topic ‘in’ noun ‘nach’ -> Consult; -> Search;</p> <p>Verb ‘lies’ ‘les’</p> <p> * noun -> Examine</p> <p> * multi ‘auf’ -> Take</p> <p> * ‘in’ noun -> Examine</p> <p> * force_in</p> <p> ‘ueber’/’von’ topic ‘in’ noun -> Consult</p> <p> * force<em>nach</em>in</p> <p> ‘ueber’/’von’ topic ‘nach’ ‘in’ noun -> Consult</p> <p> * force<em>nach</em>in</p> <p> topic ‘nach’ ‘in’ noun -> Consult</p> <p> * force_nach</p> <p> ‘ueber’/’von’ topic ‘in’ noun ‘nach’ -> Consult</p> <p> * force_nach</p> <p> topic ‘in’ noun ‘nach’ -> Consult</p> <p> * force_in</p> <p> topic ‘in’ noun -> Consult</p> <p> * force_in</p> <p> ‘in’ noun ‘ueber’/’von’ topic -> Consult;</p> <p>Verb ‘schlag’ ‘hau’</p> <p> * creature -> Attack</p> <p> * xhinein -> Attack</p> <p> * noun -> Attack</p> <p> * ‘auf’ noun -> Attack</p> <p> * xdarauf -> Attack</p> <p> * noun ‘auf’ -> Open</p> <p> * noun ‘zu’ -> Close</p> <p> * force_nach</p> <p> ‘in’ noun ‘ueber’ topic ‘nach’ -> Consult</p> <p> * force_nach</p> <p> ‘in’ noun topic ‘nach’ -> Consult</p> <p> * ‘mit’ held ‘gegen’ noun -> Attack reverse</p> <p> * held ‘gegen’ noun -> Attack reverse</p> <p> * noun ‘um’/’ab’/’entzwei’/’kaputt’ -> Attack</p> <p> * force<em>nach</em>in</p> <p> topic ‘nach’ ‘in’ noun -> Consult</p> <p> * force_nach</p> <p> topic ‘in’ noun ‘nach’ -> Consult</p> <p> * xdamit ‘gegen’ noun -> Attack reverse;</p> <p>“`</p> <p>Analog für ‘schlag’ natürlich. Und wieder ein Beispieldialog:</p> <p>“`>i</p> <p>Du trägst:</p> <p> einen Almanach</p> <p> ein Buch</p> <blockquote> <p>schaue Dionysos</p> </blockquote> <p>Du kannst nichts dergleichen sehen.</p> <blockquote> <p>schaue Dionysos nach</p> </blockquote> <p>(in den Almanach)</p> <p>Du findest nichts über ‘dionysos’ in dem Almanach.</p> <blockquote> <p>schaue Dionysos nach im buch</p> </blockquote> <p>Du findest nichts über ‘dionysos’ in dem Buch.</p> <blockquote> <p>schaue Schimäre im Almanach nach</p> </blockquote> <p>Du findest nichts über ‘schimaere’ in dem Almanach.</p> <blockquote> <p>schaue über Schimäre nach</p> </blockquote> <p>(in den Almanach)</p> <p>Du findest nichts über ‘ueber’ in dem Almanach.</p> <blockquote> <p>lies kleist</p> </blockquote> <p>Du kannst nichts dergleichen sehen.</p> <blockquote> <p>lies kleist nach</p> </blockquote> <p>(in den Almanach)</p> <p>Du findest nichts über ‘kleist’ in dem Almanach.</p> <blockquote> <p>schlage ein rad</p> </blockquote> <p>Du kannst nichts dergleichen sehen.</p> <blockquote> <p>schlage ein rad nach</p> </blockquote> <p>(in den Almanach)</p> <p>Du findest nichts über ‘ein’ in dem Almanach.</p> <p>“`</p> <p>Der Almanach wird aufgrund seiner Bevorzugung in <strong>ChooseObjects</strong> impliziert, ich war den “Deine Antwort”-Prompt leid. Das schint ja einigermaßen zu funktionieren und ist auch nicht so viel Aufwand. Die <strong>force</strong>-Routine kann an andere Präpositionen angepasst werden, ich habe aber keine weiteren kritischen topic-Tokens gefunden.</p> <p>Eine <a href="http://www.martin-oehm.de/adv/GermanG.h">aktualisierte Version von GermanG.h</a> habe ich auf meine Seite hochgeladen.</p> </div></td> |