IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Problem mit 'consult'
AntwortenNeues ThemaNeue Umfrage

Problem mit 'consult'

Geschrieben um 13:52 am 20.08.2004 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

In meinem Textadventure besitzt die Spielfigur eine Art Taschencomputer ('Compu-Tex'), mit dem diverse Dinge abgefragt werden können. Das ganze sieht so aus:



...

  before [;

   consult:

    switch (second) {

     Tlatex:

          "Elasto-Spezial-Latex ist ein äusserst flexibles Material,

           welches aus dem Milchsaft der Raktarakntrek

           (Wüstenspringmäuse) hergestellt wird. Hingegen

           hartnäckiger Gerüchte ist es NICHT essbar.";

     [...]

     default:

      "Darüber sind keine Informationen verfügbar."; } ],

  has neuter legible;```

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?
Geschrieben um 17:08 am 20.08.2004 | Zitat | Editieren | Löschen
Kris
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
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Okay, ich hab's. Mit



    * noun 'an'         -> Consult

    * noun       -> Consult;```

funktioniert es.
Geschrieben um 18:26 am 20.08.2004 | Zitat | Editieren | Löschen
Kris
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
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Jo, hast recht. Funktioniert nur in Kombination mit



    * noun 'an'         -> examine

    * noun       -> examine;```

Nicht sehr elegant, oder?! ^^
Geschrieben um 19:42 am 20.08.2004 | Zitat | Editieren | Löschen
Kris
Mitglied
Dr Gumby
Beiträge: 181

Hmm...

hörst sich jetzt eher so an als hättest du damit (fast) wieder den Urzustand hergestellt.

Kann es sein dass du das Verb 'schau' etwas durcheinander gebracht hast?

Aus der germang:



Verb 'schau' 'seh' 'l//' 'sieh' 'blick'

                *                                -> Look

                * 'dich'/'mich' 'um'             -> Look

                * 'herum'/'umher'                -> Look

      * noun 'an'          -> Examine

                * noun             -> Examine

                * 'auf'/'durch' noun             -> Examine

                * 'in'/'aus'/'nach'/'neben' noun -> Search

                * 'in'/'auf'/'neben' noun 'nach' -> Search

                * 'in' noun hinein       -> Search

                * xhinein          -> Search

                * 'unter'/'hinter' noun          -> LookUnder

                * 'unter'/'hinter' noun 'nach'   -> LookUnder

                * topic 'nach' 'in' noun         -> Consult

                * 'nach' topic 'in' noun         -> Consult

                * 'in' noun 'ob'/'ueber' topic 'nach' -> Consult

                * 'ueber'/'ob' topic 'in' noun 'nach' -> Consult;```

Im DM4 auf den Seiten 131/132 ist ein gutes Beispiel wie man ohne jegliche Eingriffe in ein Verb mit consult arbeiten kann.
Geschrieben um 21:48 am 20.08.2004 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

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.

Schuld ist das topic-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


    * noun -> Examine

schlägt dann fehl, weil noun nicht erkannt wird. Das ist die Stunde des topic-Tokens, gierig saugt es das fehlerhafte Wort (und alle weiteren Wörter) auf, bis es ans Ende stößt. Die Zeile


    * topic 'nach' 'in' noun -> Consult

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.

Ich vermute, TLatex 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 Frank Borger die "alte", Nelsonsche Topic-Grammatik anhängen, per Default wird sie aber ersetzt. Dann sollte es keine Probleme mehr mit missinterpretierten Topics geben.

Im Englischen funktioniert das 'look' mit fehlerhaftem Objekt nur, weil in jedem Fall dem topic-Token eine Präposition vorangeht:


    'look' * 'up' topic 'in' noun

    'consult' * noun 'about' topic

    'ask'/'tell' *  creature 'about' topic

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.

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 noun 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.

Geschrieben um 23:54 am 20.08.2004 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Okay, hier der dreckige Hack des Tages. Absolut unelegant, aber es funktioniert. Statt:


    * topic 'nach' 'in' noun -> Consult

schreibt man einfach Folgendes:


    * meta_on

      pruefe_auf_nach_und_in

      topic                           -> VagueExamine

    * meta_off

      topic 'nach' pruefe_auf_in_vorher

      ximplizit_nach                  -> Consult

    * topic 'nach'

      pruefe_auf_in_vorher 'in' noun  -> Consult

    * topic 'in' noun 'nach'          -> Consult

    * topic 'in' noun 'nach'          -> Consult

