Породження комбінаторних об’єктів.
(DEFUN PRN13 (lst)
(SETQ i 0)
(LOOP
((NULL lst))
(INCQ i)
(IF (= 1 (POP lst)) (PROGN (PRIN1 i) (SPACES 1)))
) )
4. З перестановки (1 2 3 ... n ) необхідно отримати перестановку (n ... 2 1) за найменшу кількість кроків. Кроком будемо називати обмін місцями довільних двох сусідніх чисел. Наприклад, з перестановки (1 3 4 2) можна отримати одну з наступних: (3 1 4 2), (1 4 3 2), (1 3 2 4).
Нехай lst – поточна перестановка. Опишемо алгоритм, за яким будемо знаходити наступну перестановку. Для цього, переглядаючи список lst зліва направо, знайдемо такі два числа що знаходяться поруч, де перше менше за друге. Поміняємо їх місцями та викличемо рекурсивно функцію move_per над отриманим списком.
(defun move_per (lst)
(prin1 lst) (terpri 1)
(SETQ cur NIL)
(LOOP
((ATOM (CDR lst)))
((< (CAR lst) (CADR lst)) (SETQ a (POP lst))
(SETQ b (POP lst))
(PUSH a lst)
(PUSH b lst)
(SETQ lst (APPEND (REVERSE cur) lst))
(move_per lst) )
(PUSH (POP lst) cur)
) )
Обчислювані функції
Обчислення виразів та звернення до функцій відбувається автоматично інтерпретатором muLisp. Обчислювані функції необхідні в тих випадках коли необхідно безпосередньо обчислити вираз або звернутися до функцій. Визначенням функції є список, який складається з трьох частин: імені типу функції, формальних параметрів та тіла функції.