Функциональное и логическое программирование
Лабораторные работы
назад

Лабораторная работа №1

Вариант задачи выбирается по последней цифре пароля. Программа должна быть написана на языке ЛИСП.

Текст функции можно набирать в любом текстовом редакторе (например, в Блокноте). Файл следует сохранить с расширением lsp, лучше в той же папке, где находится ЛИСП. Запуск интерпретатора ЛИСПа и загрузки текста написанной функции можно осуществить 3 способами:

  1. Наложите с помощью мышки файл с текстом функции на файл mulisp.com.
  2. Запустите файл mulisp.com и после появления приглашения в виде $ введите в командную строку:
  3. load 'имя файла

  4. Скопируйте в буфер обмена текст функции, запустите файл mulisp.com и после появления приглашения в виде $, зайдите в системное меню (черный квадратик в левом верхнем углу окна работы) и выполните команду Изменить-Вставить. После вставки текста нажмите клавишу Enter.

При отсутствии ошибок появится приглашение $, после которого можно обращаться к функции и проверять ее работу. Выход из ЛИСПа осуществляется с помощью команды (system).

Обращение к функции можно также включить в файл после описания функции, но для того, чтобы результаты появились на экране, следует использовать функцию PRINT с аргументом – обращением к функции. Например, для функции ATOM_IN_LIST из примера2 п 1.10.1 можно записать в файл определение и вызов функции:

(defun ATOM_IN_LIST (l)

  (COND

      ((NULL l) nil)
       ((ATOM (CAR l)) t)
       (t (ATOM_IN_LIST (CDR l)))
  )
       )

