
- •Лабораторная работа №1 Освоение начальных навыков программирования на языке Лисп и создание собственных функций
- •Реализация в Mulisp
- •Реализация в LispWorks
- •Лабораторная работа №2 Обработка строк, работа со списками
- •Реализация в Mulisp
- •Реализация на Common Lisp для LispWorks Вариант 1
- •Вариант 2
- •Лабораторная работа №3 Построение простейших экспертных систем
- •Реализация в Mulisp
- •Реализация для LispWorks Вариант 1
- •Вариант 2
- •Вариант 3
- •Лабораторная работа №4 Моделирование работы машины Тьюринга
Лабораторная работа №1 Освоение начальных навыков программирования на языке Лисп и создание собственных функций
При выполнении заданий студенты должны приобрести начальные навыки программирования на языке muLisp, освоить технологию работы с интерпретатором и правила отладки программ.
Пример. Из заданного списка включить в список результата каждый второй элемент, результирующий список переписать в обратном порядке.
Реализация в Mulisp
(defun revers_del_list_2 (list1 list2)
((null list1) list2)
(revers_del_list_2 (cdr (cdr list1))
(cons (car (cdr list1)) list2))
Обращение к функции, например, может иметь вид:
(revers_del_list_2 ’(1 2 3 4 5 6 7 8 9 10)).
В результате будет получен список: (10 8 6 4 2). Следует обратить внимание, что при вызове функции, определенной с двумя формальными параметрами, был указан только один фактический параметр. Это объясняется свойством самого языка, т.е. по умолчанию второму параметру было присвоено значение nil, что и требовалось.
Реализация в LispWorks
(defun revers_del_list_2 (list1 &optional list2)
(if (null list1) list2
(revers_del_list_2 (cdr (cdr list1))
(cons (car (cdr list1)) list2))))
Главным отличием является наличие необязательного параметра, определяемого с помощью ключевого слова &optional, поскольку в Commin Lisp не предусмотрено присвоение значения по умолчанию формальному параметру при вызове функции. Вычислительный процесс претерпел незначительные вычисления и был скорректирован в соответствии с форматом условной конструкции выражения if. Обращение к функции аналогично для реализации в MuLisp.
Задания для самостоятельного решения:
1. Описать функции, моделирующие следующие операции над множествами:
а) A∩B, AUB, A\B;
б)
A
B,
A÷ B, AUB.
2. Описать функции, моделирующие следующие логические операции:
а) A&B, AVB, A↓ B;
б) A B, A→B, A&B;
в) A↓ B, A|B, A=B.
3. Из заданного списка удалить каждый второй элемент, результирующий список переписать в обратном порядке.
4. Написать функцию, которая для любых двух заданных множеств будет определять:
а) является ли одно множество подмножеством другого;
б) декартово произведение множеств.
5. Заданы три списка, сформировать из них:
а) новый список, элементами которого будут символы, принадлежащие каждому из исходных, результат не содержит повторов;
б) новый список, элементы которого – это элементы каждого исходного, не повторяющегося в двух других;
в) новый список таким образом, чтобы каждый из исходных был его подмножеством, а он при этом был множеством;
г) три множества и определить их прямое произведение.
6. Определить функцию, которая проверяет, является ли список множеством. Если нет, то превращает его в множество.
7. Написать программу, формирующую все подмножества заданного множества.
8. Список списков превратить в список элементов, который будет множеством.
9. Заданный исходный список разбить на два списка. В первый из них войдут те элементы, которые не повторяются в исходном. Во второй – те, что повторялись.
10. Заданный список букв и цифр превратить в список двух списков, в первом из них цифры, а во втором буквы, в списках не должно быть повторов.
11. Определить функцию, выполняющую проверку двух множеств на равенство.
12. Определить функцию, сортирующую данный список в любом порядке.
13. Определить функцию, которая будет проверять два списка на равенство по следующему правилу: списки считаются равными, если они имеют одинаковое число символов, и каждый третий элемент у них совпадающая цифра.
14. Определить функцию, которая будет проверять равенство двух списков по следующему правилу:
а) два списка считаются равными, если в одном количество элементов нечетное, а в другом - четное. При этом сумма цифр в списке с четным количеством элементов меньше, чем сумма цифр в списке с нечетным количеством;
б) два списка считаются равными, если у них одинаковое количество элементов и причем, если в одном списке на месте i стоит атом, а в другом на этом же месте должен быть список;
в) два списка считаются равными, если у них одинаковое количество элементов, но один список состоит из атомов, а другой - из списков. При этом, если атом является цифрой, число элементов в соответствующем списке должно быть меньше ее;
г) два списка являются равными, если один состоит из цифр, а другой - из списков и они имеют одинаковую длину. Причем, число элементов в данном списке должно быть больше соответствующей цифры;
д) два списка являются равными, если они имеют разную длину, и один состоит из цифр, а другой - из списков. При этом, общее количество элементов во всех внутренних списках одного не должно превышать общую сумму цифр другого.
15. Проверить взаимное соответствие трех списков. Три списка будут считаться взаимно соответствующими, если выполняются следующие условия:
а) среди списков есть один, количество элементов которого больше, чем сумма элементов двух других;
б) элементами списков являются другие списки, причем количество элементов в одном из них больше, чем в любом другом, но в каждом из меньших есть хотя бы один внутренний список, количество элементов которого больше чем в наибольшем списке.
16. Создать программу «переводчик», которая для заданного английского слова будет выдавать русский аналог и наоборот. Словарный запас должен составлять не менее пятнадцати слов, которые должны хранится в списке.
17. Создать программу «переводчик», которая любое заданное слово из букв будет переводить в комбинацию кодов символов в него входящих и наоборот. Перевод осуществляется на основе словаря, который оформлен в виде списка. Словарный запас должен быть не менее пятнадцати слов.