(setf *load-print* T) (defun firstk (x k) (if (< (length x) k) NIL (loop for i from 0 to (- k 1) collect (nth i x)) ) ) (defun permute (x) (let (r s v) (if (not (cdr x)) ; then: base case; return ((i)) (list x) ;; else: loop through top level (dotimes (i (length x) v) ; v = accum, NIL initially (setf r (nth i x)) ; r = next top-level elem (setf s (remove r x :count 1)) ; s = what's left ;; inner loop over elements of (permute s) (setf v (append v (mapcar #'(lambda (z) (cons r z)) (permute s)) ) ) ) ) ) ) (defun subsets (lis len) (let (plis r) (setf plis (permute lis)) (loop for i in plis do (push (firstk i len) r)) (remove-duplicates r :test #'equal) ) ) (subsets '(1 2 3 4) 1) (subsets '(1 2 3 4) 2) (subsets '(1 2 3 4) 3) (subsets '(1 2 3 4) 4) (subsets '(1 2 3 4) 5) ; Loading #p"/h/tas/fischman/h04-solved". ; FIRSTK ; PERMUTE ; SUBSETS ; ((4) (3) (2) (1)) ; ((4 3) (4 2) (4 1) (3 4) (3 2) (3 1) (2 4) (2 3) (2 1) (1 4) (1 3) (1 2)) ; ((4 3 2) (4 3 1) (4 2 3) (4 2 1) (4 1 3) (4 1 2) (3 4 2) (3 4 1) (3 2 4) ; (3 2 1) (3 1 4) (3 1 2) (2 4 3) (2 4 1) (2 3 4) (2 3 1) (2 1 4) (2 1 3) ; (1 4 3) (1 4 2) (1 3 4) (1 3 2) (1 2 4) (1 2 3)) ; ((4 3 2 1) (4 3 1 2) (4 2 3 1) (4 2 1 3) (4 1 3 2) (4 1 2 3) (3 4 2 1) ; (3 4 1 2) (3 2 4 1) (3 2 1 4) (3 1 4 2) (3 1 2 4) (2 4 3 1) (2 4 1 3) ; (2 3 4 1) (2 3 1 4) (2 1 4 3) (2 1 3 4) (1 4 3 2) (1 4 2 3) (1 3 4 2) ; (1 3 2 4) (1 2 4 3) (1 2 3 4)) ; (NIL)