Forum moved to if-forum.org
Autor Nachricht
<  Problem mit 'consult'
der.Grob
BeitragVerfasst am: Fr, 20 Aug 2004 - 12:52  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 19.08.2003
Beiträge: 34
Wohnort: Lev-Town

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

Code:

...
  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?
_________________
http://www.interactive-fiction.de.vu/
http://www.pro-board.de/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kris
BeitragVerfasst am: Fr, 20 Aug 2004 - 16:08  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

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?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
der.Grob
BeitragVerfasst am: Fr, 20 Aug 2004 - 16:35  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 19.08.2003
Beiträge: 34
Wohnort: Lev-Town

Okay, ich hab's. Mit

Code:
Extend 'schau' replace
    * noun 'an'         -> Consult
    * noun       -> Consult;


funktioniert es.
_________________
http://www.interactive-fiction.de.vu/
http://www.pro-board.de/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kris
BeitragVerfasst am: Fr, 20 Aug 2004 - 17:26  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

Bist du sicher?

Genau damit würdest du ja beim "anschauen" automatisch "konsultieren".

Ausserdem nimmst du durch replace jegliche alte Funktion von schau.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
der.Grob
BeitragVerfasst am: Fr, 20 Aug 2004 - 17:45  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 19.08.2003
Beiträge: 34
Wohnort: Lev-Town

Jo, hast recht. Funktioniert nur in Kombination mit

Code:
Extend 'schau' first
    * noun 'an'         -> examine
    * noun       -> examine;


Nicht sehr elegant, oder?! ^^
_________________
http://www.interactive-fiction.de.vu/
http://www.pro-board.de/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kris
BeitragVerfasst am: Fr, 20 Aug 2004 - 18:42  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

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:

Code:

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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Fr, 20 Aug 2004 - 20:48  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

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
Code:

    * 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
Code:

    * 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:

Code:

    '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.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Fr, 20 Aug 2004 - 22:54  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

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

Code:

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

schreibt man einfach Folgendes:
Code:

    * 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:
Code:

[ 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:
Code:

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 hat folgendes geschrieben:
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.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
der.Grob
BeitragVerfasst am: Sa, 21 Aug 2004 - 16:09  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 19.08.2003
Beiträge: 34
Wohnort: Lev-Town

Schonmal vielen Dank für die Mühe, die du dir gemacht hast. Da muss ich mich jetzt erstmal durchkämpfen.
_________________
http://www.interactive-fiction.de.vu/
http://www.pro-board.de/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Sa, 21 Aug 2004 - 16:40  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

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
Code:

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

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

[ 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:

Code:
>i
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.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  Inform & Glulx

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05