Prolog: Comprueba si la lista de tuplas es una función.
Quiero verificar si una lista L de tuplas (x1, y1) tiene la propiedad de función:
∀ (x1, y1), (x2, y2) ∈ L (x1=x2 ∧ y1=y2)
Intenté resolverlo con el siguiente predicado:
m_Function(L) :-
((member(M1, L), member(M2, L),
M1 = (X1, Y1), M2 = (X2, Y2), X1 = X2)
-> Y1 = Y2).
El problema con eso es que, por ejemplo, la entrada:
L = [(p, q), (p, r)]
da como resultado verdadero.
El rastro de mi depuración me muestra que me di cuenta más exactamente de la afirmación:
∃ (x1, y1), (x2, y2) ∈ L (x1=x2 ∧ y1=y2)
traza:
T Llamada: (8) m_Function([(p, q), (p, r)])
Llamada: (8) m_Function([(p, q), (p, r)]) ? creep
Llamada: (9) lists:member(_5074, [(p, q), (p, r)]) ? creep
Salida: (9) lists:member((p, q), [(p, q), (p, r)]) ? creep
Llamada: (9) lists:member(_5074, [(p, q), (p, r)]) ? creep
Salida: (9) lists:member((p, q), [(p, q), (p, r)]) ? creep
Llamada: (9) (p, q)=(_5060, _5062) ? creep
Salida: (9) (p, q)=(p, q) ? creep
Llamada: (9) (p, q)=(_5066, _5068) ? creep
Salida: (9) (p, q)=(p, q) ? creep
Llamada: (9) p=p ? creep
Salida: (9) p=p ? creep
Llamada: (9) q=q ? creep
Salida: (9) q=q ? creep
T Salida: (8) m_Function([(p, q), (p, r)])
Salida: (8) m_Function([(p, q), (p, r)]) ? creep
¿Hay alguna manera elegante en Prolog, por ejemplo, con algún cuantificador “para todo” que pueda usar para resolver este tipo de problema?
davy.ai
Sí, en Prolog hay un predicado incorporado que puede ayudarte a resolver este problema de manera más elegante:
forall/2
. Este predicado verifica si una determinada condición se cumple para todas las soluciones de una consulta. Aquí tienes un ejemplo de solución utilizandoforall/2
:En esta solución, se utiliza
forall/2
para verificar si para todos los pares(X1,Y1)
y(X2,Y2)
enL
, dondeX1
no es igual aX2
,Y1
es igual aY2
. El operador\=
se utiliza para verificar la desigualdad.Con esta solución, tu entrada problemática
L = [(p, q), (p, r)]
dará como resultadofalse
, como se espera.Aquí tienes un rastro de la consulta
m_Function([(p, q), (p, r)])
utilizando esta nueva solución:Como puedes ver, la consulta tiene éxito y no hay retroceso, lo que significa que la condición se cumple para todas las soluciones, como se desea.