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: ¿Cómo puedo eliminar valores simétricos en predicados?

Tengo una pregunta sobre la eliminación de valores simétricos en mis predicados. Estos predicados están en mi base de datos y los agregué allí usando assertz.

Entonces, tengo:

foo(a,b).
foo(b,a).
foo(c,d).
foo(e,f).
foo(f,e).

Estoy tratando de eliminar:

foo(b,a).
foo(f,e).

Intenté crear esta regla:

remove :- foo(A,B),foo(B,A),retract(foo(B,A)).

Sin embargo, esto elimina todos los predicados en mi base de datos y no sé cómo evitarlo.

¡Si alguien pudiera ayudarme, lo apreciaría mucho!

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para eliminar solo los valores simétricos y mantener el resto de los predicados en la base de datos, puedes modificar la regla remove de la siguiente manera:

    remove :- foo(A,B), foo(B,A), A @< B, retract(foo(B,A)).
    

    Esta regla modificada agrega una verificación para A @< B, que asegura que solo se elimine uno de los valores simétricos. Aquí, @< es la relación de orden estándar en Prolog, que compara los términos lexicográficamente.

    Entonces, la regla modificada elimina foo(b,a) y foo(f,e) de la base de datos, pero mantiene los predicados restantes foo(a,b), foo(c,d) y foo(e,f) intactos.

    ¡Espero que eso ayude! Déjame saber si tienes alguna otra pregunta.

Comments are closed.