Hi, Sounds interesting :). I hope I get some time to take a look into it soon.
In the meantime, have you tried playing with the log and trace "goals"? I mean log, trace-s and trace-lvar. They might be of help in trying to discover where it's going that makes it hang. El 29/07/2015 11:40, "Tassilo Horn" <t...@gnu.org> escribió: > Hi all, > > I've just implemented insertion sort with core.logic: > > --8<---------------cut here---------------start------------->8--- > (declare inserto) > (defn isorto > "A relation where sl is a sorted version of the list l." > ([l sl] > (isorto l () sl)) > ([l acc sl] > (conde > [(== l ()) (== acc sl)] > [(fresh [f r nacc] > (conso f r l) > (inserto f acc nacc) > (isorto r nacc sl))]))) > > (defn cconso > "A relation where consing s and then f to r gives l." > [f s r l] > (fresh [l1] > (conso s r l1) > (conso f l1 l))) > > (defn inserto > "A relation where inserting x into l gives the sorted list nl." > [x l nl] > (conde > [(== l ()) (== nl (list x))] > [(fresh [f r nf nr] > (conso f r l) > (conso nf nr nl) > (conde > [(fd/> x f) (== f nf) (inserto x r nr)] ;; fd is an alias for > clojure.core.logic.fd > [(fd/<= x f) (cconso x f r nl)]))])) > --8<---------------cut here---------------end--------------->8--- > > That works fine in forwards direction > > --8<---------------cut here---------------start------------->8--- > (run* [q] > (isorto (list 5 3 4 1 2) q)) > ;=> ((1 2 3 4 5)) > --8<---------------cut here---------------end--------------->8--- > > and as a check > > --8<---------------cut here---------------start------------->8--- > (run* [q] > (isorto (list 3 2 1 4 5) (list 1 2 3 4 5))) > (_0) > --8<---------------cut here---------------end--------------->8--- > > but won't terminate in backwards direction > > --8<---------------cut here---------------start------------->8--- > (run* [q] > (isorto q (list 1 2 3))) > ;; wait until hell freezes > --8<---------------cut here---------------end--------------->8--- > > where it ideally would unify q with all six possible permutations of the > sorted list (1 2 3). It doesn't even terminate when I provide the empty > list or a one-element list as the sorted list sl. > > Well, actually I don't need all permutations. One would suffice which > could even be the sorted variant, i.e., in "backwards mode" I'd be happy > if it just unified l with sl. > > I've tried partially replacing condes with condas or condus in various > combinations of the three occurrences but I only get to two different > outcomes. Either it doesn't terminate just as the all-conde version, or > it terminates without any answer. > > I think at least inserto should be pretty correct and reversible, at > least I can ask it for all element/list pairs which would complete to a > given sorted list when inserting at the right position. > > --8<---------------cut here---------------start------------->8--- > (run* [q a] > (inserto q a (list 1 2 3 4 5))) > ;=> ([1 (2 3 4 5)] [2 (1 3 4 5)] [3 (1 2 4 5)] [5 (1 2 3 4)] [4 (1 2 3 5)]) > --8<---------------cut here---------------end--------------->8--- > > (Interesting that the 5 comes before the 4. Does that give any clue?) > > Do I have some error in the code which I don't see anymore after staring > at the code for more than an hour? Or do I need to use some trick to > get it somehow reversible? > > Bye, > Tassilo > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > 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 unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.