Задачи на Lisp и Prolog с решениямиВступлениеЗдесь представлены типичные задачи из университетского курса на языках Лисп и Пролог. Курс по языку лисп на украинском языке можно найти здесь. Рекомендованный учебник по прологу: Л. Стерлинг, Э. Шапиро “Искусство программирования на языке Пролог”. Пролог решения выполняются в интерпретаторе GNU Prolog. Загрузка исходного файла производится следующей командой: consult(['filename']). Имена предикатов должны начинаться с маленькой латинской буквы, переменных – с заглавной! Лисп решения выполняются в интерпретаторах: Загрузка исходного файла производится следующей командой из интерпретатора: (LOAD ‘filename) ЗадачиЗадача (PRLG01): На доске 4х4 расставить 4 слона так, чтобы они все находились не под ударом друг друга. Задача (PRLG02): Написать программу решения головоломки про Волка, Козу и Капусту. Задача (PRLG03): Операции со списками. Создать функцию на языке Лисп, которая выполняет следующие действия: перегруппирует элементы заданного списка так, чтобы одинаковые элементы, если они есть в списке, стояли все подряд. Задача (PRLG04): Написать функцию, упорядочивающую список, заданный в качестве ее первого аргумента, переставляя его элементы в той последовательности, в какой они встречаются в списке, являющемся значением второго аргумента. Задача (PRLG05): Написать программу, которая печатает все перестановки чисел от 1 до n. Задача (PRLG06): Написать программу вычисления значения многочлена в точке по схеме Горнера:
Задача (PRLG07): Написать программу обращения списка с подсписками. Задача (PRLG08): Написать программу сортировки списка чисел методом Quick Sort (Быстрой сортировки). Задача (PRLG09): Написать программу, которая преобразует представление числа из десятичной в двоичную систему. Задача (PRLG10): Написать программу, которая объединяет два отсортированных списка в один, тоже отсортированный. Например: (2, 3, 6, 8) и (1, 4, 5, 7, 10) -> (1, 2, 3, 4, 5 ,6 ,7, 8, 10). Опpеделите функцию, добавляющую заданное параметром x число в упорядоченный по неубыванию список L таким образом, чтобы сохранилась упорядоченность. (defun insert(x l) (cond ((null l) (cons x)) ((< x (car l)) (cons x l) ) (null (cons (car l) (insert x (cdr l)) ) ) ) ) (insert '7 '(0 3 3 6 9)) (system) Задача (PRLG11): Написати на Пролозi програму, яка друкує всi пiдмножини заданої множини. Задача (PRLG12): Напишите функцию, которая сортирует список чисел, используя алгоритм простого выбора. Задача (PRLG13): Определите функцию f(s), результатом которой является список, получающийся из списка списков s после удаления всех подсписков, содержащих числа (Lisp). Задача (PRLG14): Напишите функцию на Lisp, осуществляющую циклическую перестановку элементов в списке,т.е. (f g h j) -> (g h j f). Напишите функцию, осуществляющую циклическую перестановку N следующих подряд элементов в списке. Например, при N=3 и исходном списке (a b c d e f g h) должно получиться (f g h a b c d e). Задача (PRLG15): Напишите функцию (Lisp), которая из данного одноуровнего списка строит список списков его элементов, например, (a b) -> ((a) (b)). Задача (PRLG16): Определите функцию (Lisp), зависящую от двух аргументов u и v, являющихся списками, которая вычисляет список всех элементов u, не содержащихся в v. Задача (PRLG17): Написать программу реализующую игру в “Шашки” Задача (PRLG18): Определить функцию, которая любой исходный список преобразует в список с одним уровнем скобок, например: (a (b c) a b (c (c)))) -> (a b c a b c c). Задача (LSP19): Разработать функцию, аргументом которой является список, возвращающую список пар: (<элемент исходного списка> <количество его вхождений в исходный список>). Задача (PRLG20): Разработать функцию сортировки методом вставки. Задача (LSP21): Дано натуральное число N. Вычислить s=1/sin1+1/(sin1+sin2)+…+1/(sin1+…+sinN). Задача (LSP22): Найти минимальный элемент списка. Задача (LSP23): Реализовать функцию перемножения многочленов, если многочлены задаются в виде списков их коэффициентов. Задача (PRG24): Реализовать предикат поиска пути в графе (depth-first). Найти цикл в графе заданной длины. Найти Гамильтонов цикл (задача коммивояжера). Задача (LSP25): На вход подается матрица и два списка: a11 a12 | rgh1 a21 a22 | rgh2 —- —- btn1 bnt2 Матрица состоит из символов, а списки из чисел. Программа находит такие подстановки чисел вместо символов матрицы, чтобы суммы по вертикали и горизонтали были равны соответсвующим елементам списков. Решение: Лисп Задача (LSP26): Найти разложение числа на слагаемые. Решение: Лисп Задача (LSP27): Определить функцию CDRN такую, что (CDRN N L) будет эквивалентна функции (CDD..DR L), в имени которой имеется N букв D. Решение: Лисп Задача (LSP28): Определить предикат (NOSUBS L), который принимает значение Т, если список L не имеет подсписков, и NIL-в противном случае. Решение: Лисп Задача (LSP29): Определить функцию, которая удаляет из списка повторяющиеся элементы. Решение 1: Лисп Задача (LSP30): Определить функцию, которая принимает значение Т если в списке L больше чисел, чем атомов. L – список атомов любого типа. Решение: Лисп Задача (LSP31): Определить функцию НОД (X Y), позволяющую найти наибольший общий делитель чисел X и Y. Решение 1: Лисп Задача (PRO32): Из математического анализа известно, что функция cos(x) представляется в виде ряда Тейлора: Решение: Пролог Пояснение: cos(X,R,S,FN,XN,N), Х – это значение, R – текущий результат, S – знак, Fn = N!, Xn = xN, N = 2, 4, 6, 8, 10, … Задача (PRO33): Даны факты для предиката reys(From, To), описывающего существующие рейсы самолетов с указанием пунктов отправления и прибытия. Написать программу для предиката avia2(From, To), который должен быть истинным, только если из города From можно долететь до города To с двумя пересадками, и нельзя с меньшим числом. Решение: Пролог Задача (PRO34): Подсчитать количество положительных элементов в списке. Решение: count([],0). count([A|X],C):-A>0,!,count(X,C1),C is C1+1. count([A|X],C):-count(X,C). Задача (PRO35): Подсчитать методом рекурсии значение функции: y=cos(x)•2•cos(x)•3•cos(x)•n•cos(x), для данного х. Решение: f(_,0,1). f(X,1,R):-!,cos(X,R). f(X,N,R):-!,N1 is N-1,f(X,N1,R1),cos(X,R2),R is R1*N*R2. Для вычисления значения cos(X,R) смотри задачу № PRO32. Задача (PRO36): Опpеделите на языке лисп функционал, заменяющий все элементы списка, не обладающие определенным свойством, на символ *. Проверьте работу функционала для предикатов:
Задача (PRO37): Задан список вещественных чисел. Заменить все четные (по номеру) элементы списка, на произвольную константу. Задача (PRO38): Вычислить сумму ряда: Решение: Лисп. Запустить. Задача (PRO39): На одной улице стоят 4 дома. В каждом из них живет один из 4-х людей: Семен, Николай, Артур и Роман. Каждый из них владеет профессией: Врач, Художник, Егерь, Тренер. Определить кто в каком доме живет и кто какой профессией владеет. Известно, что:
Это упрощённый вариант задачи Эйнштейна. (Загрузить пролог решение) Решение: Запустить. Пролог. Задача (PRO40): Напишите функцию (range М N X), которая выдает список чисел, больших X и расположенных между М и N включительно. Решение: Лисп. Запустить. Задача (PRO41): Фигуры на шахматной доске заданы списком троек (фигура, горизонталь, вертикаль). Определить, находится ли на указанной вертикали указанная фигура. Решение: Лисп. Запустить. Задача (PRO42): Написать программу определения количества списков в заданном списке на заданном уровне. Исходный список имеет уровень 0, вложенный в него список имеет уровень 1 и т.д. Решение: Лисп. Запустить. |