I think you want to have a look at clojure.math.combinatorics
Jim
On 25/10/12 20:10, Jordan Lewis wrote:
Hi,
I'm new to core.logic and logic programming in general. I tried to
write a small program to generate all permutations of any size for an
input list with unique elements. To start, I hardcoded the input list
to be (range 3). Here's what I came up with:
(defne everyo [g l]
"A relation that guarantees that g holds for all elements of l."
([_ ()])
([_ [x . r]]
(g x)
(everyo g r)))
(run 16 [q] (everyo #(membero % (range 3)) q) (distincto q))
;; returns (() (0) (1) (2) (0 1) (1 0) (2 0) (0 2) (2 1) (1 2) (2 0 1)
(2 1 0) (0 2 1) (1 2 0) (0 1 2) (1 0 2)), as expected
This program works: it returns all 16 permutations of '(0 1 2).
However, if I ask for any more than 16 solutions, the program doesn't
terminate. Having browsed this mailing list a little, I noticed a
warning about using recursive relations first, so I swapped the two
clauses of the run clause:
(run 16 [q] (distincto q) (everyo #(membero % (range 3)) q))
;; returns (() [0] [1] [2] (0 0) (0 1) (1 0) (0 2) (1 1) (2 0) (1 2)
(2 1) (2 2) (0 0 0) (0 0 1) (0 1 0)), incorrect
This program returns a different result from the first one. The lists
it returns are no longer distinct, despite declaring that q must be
distincto. Additionally, the singleton lists are vectors for some
reason. Asking for more than 16 results now terminates, but returns
more incorrect (non-distinct) result lists.
Clearly I'm doing something wrong. I suspect that my implementation of
everyo is flawed somehow. Can someone please offer advice?
Thanks,
Jordan Lewis
--
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 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