Лабораторные работы на muLisp / lab_4
.docЛабораторная работа №4
«Освоение начальных навыков программирования на языке Лисп и создание собственных функций»
Цель работы: приобретение начальных навыков программирования на языке muLisp, освоение технологии работы с интерпретатором и правил отладки программ.
Задание к работе: написать программу, формирующую все подмножества заданного множества.
Выполнение работы:
Описание функций:
number (list) – определяет количество элементов в списке list.
pow (x n) – выполняет возведение числа x в степень n
generate (list1 list2) – строит список из элементов списка list1 следующим образом: если в соответствующей позиции списка list2 стоит 1, то соответствующий элемент из списка list1 добавляется к результату.
binary (k) – переводит число k в двоичную систему счисления и возвращает в качестве результата список двоичного кода числа.
dopoln (k n) – дополняет список из k элементов нулями до n элементов.
generator (lst) – организует генерацию всех подмножеств заданного множества для множества, представленного списком lst. Возвращает в качестве результата список всех подмножеств заданного множества.
Листинг программы:
; определение количества элементов множества
(defun number (list)
(setq reslt 0)
(loop
((null list) reslt)
(setq list (cdr list))
(setq reslt (+ 1 reslt))
)
)
; вычисление значения 2^n, n - количество элементов множества
(defun pow (x n)
(setq reslt 1)
( loop
((zerop n) reslt)
(setq reslt (* x reslt))
(setq n ( - n 1))
)
)
; генерация подмножества заданного множества по двоичному коду
(defun generate (list1 list2)
(setq i 0)
(setq n (number list1))
(setq rez nil)
(loop
((eql i n) rez)
(setq elem (nth i list2))
(setq elem1 (nth i list1))
(setq rez1 nil)
(setq rez1 (cons elem1 rez1))
(if (eql elem 1) (setq rez (append rez rez1 )) (setq rez rez))
(setq i (+ i 1))
)
)
; перевод текущего значения в двоичный код и возвращение списка двоичного кода
(defun binary (k)
(setq list nil)
(loop
(setq elem (rem k 2))
(setq list (cons elem list))
((eql k 1) list)
((eql k 0) list)
(setq k (truncate k 2))
)
)
; дополнение списка двоичного кода нулями
(defun dopoln (k n)
(setq list (binary k))
(setq count (number list))
(loop
((eql n count) list)
(setq list (cons 0 list))
(setq count (+ count 1))
)
)
; функция организации вычисления подмножеств заданного множества
(defun generator (lst)
(print " ")
(print "Программа генерации всех подмножеств заданного множества ")
(print " ")
(setq count (number lst))
(setq col (pow 2 count))
(setq rez nil)
(setq rezult nil)
(setq j 0)
(loop
((eql j col) rezult)
(setq list1 (dopoln j count))
(setq rez (generate lst list1))
(setq rezult (cons rez rezult))
(print rez)
(setq j ( + j 1 ))
)
)
Работа программы:
Для начала работы программы необходимо вызвать функцию generator и передать ей в качестве параметра множество, для которого будут сгенерированы все подмножества:
При нажатии кнопки Enter начинается работа программы и печатаются все подмножества заданного множества:
где NIL – это пустое подмножество заданного множества.
Вывод: в ходе выполнения работы были получены навыки по программированию на языке muLisp: создание своих собственных функций, освоение технологии работы с интерпретатором, и знакомство со стандартными функциями языка.