CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 17 Oct 2019 02:29

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 10 mensajes ] 
Autor Mensaje
NotaPublicado: 16 Nov 2011 19:01 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
A ver si alguien sería tan amable de hacerme entender por que no funciona esto...

Código:
Object oCeldaNosaurianos "celda de los nosaurianos" CeldasO4
with
  !name 'celda' 'hueco',
     parse_name [n w w2 w3 w4;
      n=0;
      w=nextWord();
--- CASO 1 ---
           if (w=='celda' or 'hueco' or 'reja') n++;
      if (n>0) {
         w2=nextWord();
         w3=nextWord();
         w4=nextWord();
         if (w2=='de') {
           if (w3=='los' && (w4=='nosaurianos' or 'esclavos')) n=n+3;
           if (w3=='nosaurianos' or 'esclavos') n=n+2;
          }
          if (w2=='nosaurianos' or 'esclavos') n=n+1;
      }
--- FIN CASO 1 ---
--- CASO 2 ---
!        while ((w=='celda' or 'hueco' or 'reja' or 'nosaurian' or 'esclavos')) {
!          if (w=='celda' or 'hueco' or 'reja') n++;
!          if (w=='nosaurian' or 'esclavos') n++;
!          !if (w=='de' or 'los') n=n;
!          w=nextWord();
!          while (w=='de' or 'los') w=nextWord();
!        }
--- FIN CASO 2 ---
print "--",n,"--";
       return n;
     ],
;


Tal como está funciona, obviamente, ya que es el código de la caja de cerillas de jarel (CASO 1)...
Código:
>> ex celda
--1--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex hueco
--1--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex reja
--1--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex celda de
--1--Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>> ex celda de nosaurianos
--3--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex celda de los esclavos
--4--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex celda nosaurianos
--2--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.


Si comento el CASO 1 y descomento el CASO 2 pasa lo siguiente:

Código:
>> ex celda
--1--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex reja
--1--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex hueco
--1--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex celda de
--1--Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>> ex celda de los nosaurianos
--2--Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>> ex celda nosaurianos
--2--Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

>> ex celda los esclavos
--2--Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.


Cuando añado el "de" o el "los", aunque el código los obvia y el parse_noun me devuelve el valor 2, exactamente igual que "ex celda nosaurianos", el parser no entiende la orden...

Informáticamente, me gusta mucho más el código que no funciona, ya que me podría llegar a evaluar expresiones más complejas y no estar encorsetado al orden de las palabras...
Llevo toda la tarde para encontrarle una explicación y no la encuentro... :evil: :evil: :evil:

Gracias

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 04:38 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
En el segundo código tienes 'nosaurian' en lugar de 'nosaurianos' [en Z el limite es de 9 caracteres, pero en Glulx es mayor]. Intenta con eso primero. Además, en el primer código puntúas el "los/de", y en el segundo no.

Eso, a vistazo rápido. Cámbialos y prueba qué tal. :)

Saludos!

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 08:27 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Si, es que hice mogollón de pruebas y toqué lo de 'nosaurian', pero con 'nosaurianos' pasa lo mismo. Realmente no quiero puntuar 'de' y 'los' para que "ex celda nosaurianos" y "ex celda de los nosaurianos" me puntuen lo mismo.

De hecho me puntuan igual, ambas 2 órdenes me devuelven lo mismo, 2 puntos, pero la primera funciona y la segunda me dice que lo intente de nuevo, que solo ha entendido examinar celda de los nosaurianos...

EDITO:
A parte de que no entiendo por qué el código del CASO 2 no funciona, lo que me desconcierta es este comportamiento:

>> ex celda de los nosaurianos
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>> ex celda nosaurianos
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**Los nosaurianos capturados están todos en la misma celda, a la espera de ser vendidos como esclavos. Todos son mujeres y niños.

Que con la misma puntuación, una funcione y otra no. La palabra que está entre "::" es la que está tratando en la iteración actual y la que está entre "--" es la que tratará en la siguiente.

