2011-11-21 16 views
26

¿Alguien puede explicar la diferencia entre el operador == y = en Prolog? Sé que X = Y significa que X se unifica con Y y es verdadero si X ya se unifica con Y o se puede hacer, pero no entiendo cómo esto difiere de ==.¿Cuál es la diferencia entre == y = en Prolog?

Seguimiento: que (ver la respuesta aceptada) tiene sentido. Sin embargo, una pregunta más, ¿hay alguna vez una situación en la que X \= Y sea verdadero y X \== Y sea falso (o viceversa)? Es decir, ¿prueba el X \= Y si no se pueden unificar o si no están unificados actualmente?

+1

"Eso tiene sentido.": ¿Podría agregar lo que tiene sentido o eliminarlo de la pregunta y finalmente agregarlo como comentario a una respuesta? –

+0

@moose: el "seguimiento" (que combina la negación con '=' y '==') comenzó como Comentarios a mi respuesta. Sospecho que "Eso tiene sentido" se refiere a mis dos primeros párrafos, después de los cuales respondí más. Vea si mi edición parece suficiente para aclarar el sentido de esto. – hardmath

Respuesta

29

El = "operador" en Prolog es en realidad un predicado (con notación infija) =/2 que tiene éxito cuando se unifican los dos términos. Por lo tanto X = 2 o 2 = X cantidad que es lo mismo, un objetivo de unificar X con 2.

El "operador" == difiere en que sólo tiene éxito si los dos términos son idénticos ya sin más la unificación. Por lo tanto X == 2 es cierto sólo si la variable X había sido previamente asignado el valor 2.

Agregado: Es interesante trabajar a través de lo que sucede cuando "no" se confunde en estos objetivos, de acuerdo con el comentario por Johns a continuación. ¡Mira el bonito set of examples en el Amzi! Documentación Prolog.

\= significa que los dos términos no se pueden unificar, es decir, que la unificación falla. Al igual que con todas las aplicaciones de negación como fallas, "no unificado" no da lugar (y no puede) a ninguna unificación entre los términos.

\== significa que los dos términos no son idénticos. Aquí tampoco se produce la unificación, incluso si esto tiene éxito.

Por último, piense en qué hará not(not(X = Y)). El objetivo interno tiene éxito si X e Y (que pueden ser términos arbitrarios) pueden unificarse, y también la doble negación de eso.Sin embargo, el envolver el objetivo interno dentro de la doble negación produce un objetivo que sucede a si los dos términos se pueden unificar pero sin unificar esos términos.

Se deja como un ejercicio para que el lector considere si not(not(X == Y)) tiene alguna utilidad similar.

+0

Eso tiene sentido. Sin embargo, una pregunta más, ¿hay alguna vez una situación en la que 'X \ = Y' sea verdadera y' X \ == Y' sea falsa (o viceversa)? Es decir, ¿prueba 'X \ = Y' si no se pueden unificar o si no están unificados actualmente? – JohnS

+0

@JohnS: Tenga en cuenta que 'X \ = Y' es lo mismo que' not (X = Y) 'o, como lo harían algunas implementaciones de Prolog,' \ + (X = Y) '. Vea la porción agregada de mi respuesta para más comentarios. – hardmath

+0

"Por lo tanto, X == 2 es verdadero solo si a la variable X se le había asignado previamente el valor 2". Es muy importante darse cuenta, porque puede tener dos cálculos con EL MISMO RESULTADO que no pasen '=='. Por ejemplo '2/2 * 2 == * (2, (/ (2,2))).' Porque el término de la izquierda no se descompone en términos aritméticos hasta que se evalúa. –

5

= significa unificación, significa que intentará vincular las variables libres para que coincidan con los otros miembros. por ejemplo: A = h (X) convertirá A en el término h (X) si A está libre, y fallará si A dice 5. La unificación es genial porque puede hacer un patrón que coincida con ella, por ejemplo:

X-Y:Z = 5-[a, b, c]:y 

le dará

X = 5, Y = [a, b, c] and Z = y 

porque prólogo trata de hacer XY: Z se ajusta a la expresión 5- [a, b, c]: y. Es muy útil.

Tenga en cuenta que la unificación se utiliza cuando se llama a un predicado y algunas técnicas se derivan: que usted quiere devolver el valor de un acumulador en un predicado recursivo, se puede hacer eso:

recursive_predicate([], Accumulator, Accumulator). 
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff. 

la primera cláusula intentará unificar el tercer y segundo argumento, de modo que si el tercero es libre, ahora tiene el mismo valor que el segundo.

== es igualdad sin intentar vincular las variables.

Cuestiones relacionadas