Natürlich mit den Ergänzungen:


[ VagueExamineSub;

    L__M(##Miscellany, 30);

];

[ meta_on;

    meta = true;

    return GPR_PREPOSITION;

];

[ meta_off;

    meta = false;

    return GPR_PREPOSITION;

];

[ pruefe_auf_nach_und_in w n;

    w = wn;

    n = NextWordStopped();

    while (n ~= -1) {

        if (n == 'nach' or 'in') return GPR_FAIL;

        n = NextWordStopped();

    }

    wn = w;

    return GPR_PREPOSITION;

];

[ pruefe_auf_in_vorher ww;

    ww = wn;

    wn = verb_wordnum;

    while (wn < ww) {

        if (NextWord()=='in') return GPR_FAIL;

    }

    return GPR_PREPOSITION;

];

[ ximplizit p x;

    wn--;

    if (NextWordStopped() ~= p) return GPR_FAIL;

    x = PronounValue('spez.');

    if (x && TestScope(x, actor)) return x;

    return GPR_FAIL;

];

[ ximplizit_nach; return ximplizit('nach'); ];

[ ximplizit_in; return ximplizit('in'); ];

Damit sind dann Dialoge möglich wie:


Du siehst hier drei Bälle, acht Bälle, einen Bauern,

ein Buch, einen Almanach und eine Beamtin.

>schau buch

Du entdeckst an dem Buch nichts Spezielles.

Der Wind heult scharf.

>schau uzht

Du kannst nichts dergleichen sehen.

>schau trfa nach

Du findest nichts über 'trfa' in dem Buch.

Von irgendwoher weht eine leise Melodie.

>schau trfa nach im almanach

Du findest nichts über 'trfa' in dem Almanach.

Raubvögel schreien in der Ferne.

>schau trfa im buch nach

Du findest nichts über 'trfa' in dem Buch.

Der Wind heult scharf.

>schau nach

Du wolltest vermutlich folgendes: "schaue in..."

- aber was, wie, womit?

Durch das Setzen von meta wird verhindert, dass VagueExamine als gelungene Eingabe gewertet wird, der each_turn-Satz erscheint nicht. Mit ximplizit werden die Sätze, bei denen das Nachschlagewerk impliziert wird, vorher von Hand abgefangen. Mit den pruefe_auf-Routinen wird gecheckt, dass im Topic nicht schon ein 'in' oder 'nach' steht.

Das bedeutet natürlich, dass Topics nie 'in' oder 'nach' enthalten dürfen, Workarounds mit parse_name 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.

Graham Nelson:

The Inform parser has two cardinal principles: firstly, it is designed to be as "open-access" as possible...

Ä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.

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.)

Ach ja: mit "trace on/off" beziehungsweise "trace trace level (1-4)" 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.

Geschrieben um 17:09 am 21.08.2004 | Zitat | Editieren | Löschen
der.Grob
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
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Okay, neue Idee, diesmal etwas kürzer. Um Eingaben wie "schau Eimer" nicht als Consult misszuinterpretieren, fügt man bei den Consult-Topics die Routine force_nach ein. Diese lässt das gesamte Satzmuster fehlschlagen, wenn das Wort 'nach' nicht auftaucht, ohne den Wortzähler weiterzubewegen. Eine zweite Routine, force_nach_in, verlangt, dass im Topic vor 'nach' kein 'in' vorkommt. Damit schlägt bei der Eingabe 'schau Bosonen im Handbuch der Sternenflotte nach' das Satzmuster


 * force_nach_in

   topic 'nach' 'in' noun         -> Consult

fehl, die Analyse wird an folgende Satzmuster weitergeleitet, die dann die Eingabe korrekt verarbeiten können.


[ force mandatory fail w n;

! Erzwingt das erste Wort, schlägt aber fehl,

! wenn das zweite Wort vorher kommt

    w = wn;

    if (fail == 0) fail = -1;

    wn = verb_wordnum + 1;

    n = NextWordStopped();

    while (n ~= -1) {

        if (n == fail) return GPR_FAIL;

        if (n == mandatory) {

            wn = w;

            return GPR_PREPOSITION;

        }

        n = NextWordStopped();

    }

    return GPR_FAIL;

];

