¿Por qué unificar SWI-Prolog una cadena entre comillas y sin comillas (sin espacios) a la misma regla?

StackOverflow https://stackoverflow.com/questions/4100943

Pregunta

Supongamos que tengo las siguientes reglas:

unify('test', 'this is a test').
run :- write('Enter something: '), 
       read(X), 
       unify(X, Y), 
       write('The answer is '), write(Y).

Y entonces me quedo de la siguiente manera:

?- ['unify.pl'].
% unify.pl compiled 0.00 sec, -48 bytes
true.

?- run.
Enter something: test.
The answer is this is a test
true.

?- run.
Enter something: 'test'.
The answer is this is a test
true.

¿Por qué unificar SWI-Prolog tanto test y 'test' a unify('test', 'this is a test').? Me encontré con este mismo tiempo responder a una pregunta sobre Prolog SO. Mientras que yo era capaz de responder a la pregunta de la persona, que no podía explicar este comportamiento en particular, y me preguntaba si alguien más podía.

¿Fue útil?

Solución

Mientras átomos en SWI-PROLOG pueden ser denotados usando comillas simples, por ejemplo, 'This is an atom', comillas simples son no se necesita cuando el analizador SWI-PROLOG puede identificar un átomo de una secuencia de caracteres, por lo general a partir con una letra minúscula, como test. Si la secuencia contiene un espacio en blanco (o algunos otros personajes), que había necesidad de las comillas simples para denotar un átomo correctamente. Los caracteres alfanuméricos y algunos signos de puntuación como _ subrayado están muy bien, por ejemplo, test5_6.

Si la secuencia de caracteres sin comillas simples eran comenzar con cualquier otra cosa, como por ejemplo un número 6k, el analizador lo tratará como un number; si se tratara de un carácter alfabético en mayúsculas como Test, el analizador será tratado como una variable.

Otros consejos

Esto no es un comportamiento específico SWI - es requerido por la norma. Hay una manera simple de ver esto. Se puede utilizar también la otra por cualquier otro término cuya sintaxis no es evidente. Cualquiera de los tipos en el nivel superior:

?- X = 'test'.
X = test.

?- X = 'this is a test'.
X = 'this is a test'.

La respuesta es siempre válida texto Prolog - esto es específico de SWI pero también a muchos otros sistemas Prolog como YAP, GNU, B, IF, SICStus.

Otra manera de ver esto es utilizar write_canonical / 1:

?- write_canonical('this is a test').
'this is a test'
true.

?- write_canonical([a,b,(c,d),{e,f}]).
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[]))))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top