tutorial - ¿Cuál es la diferencia entre== y=en Prolog?
reglas en prolog (2)
¿Alguien puede explicar la diferencia entre el operador ==
y the =
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 ==
.
Seguimiento: eso (ver la respuesta aceptada) tiene sentido. Sin embargo, una pregunta más es si alguna vez X /= Y
es verdadero y X /== Y
es falso (o viceversa)? Es decir, ¿ X /= Y
prueba si no se pueden unificar o si no están unificados actualmente?
= significa unificación, significa que intentará vincular las variables libres para que coincidan con los otros miembros. por ejemplo: A = h (X) convertirá a A en el término h (X) si A está libre, y fallará si A está obligado a decir 5. la unificación es excelente porque puede hacer una coincidencia de patrones con ella, por ejemplo:
X-Y:Z = 5-[a, b, c]:y
Te regalaré
X = 5, Y = [a, b, c] and Z = y
porque prolog intenta hacer que XY: Z se ajuste a la expresión 5- [a, b, c]: y. Es muy útil.
Tenga en cuenta que la unificación se usa cuando llama a un predicado y se producen algunas técnicas: digamos que desea devolver el valor de un acumulador en un predicado recursivo, puede hacerlo:
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.
El = "operador" en Prolog es en realidad un predicado (con notación infija) = / 2 que tiene éxito cuando los dos términos están unificados. Por lo tanto, X = 2
o 2 = X
equivalen a lo mismo, un objetivo para unificar X
con 2.
El == "operador" difiere en que solo tiene éxito si los dos términos ya son idénticos sin más unificación. Por lo tanto, X == 2
es verdadero solo si a la variable X
había asignado previamente el valor 2.
Agregado: es interesante analizar lo que sucede cuando "no" se mezcla con estos objetivos, según el comentario de JohnS a continuación. ¡Vea el bonito conjunto de ejemplos 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.
Finalmente piense en lo que not(not(X = Y))
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, envolver el objetivo interno dentro de la doble negación produce un objetivo que tiene éxito si los dos términos se pueden unificar pero sin unificar esos términos .
Se deja como ejercicio para el lector contemplar si not(not(X == Y))
tiene alguna utilidad similar.