2012-09-24 15 views
6

Este es un (afortunadamente) programa lógico simple con el que me he quedado atrapado por un tiempo.Listado de padres únicos de DAG con core.logic

Tengo un DAG representado por una relación de borde en core.logic, al generar la lista de nodos principales, obtengo duplicados cuando tengo "formas de diamante" en el gráfico (no estoy hablando de ciclos aquí).

¿Hay alguna manera de generar una lista distinta de padres en este caso (volviendo a escribir parento o similar)?

(defrel edge a b) 
(fact edge :a :b) 
(fact edge :a :c) 
(fact edge :b :d) 
(fact edge :c :d) 

(defne parento [x y] 
    ([x y] (edge y x)) 
    ([x y] (fresh [z] 
      (edge z x) 
      (parento z y)))) 

(run* [q] (parento :d q)) 
;; => (:b :c :a :a) 

quiero conseguir (: b: c: a) y yo quiero hacerlo dentro de la instrucción de ejecución * (es decir, envolviendo el resultado en un conjunto no es lo que estoy apuntando para lo es).

Además, agregar "^: tabled" a parento parece ser el truco, pero no quiero que la memoria que presentó presenta.

Respuesta

1

No hay forma de hacerlo sin salir de la programación relacional si define hechos individuales para los bordes como lo ha hecho. Una solución es simplemente pasar toda la lista de resultados al constructor de conjuntos de Clojure. La otra opción es trabajar en todos los nodos en una sola pasada en su programa lógico.

Puede ser útil analizar las soluciones de Prolog existentes para este problema y traducir lo que encuentre.

+0

Gracias por la respuesta, he estado leyendo Bratko y buscando en Google un poco y no he encontrado nada directamente útil. ¿Puedes delinear la solución de "una pasada" que mencionaste? Saludos ... –

+0

¿Has visto esto: http://sites.google.com/site/prologsite/prolog-problems/6? – dnolen