Nicolás Berger <[email protected]> writes:
Hi Nicolás,
> Sounds interesting :). I hope I get some time to take a look into it
> soon.
I appreciate your feedback!
> 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.
Oh, indeed, those seem to be very useful. Unfortunately they produce
that much output that it'll freeze my CIDER/Emacs pretty soon because in
backwards direction, `inserto` cycles.
I've simplified the code a bit so that I don't need the `cconso`
relation.
--8<---------------cut here---------------start------------->8---
(declare inserto)
(defn isorto
([l sl]
(isorto l () sl))
([l acc sl]
(all
(trace-lvars "isorto" l acc sl)
(conde
[(== l ()) (== acc sl)]
[(fresh [f r nacc]
(conso f r l)
(inserto f acc nacc)
(isorto r nacc sl))]))))
(defn inserto [x l nl]
(all
;;(trace-s)
(trace-lvars "inserto" x l nl)
(conde
[(== l ()) (== nl (list x))]
[(fresh [f r nf nr]
(conso f r l)
(conso nf nr nl)
(conda
[(fd/<= x f) (conso x l nl)]
[(fd/> x f) (== f nf) (inserto x r nr)]))])))
--8<---------------cut here---------------end--------------->8---
and as you see, now I also trace the relation arguments. In the working
forward direction, I get this trace:
--8<---------------cut here---------------start------------->8---
(run* [q]
(isorto (list 3 2 1) q))
;; isorto
;; l = clojure.lang.LazySeq@7fe1
;; acc = clojure.lang.LazySeq@1
;; sl = _0
;; inserto
;; x = 3
;; l = clojure.lang.LazySeq@1
;; nl = _0
;; isorto
;; l = clojure.lang.LazySeq@400
;; acc = clojure.lang.LazySeq@22
;; sl = _0
;; inserto
;; x = 2
;; l = clojure.lang.LazySeq@22
;; nl = _0
;; isorto
;; l = clojure.lang.LazySeq@20
;; acc = clojure.lang.LazySeq@402
;; sl = _0
;; inserto
;; x = 1
;; l = clojure.lang.LazySeq@402
;; nl = _0
;; isorto
;; l = clojure.lang.LazySeq@1
;; acc = clojure.lang.LazySeq@7861
;; sl = _0
;=> ((1 2 3))
--8<---------------cut here---------------end--------------->8---
Too bad that lazy sequences aren't printed in a readable way. And why
are the sorted lists sl of isorto and nl of inserto always (the same?)
fresh variable _0? I had expected that during the recursion, more
information should be added so that their value builds up like
sl = (1 2 . some-lvar)
where some-lvar will eventually during the next recursion be fixed to
the list (3).
Anyway, this is what I get in the "predicate" sort of application, i.e.,
which answers the question if a given list will equal another list if
being sorted.
--8<---------------cut here---------------start------------->8---
(run* [q]
(isorto (list 3 2 1) (list 1 2 3)))
;; isorto
;; l = clojure.lang.LazySeq@7fe1
;; acc = clojure.lang.LazySeq@1
;; sl = clojure.lang.LazySeq@7861
;; inserto
;; x = 3
;; l = clojure.lang.LazySeq@1
;; nl = _0
;; isorto
;; l = clojure.lang.LazySeq@400
;; acc = clojure.lang.LazySeq@22
;; sl = clojure.lang.LazySeq@7861
;; inserto
;; x = 2
;; l = clojure.lang.LazySeq@22
;; nl = _0
;; isorto
;; l = clojure.lang.LazySeq@20
;; acc = clojure.lang.LazySeq@402
;; sl = clojure.lang.LazySeq@7861
;; inserto
;; x = 1
;; l = clojure.lang.LazySeq@402
;; nl = _0
;; isorto
;; l = clojure.lang.LazySeq@1
;; acc = clojure.lang.LazySeq@7861
;; sl = clojure.lang.LazySeq@7861
;=> (_0)
--8<---------------cut here---------------end--------------->8---
Now that looks good, at least the final trace. The intermediate
accumulator acc indeed equals (or is in fact identical to) sl.
Ok, and now the backwards case:
--8<---------------cut here---------------start------------->8---
(run* [q]
(isorto q (list 1)))
;; inserto
;; x = _0
;; l = clojure.lang.LazySeq@1
;; nl = _0
;; inserto
;; x = _0
;; l = clojure.lang.LazySeq@9e3a6373
;; nl = _0
;; inserto
;; x = _0
;; l = clojure.lang.LazySeq@c74c6d84
;; nl = _0
;; (loops forever...)
--8<---------------cut here---------------end--------------->8---
Well, that loops forever. But why the heck are x and nl always _0? To
my best understanding, that means that x and nl are unified, no? That
would obviously be wrong but I can't see where I am doing that...
Bye,
Tassilo
--
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 unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.