[ force_nach; return force('nach'); ];

[ force_nach_in; return force('nach', 'in'); ];

Verb 'schau' 'seh' 'l//' 'sieh' 'blick'

                *                                -> Look

                * 'dich'/'mich' 'um'             -> Look

                * 'herum'/'umher'                -> Look

                * noun 'an'                      -> Examine

                * noun                           -> Examine

                * 'auf'/'durch' noun             -> Examine

                * 'in'/'aus'/'nach'/'neben' noun -> Search

                * 'in'/'auf'/'neben' noun 'nach' -> Search

                * 'in' noun hinein               -> Search

                * xhinein                        -> Search

                * 'unter'/'hinter' noun          -> LookUnder

                * 'unter'/'hinter' noun 'nach'   -> LookUnder

                * force_nach_in

                  topic 'nach' 'in' noun         -> Consult

                * 'nach' topic 'in' noun         -> Consult

                * force_nach 'in' noun

                  'ob'/'ueber' topic 'nach'      -> Consult

                * force_nach 'ueber'/'ob'

                  topic 'in' noun 'nach'         -> Consult

                * force_nach

                  topic 'in' noun 'nach'         -> Consult;                                        -> Search;

Verb 'lies' 'les'

                * noun                           -> Examine

                * multi 'auf'                         -> Take

                * 'in' noun                         -> Examine

                * force_in

                  'ueber'/'von' topic 'in' noun  -> Consult

                * force_nach_in

                  'ueber'/'von' topic 'nach' 'in' noun -> Consult

                * force_nach_in

                  topic 'nach' 'in' noun        -> Consult

                * force_nach

                  'ueber'/'von' topic 'in' noun 'nach' -> Consult

                * force_nach

                  topic 'in' noun 'nach'        -> Consult

                * force_in

                  topic 'in' noun                -> Consult

                * force_in

                  'in' noun 'ueber'/'von' topic  -> Consult;

Verb 'schlag' 'hau'

                * creature                                -> Attack

                * xhinein                                -> Attack

                * noun                                        -> Attack

                * 'auf'        noun                                -> Attack

                * xdarauf                               -> Attack

                * noun 'auf'                                -> Open

                * noun 'zu'                                -> Close

                * force_nach

                  'in' noun 'ueber' topic 'nach'         -> Consult

                * force_nach

                  'in' noun topic 'nach'                 -> Consult

                * 'mit' held 'gegen' noun                -> Attack reverse

                * held 'gegen' noun                        -> Attack reverse

                * noun 'um'/'ab'/'entzwei'/'kaputt'        -> Attack

                * force_nach_in

                  topic 'nach' 'in' noun                 -> Consult

                * force_nach

                  topic 'in' noun 'nach'                 -> Consult

                * xdamit 'gegen' noun                           -> Attack reverse;

Analog für 'schlag' natürlich. Und wieder ein Beispieldialog:


Du trägst:

  einen Almanach

  ein Buch

>schaue Dionysos

Du kannst nichts dergleichen sehen.

>schaue Dionysos nach

(in den Almanach)

Du findest nichts über 'dionysos' in dem Almanach.

>schaue Dionysos nach im buch

Du findest nichts über 'dionysos' in dem Buch.

>schaue Schimäre im Almanach nach

Du findest nichts über 'schimaere' in dem Almanach.

>schaue über Schimäre nach

(in den Almanach)

Du findest nichts über 'ueber' in dem Almanach.

>lies kleist

Du kannst nichts dergleichen sehen.

>lies kleist nach

(in den Almanach)

Du findest nichts über 'kleist' in dem Almanach.

>schlage ein rad

Du kannst nichts dergleichen sehen.

>schlage ein rad nach

(in den Almanach)

Du findest nichts über 'ein' in dem Almanach.

Der Almanach wird aufgrund seiner Bevorzugung in ChooseObjects impliziert, ich war den "Deine Antwort"-Prompt leid. Das schint ja einigermaßen zu funktionieren und ist auch nicht so viel Aufwand. Die force-Routine kann an andere Präpositionen angepasst werden, ich habe aber keine weiteren kritischen topic-Tokens gefunden.

Eine aktualisierte Version von GermanG.h habe ich auf meine Seite hochgeladen.

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz