es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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 utilizando forall/2:

    m_Function(L) :-
        forall((member((X1,Y1), L), member((X2,Y2), L), X1 \= X2), Y1 = Y2).
    

    En esta solución, se utiliza forall/2 para verificar si para todos los pares (X1,Y1) y (X2,Y2) en L, donde X1 no es igual a X2, Y1 es igual a Y2. El operador \= se utiliza para verificar la desigualdad.

    Con esta solución, tu entrada problemática L = [(p, q), (p, r)] dará como resultado false, como se espera.

    Aquí tienes un rastro de la consulta m_Function([(p, q), (p, r)]) utilizando esta nueva solución:

    T Call: (8) m_Function([(p, q), (p, r)])
    T Exit: (8) m_Function([(p, q), (p, r)])
    

    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.

Comments are closed.