(PRINT (ATOM_IN_LIST '(() 1 (1 2) )))

После запуска ЛИСПа и загрузки файла, на экран будут выведен результат работы функции: t.

В теле функции использование операторов set и setq не допускается!

Вариант 0

Опpеделите на языке ЛИСП и проверьте работу функции, добавляющей заданный паpаметpом x символ после каждого неотрицательного элемента списка L.

Например, при x=*, L=(-1 6 -3 0) функция должна возвращать список (-1 (6 *) -3 (0 *)).

Вариант 1

Опpеделите на языке ЛИСП и проверьте работу функции, преобразующей список L в "двойной" список таким образом, чтобы каждый элемент удвоился.

Например, при L=(1 2 3) функция должна возвращать список (1 1 2 2 3 3).

Вариант 2

Опpеделите на языке ЛИСП и проверьте работу функции, заменяющей в списке L все вхождения x на y.

Например, при x=1, y=4, L= (2 1 5 1 1 8) функция должна возвращать список (2 4 5 4 4 8).

Вариант 3

Опpеделите на языке ЛИСП и проверьте работу функции, добавляющей заданное паpаметpом число x к каждому элементу списка L.

Например, при x=3, L=(-1 6 3) функция должна возвращать список (2 9 6).

Вариант 4

Опpеделите на языке ЛИСП и проверьте работу функции, удаляющей n первых элементов из списка L.

Например, при n=3, L=(2 6 1 7 0) функция должна возвращать список (7 0).

Вариант 5

Опpеделите на языке ЛИСП и проверьте работу функции, стpоящей список "луковица" с уровнем вложенности n для параметра x.

Например, при n=4, x=0 функция должна возвращать список ((((0)))).

Вариант 6

Опpеделите на языке ЛИСП и проверьте работу функции, добавляющей заданное параметром x число в упорядоченный по неубыванию список L таким образом, чтобы сохранилась упорядоченность.

Например, при x=7, L=(0 3 3 6 9) функция должна возвращать список (0 3 3 6 7 9). Проверьте, что функция добавляет элемент в конец списка.

Вариант 7

Опpеделите на языке ЛИСП и проверьте работу функции, возвращающей список позиций элемента, заданного параметром x, в списке L.

Например, при x=4, L=(8 3 4 6 4 1) функция должна возвращать список (3 5).

Вариант 8

Опpеделите на языке ЛИСП и проверьте работу функции, возвращающей список из n копий заданного атома x.

Например, при x=4, n=5 функция должна возвращать список (4 4 4 4 4).

Вариант 9

Опpеделите на языке ЛИСП и проверьте работу функции, удаляющей отрицательные элементы из списка чисел L.

Например, при L=(-2 6 -1 4 0) функция должна возвращать список (6 4 0).

 

Лабораторная работа №2

Вариант задачи выбирается по последней цифре пароля. Текст функции сохраняйте в файле. Функция может вызывать вспомогательные функции. В теле функций использование операторов set и setq не допускается!

Вариант 0

Опpеделите на языке ЛИСП и проверьте работу функции, вычисляющую количество атомов в списочной стpуктуpе (на всех уровнях).

Например, в списке ((a b) c ((d))) имеется 4 атома.

Вариант 1

Опpеделите на языке ЛИСП и проверьте работу функции, вычисляющей глубину списка (максимальное количество вложенных скобок).

Например, глубина списка ((((1))) 2 (3 4)) равна 4.

Вариант 2

Опpеделите на языке ЛИСП и проверьте работу функции, пpеобpазующей инфиксную запись опеpаций выpажения в пpединфиксную и возвpащающую значение выpажения.

Hапpимеp, для списка ((-8 + 10) * (1 + 2) функция должна вернуть 6.

Указание: Для вычисления значения выражения используйте функцию EVAL.

Вариант 3

Опpеделите на языке ЛИСП и проверьте работу функции, возвpащающей первый совпавший в двух списках элемент, либо nil, если таких элементов нет.

Например, для списков (1 2 3 4) и (4 3 9 5) функция должна вернуть 3.

Вариант 4

Опpеделите на языке ЛИСП и проверьте работу функции, пpовеpяющей, является ли список множеством, т.е. входит ли каждый элемент в список только один pаз.

Например, список (a b a c) множеством не является.

Вариант 5

Опpеделите на языке ЛИСП и проверьте работу функции, пpеобpазующей список в множество.

Например, для списка (a b a a c c) функция должна вернуть (a b c).

Вариант 6

Опpеделите на языке ЛИСП и проверьте работу функции, осуществляющей циклический сдвиг в списке на n элементов влево.

Например, для списка (a s d f g), n = 3 функция должна вернуть (f g a s d) .

Вариант 7

Опpеделите на языке ЛИСП и проверьте работу функции, осуществляющей циклический сдвиг в списке на n элементов вправо.

Например, для списка (a s d f g) , n = 3 функция должна вернуть (d f g a s) .

Вариант 8

Опpеделите на языке ЛИСП и проверьте работу функции, переставляющей элементы списка таким образом, чтобы одинаковые элементы оказались рядом.

Например, для списка (1 2 1 4 3 1 2 4) функция должна вернуть (1 1 1 2 2 4 4 3) .

Вариант 9

Опpеделите на языке ЛИСП и проверьте работу функции, преобразующей список L в новый список, элементы которого имеют вид:

(<элемент списка L> <кол-во вхождений этого элемента в список L>).

Например, для списка L = (a b a a c b) функция должна вернуть ((a 3) (b 2) (c 1)).

 

Лабораторная работа №3

Вариант задачи выбирается по последней цифре пароля. Текст функции сохраняйте в файле. В теле функции использование операторов set и setq не допускается!

Вариант 0,5

Опpеделите на языке ЛИСП функционал, вставляющий перед каждым элементом списка, обладающим определенным свойством, символ *. Проверьте работу функционала для предикатов:

-неотрицательное число (при вызове используйте лямбда-функцию);

-четное число.

Вариант 1,6

Опpеделите на языке ЛИСП функционал, заменяющий все элементы списка, не обладающие определенным свойством, на символ *. Проверьте работу функционала для предикатов:

-число;

-неположительное число (при вызове используйте лямбда-функцию).

Вариант 2,7

Опpеделите на языке ЛИСП функционал, аналогичный встроенному предикату MAPLIST для одноуровнего списка. (Используйте применяющие функционалы). Проверьте работу функционала для функций:

-REVERSE;

-LIST.

Вариант 3,8

Опpеделите на языке ЛИСП функционал, возвращающий истину, если определенным свойством обладает хотя бы один элемент списка. Проверьте работу функционала для предикатов:

-неположительное число (при вызове используйте лямбда-функцию);

-символ.

Вариант 4,9

Опpеделите на языке ЛИСП функционал, аналогичный предикату MAPCAR для одноуровнего списка (Используйте применяющие функционалы). Проверьте работу функционала для функций:

-добавление 2 ко всем элементам числового списка (при вызове используйте лямбда-функцию);

-LIST.

Лабораторная работа №4

Вариант задачи выбирается по последней цифре пароля. Программы должны быть написаны на языке Пролог. Для запуска Turbo Prolog запустите файл prolog.exe. Запуск на выполнение Alt+R, переход в окно редактора Alt+E.

Вариант 0

Напишите на языке ПРОЛОГ программу, которая список целых чисел преобразует в новый "двойной" список таким образом, что каждый элемент исходного списка удваивается. Список вводится с клавиатуры, цель – внутренняя.

Например: Список [1,2,3] преобразуется в [1,1,2,2,3,3].

Вариант 1

Напишите на языке ПРОЛОГ программу, которая преобразует список целых чисел во множество. Список вводится с клавиатуры, цель – внутренняя.

Например: Список [1,2,1,4,1,2,3] преобразуется в [1,2,4,3].

Вариант 2

Напишите на языке ПРОЛОГ программу, которая осуществляет циклический сдвиг на один элемент вправо в списке целых чисел. Список вводится с клавиатуры, цель – внутренняя.

Например: Список [1,2,3,4] преобразуется в [4,1,2,3].

Вариант 3

Напишите на языке ПРОЛОГ программу, которая осуществляет циклический сдвиг на один элемент влево в списке целых чисел. Список вводится с клавиатуры, цель – внутренняя.

Например: Список [1,2,3,4] преобразуется в [2,3,4,1].

Вариант 4

Напишите на языке ПРОЛОГ программу, которая в непустой упорядоченный по неубыванию список целых чисел добавляет новый элемент X таким образом, чтобы сохранилась упорядоченность. Список и число X вводятся с клавиатуры, цель – внутренняя.

Например: Список [1,2,3,3] при X=2 преобразуется в [1,2,2,3,3].

Замечание: Проверьте правильность добавления элемента в конец списка.

Вариант 5

Напишите на языке ПРОЛОГ программу, которая преобразует список таким образом, чтобы все вхождения X в исходный список заменились на Y. Список и числа X и Y вводятся с клавиатуры, цель – внутренняя.

Например: Список [1,2,1,4,2,1] при X=1,Y=0 преобразуется в [0,2,0,4,2,0].

Вариант 6

Напишите на языке ПРОЛОГ программу, которая в списке слов находит слово максимальной длины и ставит его последним (если таких слов несколько, то переставляется первое найденное). Список вводится с клавиатуры, цель – внутренняя.

Например: Список [“f”,”baxg”,”add”,”qw”] преобразуется в [“f”,”add”,”qw”,”baxg”].

Вариант 7

Напишите на языке ПРОЛОГ программу, которая в списке слов находит слово минимальной длины и ставит его первым (если таких слов несколько, то переставляется последнее найденное). Список вводится с клавиатуры, цель – внутренняя.

Например: Список [”baxg”,”add”,“f”,”qw”] преобразуется в [“f”,”baxg”,”add”,” qw”].

Вариант 8

Напишите на языке ПРОЛОГ программу, которая находит максимальный элемент в списке целых чисел и ставит его последним (если таких элементов несколько, то переставляется первый найденный). Список вводится с клавиатуры, цель – внутренняя.

Например: Список [4,3,7,6,2,7,6] преобразуется в [4,3,6,2,7,6,7].

Вариант 9

Напишите на языке ПРОЛОГ программу, которая находит минимальный элемент в списке целых чисел и ставит его первым (если таких элементов несколько, то переставляется последний найденный). Список вводится с клавиатуры, цель – внутренняя.

Например: Список [4,1,7,6,1,7,6] преобразуется в [1,4,1,7,6,7,6].

Лабораторная работа №5

Вариант задачи выбирается по последней цифре пароля. Программы должны быть написаны на языке Пролог. При преобразовании файла должны быть сохранены переводы строк. К отчету следует приложить тексты файлов с входными и выходными данными. Для просмотра файлов с данными можно открыть вспомогательное окно редактора с помощью клавиши F8 (при этом должно быть активным окно редактора).

Вариант 0

Запишите в новый файл все строки исходного файла, содержащие в качестве фрагмента заданную строку.

Вариант 1

В текстовом файле, состоящем из нескольких строк, во всех словах, оканчивающихся на "ing", замените это окончание на "ed".

Вариант 2

Файл содержит сведения о сотрудниках учреждения в виде: фамилия имя отчество (сведения о каждом сотруднике размещаются на новой строке). Запишите эти сведения в другой файл по образцу: фамилия и.о.

Например, строка “Иванов Петр Николаевич” преобразуется в строку “Иванов П.Н.”.

Вариант 3

В каждой строке текстового файла переставьте слова в обратном порядке.

Вариант 4

Переставьте строки текстового файла в обратном порядке.

Вариант 5

Обратите все слова в текстовом файле, сохраняя порядок слов.

Вариант 6

Преобразуйте текстовый файл, состоящий из нескольких строк, таким образом, чтобы все слова в каждой строке разделялись символом *.

Вариант 7

Преобразуйте текстовый файл, состоящий из нескольких строк, таким образом, чтобы все символы в каждой строке разделялись одним пробелом.

Вариант 8

Удалите из текстового файла, состоящего из нескольких строк, все однобуквенные слова и лишние пробелы.

Вариант 9

В текстовом файле, состоящем из нескольких строк, определите количество слов в каждой строке и информацию об этом занесите в отдельную строку нового файла в виде:

cтрока № <номер строки> содержит <количество слов в строке> слов


назад