Realmente el código del parse_name funciona y está puntuando bien, pero no entiendo por qué el parser no entiende el segundo caso teniendo ambos la misma puntuación.

Estos ejemplos son con este código:
Código:
   parse_name [n w w2 w3 w4;
      n=0;
      w=nextWord();
      while (w=='la' or 'las' or 'el' or 'los') w=nextWord();
!       if (w=='celda' or 'hueco' or 'reja') n++;
!       if (n>0) {
!          w2=nextWord();
!          w3=nextWord();
!          w4=nextWord();
!          if (w2=='de') {
!            if (w3=='los' && (w4=='nosaurianos' or 'esclavos')) n=n+3;
!            if (w3=='nosaurianos' or 'esclavos') n=n+2;
!           }
!           if (w2=='nosaurianos' or 'esclavos') n=n+1;
!       }
        while ((w=='celda' or 'hueco' or 'reja' or 'nosaurianos' or 'esclavos')) {
           print "::",(address)w,"::";
         if (w=='celda' or 'hueco' or 'reja') n++;
         if (w=='nosaurianos' or 'esclavos') n++;
         w=nextWord();
         while (w=='de' or 'los') w=nextWord();
         print "--",(address)w,"--";
       }
       print "**",n,"**";
       return n;
   ],


En fin... esto de la informática lo carga el diablo.

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 18:56 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1893
Buenas, joruiru.

¿Te falla igualmente si contruyes una prueba sintética fuera del código de la aventura? Un mundo con lo básico para probarlo. Vendría bien para que otros también pudieran confirmar el posible bug.

Mi intuición de no-informita me lleva a pensar que algún otro objeto está influyendo. Podría ser que "de" y "los" fueran también nombres de otros objetos y se produzca cierta ambigüedad.

Es posible que haya dicho una tontería. Insisto en que de inform lo justo no, menos.


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 20:05 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Si, falla siempre...

Un ejemplo más simple es imposible:

!% -~SD
!% +language_name=Spanish
!%

Constant Story "PROBANDO";
Constant Headline "^(c)2011 Joruiru.^";

Release 1;
Serial "111111";

! Queremos usar el comando 'salidas'
Constant ADMITIR_COMANDO_SALIDAS;

Include "Parser";

Include "VerbLib";

[ Initialise ;
! Lugar de comienzo.
location = limbo;

!Se cambia el objeto jugador
!player = mySelfObj;

! Activamos esta variable para que la descripción de los lugares
! se repita siempre, incluso si el jugador ya ha estado alli.
lookmode = 2;

! Mensaje de Bienvenida
"Esto no tiene ni pies ni cabeza.";

];

Include "SpanishG";

Class Localidad
with describe [;
print (string) self.description;
print "^";
<<Salidas>>;
],
has light;

Localidad limbo "Esto es un infierno"
with
description "Una habitación triste y sin decoración.",
;

Object -> celda "celda de los nosaurianos"
with
description "Esta es la descripción del objeto que debe salir",
parse_name [n w w2 w3 w4;
n=0;
w=nextWord();
while (w=='la' or 'las' or 'el' or 'los') w=nextWord();
! if (w=='celda' or 'hueco' or 'reja') n++;
! if (n>0) {
! w2=nextWord();
! w3=nextWord();
! w4=nextWord();
! if (w2=='de') {
! if (w3=='los' && (w4=='nosaurianos' or 'esclavos')) n=n+3;
! if (w3=='nosaurianos' or 'esclavos') n=n+2;
! }
! if (w2=='nosaurianos' or 'esclavos') n=n+1;
! }
while ((w=='celda' or 'hueco' or 'reja' or 'nosaurianos' or 'esclavos' or 'de' or 'los')) {
print "::",(address)w,"::";
if (w=='celda' or 'hueco' or 'reja') n++;
if (w=='nosaurianos' or 'esclavos') n++;
w=nextWord();
while (w=='de' or 'los') w=nextWord();
print "--",(address)w,"--";
}
print "**",n,"**";
return n;
],
has female;


Y el resultado es el siguiente:

