;; there is a transitive relationship between x & z if there is a
;; relationship between x & some y and some y & z
(defn transitive [r]
(fn t
;; if passed only two args create the path logic var
([x z] (t x z (lvar)))
;; take an x, z, and a path from x to z
([x z path]
(fresh [y]
(conde
;; there is a direct relationship between x & z
;; update the path
[(r x z) (== path (list [x z]))]
;; there is not a direct relationship between x & z
;; try some y that has a relationship with x, update the path
[(fresh [a d]
(r x y)
(conso a d path)
(== a [x y])
;; prove there is a relationship between y & z
(t y z d))])))))
(defn iso
([entity parent]
((transitive is-a) entity parent))
([entity parent path]
((transitive is-a) entity parent path)))
On Tue, Dec 18, 2012 at 11:28 AM, Stathis Sideris <[email protected]> wrote:
> Hello David,
>
> Yes, I wasn't expecting for this to be built-in. Your example is exactly
> what I was looking for, thanks a lot! I'll to need to spend some time to
> figure it out :-)
>
> Stathis
>
>
> On Tuesday, 18 December 2012 15:52:47 UTC, David Nolen wrote:
>
>> There is no general "explain" functionality. However the following simple
>> solution should give you some ideas:
>>
>> (defrel is-a Entity Parent)
>> (fact is-a :pitbull :dog)
>> (fact is-a :dog :mammal)
>> (fact is-a :mammal :chordate)
>> (fact is-a :chordate :animal)
>>
>> (defn transitive [r]
>> (fn t
>> ([x z] (t x z (lvar)))
>> ([x z path]
>> (fresh [y]
>> (conde
>> [(r x z) (== path '())]
>> [(fresh [a d]
>> (r x y)
>> (conso a d path)
>> (== a [x y])
>> (t y z d))])))))
>>
>> (defn iso
>> ([entity parent]
>> ((transitive is-a) entity parent))
>> ([entity parent path]
>> ((transitive is-a) entity parent path)))
>>
>> (comment
>> (run* [q]
>> (iso :dog :animal q))
>> )
>>
>>
>> On Tue, Dec 18, 2012 at 9:06 AM, Stathis Sideris <[email protected]>wrote:
>>
>>> Hello,
>>>
>>> With the code below you can query transitive relationships between
>>> entities successfully. Is there any way to use core.logic "explain" the
>>> relationship? Specifically, is there any way to write a function explain so
>>> that:
>>>
>>> > (explain :pitbull :chordate)
>>>
>>> will give you:
>>>
>>> [:pitbull :dog]
>>> [:dog :mammal]
>>> [:mammal :chordate]
>>>
>>> Thanks,
>>>
>>> Stathis
>>>
>>>
>>> Code:
>>>
>>> (ns test.logic
>>> (:refer-clojure :exclude [==])
>>> (:use clojure.core.logic))
>>>
>>> (defrel is-a Entity Parent)
>>> (fact is-a :pitbull :dog)
>>> (fact is-a :dog :mammal)
>>> (fact is-a :mammal :chordate)
>>> (fact is-a :chordate :animal)
>>>
>>> (defn transitive [r]
>>> (fn t [p1 p2]
>>> (fresh [intermediate]
>>> (conde
>>> ((r p1 p2))
>>> ((r p1 intermediate)
>>> (t intermediate p2))))))
>>>
>>> (defn iso [entity parent]
>>> ((transitive is-a) entity parent))
>>>
>>> In the REPL:
>>> > (run* [q] (iso :dog :animal))
>>> (_.0)
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to [email protected]
>>>
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@**googlegroups.com
>>>
>>> For more options, visit this group at
>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>>
>>
>> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en