Prólogo olvidando/desinstanciando mi variable?
Frecuentes
Visto 129 veces
3
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í.
3 Respuestas
3
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
2
La disyunción (;) actualmente tiene éxito ya sea por:
- Asigne 'prueba' a X, y a S y escriba X. O, si eso falla, retroceda y
- 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
2
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 prolog or haz tu propia pregunta.