![](/user_photo/2706_HbeT2.jpg)
XLisp и уже готовые лабы / XLISP / Лабораторные / Лабы
.doc
Лаб. 1
-
Напишите функцию трех аргументов (list3 x y z) такую, что (list3 x y z) = (x y z) для любых символьных выражений; не используйте функцию list.
-
Пусть x и y - символы, у которых имеется свойство val, значением которого
всегда является число. Напишите функцию от двух аргументов
valplus, значением которой была бы сумма значений свойства val
ее аргументов.
-
Напишите функцию, которая выдает истину, если ее аргумент удовлетворяет хотя бы одному из следующих условий:
а) является списком из двух элементов;
б) является списком из двух атомов;
в) является списком из трех элементов.
-
Напишите с помощью композиции условных выражений функции от четырех аргументов (and4 x1 x2 x3 x4) и (or4 x1 x2 x3 x4), совпадающие с встроенными функциями and и or от четырех аргументов.
-
Напишите функцию, вычисляющую последний элемент списка.
-
Напишите функцию, осуществляющую циклическую перестановку элементов в списке, т.е. (f g h j) -> (g h j f).
-
Определите функцию (f a b c), которая равна истине тогда и только тогда, когда из отрезков с длинами a,b и c можно построить треугольник.
-
Определите функцию (f a b c), которая вычисляет список корней квадратного уравнения a*x^2+b*x+c=0 (если корней нет, то список пустой).
-
Определите функцию, которая меняет местами первый и последний элементы списка, оставляя остальные на своих местах.
-
Последовательность чисел Фибоначчи 1, 1, 2, 3, 5, 8, 13… строится по следующему закону: первые два числа - единицы; любое следующее число есть сумма двух предыдущих f(n)=f(n-1)+f(n-2). Напишите функцию (f n f1 f2) c накапливающимися параметрами f1 и f2, которая вычисляет n-ое число Фибоначчи.
-
Определите умножение целых чисел (*2 x y) через сложение и вычитание.
-
Определите возведение в целую степень (^ x n) через умножение и деление.
-
Напишите функцию (fullength x), считающую полное количество атомов (не равных nil) в списке x. Исходный список не предполагается одноуровневым.
-
Напишите функцию от двух аргументов x и n , которая создает список из n раз повторенных элементов x.
-
Напишите функцию, которая из данного списка строит список списков его элементов, например, (a b) -> ((a) (b)).
-
Определите функцию, зависящую от двух аргументов u и v, являющихся списками, которая вычисляет список всех элементов u, не содержащихся в v.
-
Напишите функцию, аналогичную встроенной функции замены subst в списке s выражения x на y, но производящую взаимную замену x на y, т.е. x->y, y->x.
Лаб. 2
-
Определите функцию, зависящую от двух аргументов u и v, являющихся списками, которая вычисляет список всех элементов, содержащихся либо в u, либо в v, но не одновременно в u и v.
-
Напишите функцию, осуществляющую замену элементов списка y на соответствующие элементы списка x в списке w, например,
y=(a b), x=(1 2), w=((a b) a (c (a (a d)))) -> ((1 2) 1 (c (1 (1 d)))).
-
Определите функцию (f s), результатом которой является список, получающийся после удаления на всех уровнях всех положительных элементов списка чисел s.
-
Определите функцию (summa_digits n), результатом которой является сумма цифр натурального числа n.
-
Определите функцию (f s), которая из данного списка s удаляет последний элемент.
-
Напишите функцию (f L), выдающую в качестве результата предпоследний элемент списка L, имеющего не менее двух элементов.
-
Напишите функцию (f X N V), которая выдает список, получающийся после добавления X на N-е место в список V.
-
Напишите функцию (f N V), которая выдает список, получающийся после удаления N-го элемента из списка V.
-
Напишите функцию (f L), которая выдает список, получающийся после удаления из списка L всех элементов, стоящих на четных местах, например, (f '(1 2 3 4 5 6)) = (1 3 5).
-
Напишите функцию (f X V), которая выдает список, получающийся из списка V после удаления всех вхождений X на всех уровнях, например, (f '(1 (2 3 (1)) (3 1)) 1) = ((2 3 nil ) (3)).
-
Определите функцию (f V), которая выдает список всех элементов списка V, встречающихся в нем более одного раза.
-
Напишите функцию (f A B), которая вычисляет наименьшее общее кратное двух целых положительных чисел A и B.
-
Напишите функцию (f A ), которая выдает список, получающийся из списка A удваиванием каждого элемента, например, (f '(1 2 3) ) = (1 1 2 2 3 3)..
-
Пусть имеется список "структур client": ((a 29 3) (b 29 6) (c 40 2)). Первым элементом каждого подсписка служит имя клиента, вторым - суточный тариф, а третьим - количество дней, на которое взята автомашина. Напишите функцию вычисляющую итоговую сумму оплаты, объединяющую выплаты всех клиентов, данные о которых содержатся в списке.
-
Опишите функцию (f N L1), которая берет список целых чисел L1 и целое число N и выдает список (L1 L2), где списки L2 и L3 такие, что числа из исходного списка, меньшие, чем N, помещаются в список L2, а остальные - в список L3.
-
Запрограммируйте функцию (f A B), распознающую, можно ли получить список элементов A из списка элементов B посредством вычеркивания некоторых элементов.
Алгоритм: Если A - пустой список, то ответом будет "да". В противном случае нужно посмотреть, не пуст ли список B. Если это так, то ответом будет "нет". Иначе нужно сравнить первый элемент списка A с первым элементом списка B. Если они совпадают, то надо снова применить тот же алгоритм к остатку списка A и остатку списка B. В противном случае нужно снова применить тот же алгоритм к исходному списку A и остатку списка B.
-
Напишите предикат (p X Y L) - истинный тогда и только тогда, когда X и Y являются соседними элементами списка L.
-
Определите функцию sum_tree(TreeOfInteger), вычисляющую сумму целых чисел, являющихся вершинами списка TreeOfInteger, представляющего бинарное дерево.
-
Напишите функцию (range M N), которая выдает список целых чисел, расположенных между M и N включительно.
-
Напишите функцию для вычисления целочисленного квадратного корня из натурального числа N, определяемого как число I, такое, что I*I N, но (I+1)*(I+1) > N.
-
Напишите функцию (count L X), считающую число вхождений элемента X в список L. Исходный список не предполагается одноуровневым.
-
Напишите функцию (f L N), которая циклически сдвигает вправо элементы списка L на N позиций.
-
Напишите функцию (f L N), которая циклически сдвигает влево элементы списка L на N позиций.
-
Напишите функцию (f x y), которая сравнивает два списка целых чисел, используя лексикографическом порядок.
-
Напишите функцию, единственным аргументом которой являлся бы список списков, объединяющую все эти списки в один.
-
Напишите функцию, которая определяет, является ли данное натуральное число простым.
Воспользуйтесь более общей задачей:
(ispr n m) - "Число n не делится ни на одно число большее или равное m и меньшее n".
Имеем (ispr n m) -истинно, во-первых, если n = m, и, во-вторых, если истинно (ispr n m+1) и n не делится на m.
-
Определите функцию (f a n), которая от двух числовых аргументов вычисляет величину a+a*(a+1)+a*(a+1)*(a+2)+...+a*(a+1)*...*(a+n).
-
Определите функцию (f n), вычисляющую сумму:
1*2*3+4*5*6+...+(n-2)*(n-1)*n.
-
Определите функцию (f s), которая в одноуровневом списке чисел s
переставляет все отрицательные элементы в начало списка, например, (f '(4 -8 6 -9 -7)) -> (-8 -9 -7 4 6).
-
Определите функцию (f s), вычисляющую знакочередующую сумму a1-a2+a3-a4+...+ak*(-1)^k для списка s, имеющего вид (a1 a2 a3 ... ak).
-
Определите функцию (f n), которая для натурального числа n
вычисляет 1!+2!+3!+...+n!.
-
Используя функционалы, напишите функцию, которая из данного списка строит список списков его элементов, например, (a b) -> ((a) (b)).
-
Определите функцию (f s n), которая из списка чисел s создает новый список, прибавляя к каждому атому число n. Исходный список не предполагается одноуровневым.
-
Определите функцию (f s), которая из списка чисел s создает новый список, меняя знак у каждого атома. Исходный список не предполагается одноуровневым.
Лаб. 3
-
Определите функцию, зависящую от одного аргумента, которая по данному списку вычисляет список его элементов, встречающихся в нем более одного раза. Проверьте, как она будет работать на примере '(a a a a b a).
-
Определите функцию, зависящую от двух аргументов u и n, которая по данному списку строит список его элементов, встречающихся в нем не менее n раз. Проверьте работу этой функции на примере (a a b a c b c a b b d a b) для n=1,2,5,0.
-
Определите функцию, обращающую список и все его подсписки
на любом уровне, например, (a b (c d) e) -> (e (d c) b a).
-
Напишите функцию, заменяющую Y на число, равное глубине
вложения Y в W, например, Y=a, W=((a b) a (c (a (a d)))) ->
((2 b) 1 (c (3 (4 d)))).
-
Напишите функцию, определяющую глубину первого вхождения элемента y в список w.
-
Напишите функцию, которая делает из списка множество, т.е. удаляет все повторяющиеся элементы.
-
Напишите функцию (exists p x), которая проверяет
"Существует ли элемент списка x, удовлетворяющий предикату p?"
(p - функция или функциональное имя ).
-
Напишите функцию, которая сортирует список чисел, используя алгоритм простой вставки.
-
Напишите функцию (all p x), которая проверяет
"Для всех ли элементов списка x выполняется предикат p? "
(p - функция или функциональное имя ).
-
Напишите функцию, которая сортирует список чисел, используя алгоритм простого выбора.
-
Определите функцию (f s), результатом которой является список,
получающийся из списка списков s после удаления всех подсписков,
содержащих числа.
-
Напишите функцию (filter p x), которая "фильтрует" (создает список) элементы списка x, удовлетворяющие предикату p
(p - функция или функциональное имя ).
-
Определите функцию (f s), которая вычисляет список (m1 m2 m3), состоящий из трех наибольших элементов списка s: m1 >= m2 >= m3. Исходный список содержит не менее трех элементов.
-
Напишите функцию (count p x), которая подсчитывает, сколько атомов в списке x удовлетворяет предикату p (p -функция или функциональное имя). Список x не предполагается одноуровневым.
-
Напишите функцию (f L), которая выдает список, получающийся после удаления всех повторных вхождений элементов в список L, например, (f '(a b c d d a)) = (a b c d).
-
Напишите функцию (f L), которая считает количество различных элементов списка L.
-
Напишите функцию (f X Y), которая возвращает список Z - "пересечение" списков X и Y, т.е. список, содержащий их общие элементы, причем кратность каждого элемента в списке Z равняется минимуму из его кратностей в списках X и Y.
-
Напишите функцию (f X Y), которая возвращает список Z - "пересечение" списков X и Y, т.е. список, содержащий их общие элементы, причем кратность каждого элемента в списке Z равняется максимуму из его кратностей в списках X и Y.
-
Определите функцию (ordered Tree), проверяющую является бинарное дерево Tree является упорядоченным деревом целых чисел, т. е. число, стоящее в любой вершине дерева, больше любого элемента в левом поддереве и меньше любого элемента в правом поддереве. Указание. Можно использовать вспомогательные функции (ordered_left X Tree) и (ordered_right X Tree), которые проверяют, что X меньше (больше) всех чисел в вершинах левого (правого) поддерева дерева Tree и дерево Tree - упорядочено.
-
Вычисление с днями недели. Обозначим дни как 0 = воскресенье, 1 = понедельник, ..., 6 = суббота. Определите функцию (f S N), которая вычисляет какой будет день недели через N дней, если сегодня день недели S.
-
Напишите функцию (f N), которая выдает список всех простых чисел, меньших N.
-
Начиная с календаря Папы римского Грегориуса в 1752 сохраняется следующее правило для високосных годов (годы с 366 днями):
-
год, делимый на 4, - високосный год (например, 1972);
-
но: если он делится на 100, это не високосный год (например, 1900);
-
но: если он делится на 400, это - високосный год (например, 2000).
Напишите функцию (f N), которая выясняет, является ли год N високосным.
-
Напишите функцию (drop L N), которая удаляет N элементов с конца списка L.
-
Напишите функцию (drop L N), которая удаляет N элементов с начала списка L.
-
Напишите функцию (drop L N1 N2), которая удаляет элементы списка L с позиции N1 до позиции N2 включительно.
-
Напишите функцию (takeWhile L P), которая в качестве результата выдает список, состоящий из всех элементов списка L, начинает с начала списка и до первого элемента, не удовлетворяющего данному предикату P. Например: (takeWhile '(2 4 6 7 8 9) 'Evenp) = (2 4 6). (P - функция или функциональное имя ).
-
Напишите функцию (dropWhile L P), которая в качестве результата выдает список, состоящий из всех элементов списка L, начиная с первого элемента списка L, не удовлетворяющего данному предикату P. Например: (dropWhile '(2 4 6 7 8 9) 'Evenp) = (7 8 9). (P - функция или функциональное имя ).
-
Написать функцию для генерации всех перестановок элементов
списка, состоящего из попарно различных элементов
Алгоритм:
<Все перестановки множества M>=
если M - пустое множество, то (nil),
иначе
для всех x, принадлежащих M,
ОБЪЕДИНИТЬ
(ДОБАВИТЬ x на первое место в каждой из
<Все перестановки множества M
без элемента x> ).
-
Для представления римских цифр используются символы: I - один, V - пять, X - десять, L - пятьдесят, C - сто, D - пятьсот, M - тысяча. Для изображения числа с помощью римских цифр используются общеизвестные правила; так, например, 482 - CDLXXXII, 1999 - MCMXCIX. Напишите функцию (f R), которая проверяет, правильна ли запись некоторого числа римскими цифрами R (R - список символов); например, (f '(I I I C)) = nil.
-
Для представления римских цифр используются символы: I - один, V - пять, X - десять, L - пятьдесят, C - сто, D - пятьсот, M - тысяча. Для изображения числа с помощью римских цифр используются общеизвестные правила; так, например, 482 - CDLXXXII, 1999 - MCMXCIX. Напишите функцию (f R), которая переводит число R, записанное римскими цифрами, в десятичную запись; например, (f '(C D L X X X I I)) = 482. Исходное число не превышает 1999.
-
Для представления римских цифр используются символы: I - один, V - пять, X - десять, L - пятьдесят, C - сто, D - пятьсот, M - тысяча. Для изображения числа с помощью римских цифр используются общеизвестные правила; так, например, 482 - CDLXXXII, 1999 - MCMXCIX. Напишите функцию (f N), которая переводит целое число N из диапазона от 1 до 2000 римскими цифрами; например, (f 482) = (C D L X X X I I).
-
Интерпретирующая функция для исчисления предикатов.
Постановка задачи.
В языке имеются только логические выражения. Правильные выражения (их семь типов) следующие.
Тип Форма
логические константы true, false
переменные атомы
конъюнкция (and e1 e2)
дизъюнкция (or e1 e2)
отрицание (not e1)
квантор всеобщности (all x e)
квантор существования (exists x e)
Требуется, чтобы правильные логические выражения не содержали свободных переменных. Примерами интерпретируемых правильных выражений являются:
(all p (or p (not p)))
(exists p (and (all q (or p q)) p))
(or (exists p p) (all p p))
Вычисление таких выражений всегда приводит к значению true или false . Для операций and, or, not используются обычные правила вычисления. При вычислении формы all выражение e вычисляется дважды, сначала переменная x получает значение true, а затем false. К результатам применяется операция and. Аналогично форма exists также требует вычисления выражения при двух различных значениях переменной. К результатам применяется затем операция or.
-
Построить программу "сжать", назначение которой - преобразование английских слов в их "звуковой" код. Этот процесс предусматривает "сжатие" примерно одинаково звучащих слов в одинаковый их код - своего рода, аббревиатуру этих слов. Слова "сжимаются" в соответствии со следующими правилами:
-
первая буква слова сохраняется;
-
все последующие за ней гласные, а также буквы "h", "w" и "y" удаляются;
-
сдвоенные буквы заменяются одиночными;
-
закодированное слово состоит не более чем из четырех букв, остальные буквы удаляются.
Напишите функцию (f w), которая выдает результат сжатия слова, представленного в виде списка букв w.
Примеры: (f '(b a r r i n g t o n)) = (b r n g) и (f '(l l e w e l l y n)) = (l n).
-
Множественное число большинства английских существительных получается путем добавления буквы "s" к форме единственного числа. Но если существительное заканчивается буквой "y", следующей за согласной, множественное число образуется путем замены буквы "y" на сочетание "ies"; если же существительное заканчивается буквой "o", следующей за согласной, множественное число образуется путем добавления сочетания "es".
Напишите функцию (f W), вычисляющую множественное число для английского слова, представленного списком букв W.
-
Булева формула есть терм, определяемый следующим образом: константы true и false - булевы формулы; если X и Y - булевы формулы, то и списки (X v Y), (X & Y), (~ X) - булевы формулы, здесь v и & - бинарные инфиксные операторы дизъюнкции и конъюнкции, а ~ - унарный оператор отрицания.
Напишите функцию, распознающую логические формулы в дизъюнктивной нормальной форме, т.е. формулы, являющиеся дизъюнкцией конъюнкций литералов, где литерал - атомарная формула или ее отрицание.
-
Булева формула есть терм, определяемый следующим образом: константы true и false - булевы формулы; если X и Y - булевы формулы, то и списки (X v Y), (X & Y), (~ X) - булевы формулы, здесь v и & - бинарные инфиксные операторы дизъюнкции и конъюнкции, а ~ - унарный оператор отрицания.
Напишите функцию, (negation_inward F1), которая выдает логическую формулу F2, получающуюся из логической формулы F1 внесением всех операторов отрицания внутрь конъюнкций и дизъюнкций.
-
Булева формула есть терм, определяемый следующим образом: константы true и false - булевы формулы; если X и Y - булевы формулы, то и списки (X v Y), (X & Y), (~ X) - булевы формулы, здесь v и & - бинарные инфиксные операторы дизъюнкции и конъюнкции, а ~ - унарный оператор отрицания. Напишите функцию (f T), определяющую, является ли данный терм T булевой формулой.
-
Напишите функцию (f N K), которая выдает список всех последовательностей (списков) длины K из чисел 1,2,...,N.
-
Напишите функцию (f N ), которая выдает список всех последовательностей (списков) из N нулей и единиц, в которых никакая цифра не повторяется три раза подряд (нет куска вида XXX).
-
Напишите функцию (f N ), которая выдает список всех последовательностей (списков) из N нулей, единиц и двоек, в которых никакая цифра не повторяется два раза подряд (нет куска вида XX).
-
Булева формула есть терм, определяемый следующим образом: константы true и false - булевы формулы; если X и Y - булевы формулы, то и списки (X v Y), (X & Y), (~ X) - булевы формулы, здесь v и & - бинарные инфиксные операторы дизъюнкции и конъюнкции, а ~ - унарный оператор отрицания.
Напишите функцию, распознающую логические формулы в конъюнктивной нормальной форме, т.е. формулы, являющиеся конъюнкцией дизъюнкций литералов, где литерал - атомарная формула или ее отрицание.