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.
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: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)
yfoo(f,e)
de la base de datos, pero mantiene los predicados restantesfoo(a,b)
,foo(c,d)
yfoo(e,f)
intactos.¡Espero que eso ayude! Déjame saber si tienes alguna otra pregunta.