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

Reply via email to