(setq poradi '(Prvni Druhy Treti Ctvrty Paty)) (setq barva '(Zluta Modra Cervena Zelena Bila)) (setq narodnost '(Nor Dan Brit Nemec Sved)) (setq napoj '(Voda Caj Mleko Kava Pivo)) (setq zvire '(Kocka Kun Ptak Rybicky Pes)) (setq cigarety '(Dunhill Blend PallMall Prince BlueMaster)) ; vraci vsechny permutace nad danym seznamem (defun permutace (list) (if (null list) (list nil) (mapcan #'(lambda (head) (mapcar #'(lambda (tail) (cons head tail)) (permutace (remove head list :count 1 :test #'equal)) ) ) list ) ) ) ; jsou prvky X1 (ze seznamu S1) a X2 (ze seznamu S2) vedle sebe? (defun vedle (x1 s1 x2 s2) (let ((prv (oznaceni x1 s1)) (dru (oznaceni x2 s2)) ) (if (= (abs (- prv dru)) 1) T) ) ) ; je prvek X1 (ze seznamu S1) nalevo od X2 (ze seznamu S2)? (defun nalevo (x1 s1 x2 s2) (let ((prv (oznaceni x1 s1)) (dru (oznaceni x2 s2)) ) (if (= (- dru prv) 1) T) ) ) ; vraci index prvku X v seznamu L (defun oznaceni (x l) (let ((a 1)) (dolist (s l) (if (equal x s) (return a) (setq a (+ a 1)) ) ) ) ) ; "prorezavani" vsech moznych permutaci na pripady, co prichazeji v uvahu: (defun Pporadi () (list '(Prvni Druhy Treti Ctvrty Paty)) ) (defun Pbarva () (let ((l nil)) (dolist (x (permutace barva)) (when (nalevo 'Zelena x 'Bila x ) (push x l) ) ) l ) ) (defun Pnarodnost () (let ((l nil)) (dolist (x (permutace narodnost)) (when (= (oznaceni 'Nor x) 1 ) (push x l) ) ) l ) ) (defun Pnapoj () (let ((l nil)) (dolist (x (permutace napoj)) (when (= (oznaceni 'Mleko x) 3 ) (push x l) ) ) l ) ) (defun Pzvire () (permutace zvire) ) (defun Pcigarety () (permutace cigarety) ) (defun reseni () (let ((l nil)) (dolist (a (Pporadi)) (dolist (b (Pbarva)) (dolist (c (Pnarodnost)) (dolist (d (Pnapoj)) (dolist (e (Pzvire)) (dolist (f (Pcigarety)) (when (and (= (oznaceni 'Cervena b) (oznaceni 'Brit c)) (= (oznaceni 'Sved c) (oznaceni 'Pes e)) (= (oznaceni 'Dan c) (oznaceni 'Caj d)) (= (oznaceni 'Zelena b) (oznaceni 'Kava d)) (= (oznaceni 'PallMall f) (oznaceni 'Ptak e)) (= (oznaceni 'Zluta b) (oznaceni 'Dunhill f)) (vedle 'Blend f 'Kocka e) (= (oznaceni 'Kun e) (oznaceni 'Dunhill f)) (= (oznaceni 'BlueMaster f) (oznaceni 'Pivo d)) (= (oznaceni 'Nemec c) (oznaceni 'Prince f)) (vedle 'Nor c 'Modra b) (vedle 'Blend f 'Voda d) ) (push a l) (push b l) (push c l) (push d l) (push e l) (push f l) (push domy l) ) ) ) ) ) ) l ) ) )