Código:
Iniciando la transcripción de
PROBANDO
(c)2011 Joruiru.
Release 1 / Serial number 111111 / Inform v6.31 Library 6/11 D
Interpreter version 0.4.6 / VM 3.1.2 / Library serial number 040227
Librería Española INFSP 0.9 [901.21], basada en InformATE!

>ex celda
::celda::--(0: not dict word)--**1**Esta es la descripción del objeto que debe salir

>ex celda nosaurianos
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**Esta es la descripción del objeto que debe salir

>ex celda de los nosaurianos
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>ex celda de nosaurianos
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>ex celda nosaurianos
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**Esta es la descripción del objeto que debe salir

>ex nosaurianos
::nosaurian::--(0: not dict word)--**1**Esta es la descripción del objeto que debe salir

>quit
¿Realmente quieres abandonar el juego? si

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 21:32 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
A ver si alguien interpreta esto:

Código:
>trace 4
[Parser tracing set to level 4.]

>ex celda de los nosaurianos
[ "ex" ex / "celda" celda / "de" de / "los" los / "nosaurianos" nosaurian ]
[Parsing for the verb 'ex' (2 lines)]

[line 0 * noun -> Examine]
 [line 0 token 1 word 2 : noun]
  [Object list from word 2]
  [Calling NounDomain on location and actor]
   [NounDomain called at word 2
   seeking definite object
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**   [ND made 1 matches]
  [ND returned la celda de los nosaurianos]
  [token resulted in success]
 [line 0 token 2 word 4 : END]

[line 1 * 'a' creature -> Examine]
 [line 1 token 1 word 2 : 'a']
  [token resulted in failure with error type 1]
Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>ex celda nosaurianos
[ "ex" ex / "celda" celda / "nosaurianos" nosaurian ]
[Parsing for the verb 'ex' (2 lines)]

[line 0 * noun -> Examine]
 [line 0 token 1 word 2 : noun]
  [Object list from word 2]
  [Calling NounDomain on location and actor]
   [NounDomain called at word 2
   seeking definite object
::celda::--nosaurian--::nosaurian::--(0: not dict word)--**2**   [ND made 1 matches]
  [ND returned la celda de los nosaurianos]
  [token resulted in success]
 [line 0 token 2 word 4 : END]
[Line successfully parsed]
Esta es la descripción del objeto que debe salir


El segundo caso sale [Line successfully parsed] y en el primero después del primer parsing intenta parsear con la segunda linea de la gramática de examinar...

Si ahora comparamos el resultado del código fuente que sí se comporta como debe...
Código:
>ex celda de los nosaurianos
[ "ex" ex / "celda" celda / "de" de / "los" los / "nosaurianos" nosaurian ]
[Parsing for the verb 'ex' (2 lines)]

[line 0 * noun -> Examine]
 [line 0 token 1 word 2 : noun]
  [Object list from word 2]
  [Calling NounDomain on location and actor]
   [NounDomain called at word 2
   seeking definite object
**4**   [ND made 1 matches]
  [ND returned la celda de los nosaurianos]
  [token resulted in success]
 [line 0 token 2 word 6 : END]
[Line successfully parsed]
Esta es la descripción del objeto que debe salir


Vemos una diferencia...
[line 0 token 2 word 4 : END]
vs
[line 0 token 2 word 6 : END]

Se podría decir que al final de la movida, recoloca el wn según el valor que devuelve el parse_noun? Dentro del while del parse_noun, el wn me lo incrementa como toca tras cada llamada a NextWord(), y al final llega a 7, que al ser nula se sale del bucle.
Porque si en vez de saltarme los "de" y "los", los puntuo, me funciona correctamente...

En este caso puntuo los "los" y no los "de" (el número entre paréntesis es el valor de wn actual):
Código:
>ex celda los nosaurianos
::celda(3)::--los(4)--::los(4)::--nosaurian(5)--::nosaurian(5)::--(0: not dict word)(6)--**3**Esta es la descripción del objeto que debe salir

>ex celda de nosaurianos
::celda(3)::--nosaurian(5)--::nosaurian(5)::--(0: not dict word)(6)--**2**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>ex celda de los nosaurianos
::celda(3)::--los(5)--::los(5)::--nosaurian(6)--::nosaurian(6)::--(0: not dict word)(7)--**3**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.


Y esta es puntuando los "de" y no los "los":
Código:
>ex celda de nosaurianos
::celda(3)::--de(4)--::de(4)::--nosaurian(5)--::nosaurian(5)::--(0: not dict word)(6)--**3**Esta es la descripción del objeto que debe salir

>ex celda los nosaurianos
::celda(3)::--nosaurian(5)--::nosaurian(5)::--(0: not dict word)(6)--**2**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.

>ex celda de los nosaurianos
::celda(3)::--de(4)--::de(4)::--nosaurian(6)--::nosaurian(6)::--(0: not dict word)(7)--**3**Intenta de nuevo, porque sólo te pude entender: examinar la celda de los nosaurianos.


Lo que me lleva a la conclusión de que al salir del parse_noun, se recoloca automáticamente el wn según el valor que devuelva el parseo...

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 21:59 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1893
joruiru escribió:
Lo que me lleva a la conclusión de que al salir del parse_noun, se recoloca automáticamente el wn según el valor que devuelva el parseo...


Sí, eso parece ser. Está claro que no puedes dejar de contar ("saltarte") palabras.

http://www.inform-fiction.org/manual/html/s28.html
Citar:
So: a parse_name routine, if provided, is expected to try to match as many words as possible starting from the current position of wn and reading them in one at a time using the NextWord() routine. Thus it must not stop just because the first word makes sense, but must keep reading and find out how many words in a row make sense. It should return:

0  if the text didn't make any sense at all,
k  if k words in a row of the text seem to refer to the object, or
−1  to tell the parser it doesn't want to decide after all.

The word marker wn can be left anywhere afterwards.


Entiendo que hay que devolver el número de palabras consecutivas ('in a row') que hacen referencia al objeto.

Yo no tengo una idea clara del todo pero... ¿Empieza a tener sentido todo el follón?


Arriba
 Perfil  
 
NotaPublicado: 17 Nov 2011 22:11 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Pues nada... misterio resuelto y mi gozo en un pozo... :lol:

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 23 Nov 2011 15:15 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
EDITO: Parece que no querías un código que funcionase, sino saber por qué no funcionaba la otra opción, y ya está respondido. En todo caso ahí lo dejo.

Código:
Object oCeldaNosaurianos "celda de los nosaurianos" sotanocelda
with
  !name 'celda' 'hueco',
     parse_name [n w w2 w3 w4;
      n=0;
      w=nextWord();
           if (w=='celda' or 'hueco' or 'reja') n++;
      if (n>0) {
         w2=nextWord();
         w3=nextWord();
         w4=nextWord();
         if (w2=='de') {
           if (w3=='los' && (w4=='nosaurian' or 'esclavos')) n++;
           if (w3=='nosaurian' or 'esclavos') n++;
          }
          if (w2=='nosaurian' or 'esclavos') n++;
      }
      return n;
      ],
before[;
examine: "Es la celda de los nosaurios.";
],
has scenery;

Object oNosaurianos "Nosaurianos de la celda" sotanocelda
with
  !name 'celda' 'hueco',
     parse_name [n w w2 w3 w4;
      n=0;
      w=nextWord();
           if (w=='nosaurian' or 'esclavos') n++;
      if (n>0) {
         w2=nextWord();
         w3=nextWord();
         w4=nextWord();
         if (w2=='de' or 'del') {
           if (w3=='la' && (w4=='celda' or 'hueco' or 'reja')) n++;
           if (w3=='celda' or 'hueco' or 'reja') n++;
          }
          if (w2=='celda' or 'hueco' or 'reja') n++;
      }
      return n;
],
before[;
examine: "Son los nosaurianos de la celda.";
],
has scenery;

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 23 Nov 2011 15:45 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Gracias Jarel...

Sí, lo que no entendía era por qué no funcionaba la opción que no puntuaba los artículos y preposiciones...

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 10 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM