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