Prólogo olvidando/desinstanciando mi variable?

Soy muy nuevo en Prolog y tengo un problema en el que parece que se olvida mi variable

test(S) :-
X = 'testing',
(S = y, write(X) );
(S = n, write(X) ).

Running

test(y)

Imprime el texto como se esperaba, pero

test(n)

imprime

_L160

¿Qué supongo que significa que la variable no está instanciada? ¿Por qué está pasando esto?

Sé que puede escupirlo en dos predicados como:

test(y) :- X = 'testing', write(X).
test(n) :- X = 'testing', write(X).

pero mi problema real está en un predicado mucho más grande que no se puede simplificar así.

preguntado el 22 de mayo de 12 a las 16:05

3 Respuestas

Su problema es la precedencia de ;/2. Si emite un listing(test/1) obtendrás esto:

 test(A) :-
    (   B=testing,
        A=y,
        write(B)
    ;   A=n,
        write(B)
    ).

que muestra cómo el intérprete lee su código.

Debe poner entre paréntesis su código para obtener lo que desea:

test(S) :-
   X = 'testing',
   ((S = y, write(X) );
    (S = n, write(X) )).

contestado el 22 de mayo de 12 a las 16:05

La disyunción (;) actualmente tiene éxito ya sea por:

  1. Asigne 'prueba' a X, y a S y escriba X. O, si eso falla, retroceda y
  2. Asigne n a S y escriba X

Agregue algunos paréntesis para que funcione según lo previsto.

test(S):-
X = 'testing',
    (
        (S = y, write(X) )
    ; 
        (S = n, write(X) )
    ).

contestado el 22 de mayo de 12 a las 16:05

Déjame volver a sangrar el código por ti:

test(S) :-
        (   X = 'testing', S = y, write(X)
        ;   S = n, write(X)
        ).

Espero que ahora quede más claro lo que realmente escribiste.

contestado el 22 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.