Hi, just to share my take on the matter.
I tried to implement a index-unification, but find it so hard/messy i quit
it :P.
And went with the association list instead and since i wannted to also the
keys of the map i end up with this.
(defn someo [rel xxs]
(matche
[xxs]
([(x . xs)]
(rel x)
(someo rel xs))
([(x . xs)]
(someo rel xs))))
(defn everyo-emptyo [rel xxs]
(matche
[xxs]
([()])
([(x . xs)]
(rel x)
(everyo-emptyo rel xs))))
(defn everyo [rel xxs]
(matche
[xxs]
([()] u#)
([(x . xs)]
(rel x)
(everyo-emptyo rel xs))))
With someo is the relational version of clojure some, everyo of every
(defn unify-map [x y]
(everyo (fn [x]
(someo (fn [y]
(fresh [xk yk xv yv]
(== x [xk xv])
(== y [yk yv])
(== x y)))
y))
x))
Which if fine for small maps.
Cheers, Paulo.
On Sunday, March 12, 2017 at 9:21:38 AM UTC-3, Amirouche Boubekki wrote:
>
> On Wednesday, March 8, 2017 at 1:43:56 AM UTC+1, Evgenii Moiseenko wrote:
>>
>> I was wondering how the implementation of map-like data structure should
>> look like in MiniKanren. I am writing an interpreter of imperative language
>> in MiniKanren and I need a data structure to represent a mappings between
>> variables and their values.
>>
>> Is there any code that implements that ?
>>
>
> Sorry, I don't have a direct answer but I'd like to share my findings
> regarding this topic.
>
> So, microkanren does support relational in my implementation but you
> always need to
> ask explicitly to cross a relation, which is translated by variable
> forming a cross in the
> scheme expression. For instance the following:
>
> (run* (strawberry)
> (fresh is fresh?)
> (fs fruit 'concept/name "fruit")
> (fs is 'relation/start fruit)
> (fs is 'relation "is")
> (fs is 'relation/end concept)))
>
> the database doesn't know that a feature is another feature. Simply said,
> foreign keys
> are represented as keys. If you follow foreign keys automatically, you
> don't know where
> it ends it's like a http redirect (302) in the hole of the white rabbit.
>
> That said, I think it could be made less painful using the unify procedure
> of feature strucutres,
> does basically that:
>
> (define-module (space-feature))
>
>
> (define database (sf:open "memory://"))
>
> (define fruit (add! database '((kind . concept)
> (concept . fruit))))
>
> (define strawberry (add! database '((kind . concept)
> (concept . strawberry))))
>
> (define strawberry-is-a-fruit (add! database `((kind . relation)
> (start . ,strawberry)
> (relation . is)
> (end . ,fruit))))
>
> (define what-is-a-fruit (unify database `((kind . relation)
> (relation . is)
> (end . ,fruit))))
>
> (pk (equals? what-is-a-fruit `(((kind . relation)
> (relation . is)
> (end . ,fruit)
> (start . ,strawberry))))
>
> (pk (equals? (ref strawberry) '((kind . concept)
> (concept . strawberry))))
>
>
> ;; but also
>
> (define what-is-a-fruit (unify database `((kind . relation)
> (relation . is)
> (end . (@ ((kind . concept
> )))))))
>
>
>
> (pk (equals? what-is-a-fruit `(((kind . relation)
> (relation . is)
> (end . ,fruit)
> (start . (@ '((kind . concept)
> (concept . strawberry))))))))
>
> That's kind of the "API" of GraphQL.
>
--
You received this message because you are subscribed to the Google Groups
"minikanren" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/minikanren.
For more options, visit https://groups.google.com/d/optout.