МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР) ОТЧЕТ по лабораторной работе №2 Вариант 4 Выполнил: Трушляков Максим Александрович Проверил: канд. физ.-мат. наук Зюзьков Валентин Михайлович Томск, 2024 г. Оглавление Постановка задачи................................................................................................... 3 Вариант задания (Вариант 4) ................................................................................. 3 Выполнение ............................................................................................................. 4 Задание №1 ........................................................................................................... 4 Задание №2 ........................................................................................................... 5 2 Постановка задачи Задание состоит из двух задач, в которых требуется составить программы на Прологе для написания простых программ. При составлении программ (если не оговорено противное) можно использовать все встроенные предикаты Пролога. Тексты всех программ, если вы мыслите в духе логического программирования, получаются небольшие. Вариант задания (Вариант 4) 1. Запрограммируйте предикат p(+A,+B), распознающий, можно ли получить список элементов A из списка элементов B посредством вычеркивания некоторых элементов. Алгоритм: Если A - пустой список, то ответом будет "да". В противном случае нужно посмотреть, не пуст ли список B. Если это так, то ответом будет "нет". Иначе нужно сравнить первый элемент списка A с первым элементом списка B. Если они совпадают, то надо снова применить тот же алгоритм к остатку списка A и остатку списка B. В противном случае нужно снова применить тот же алгоритм к исходному списку A и остатку списка B. 2. Напишите предикат p(+X, +Y, +L) - истинный тогда и только тогда, когда X и Y являются соседними элементами списка L. 3 Выполнение Задание №1 Описание Этот код применяет рекурсивный подход для проверки, можно ли получить список A из списка B, вычеркивая некоторые элементы. В качестве базового случая, если список A пустой, предикат возвращает true. Если список B пустой, а список A нет, предикат возвращает false. В остальных случаях, предикат проверяет совпадение голов элементов списков и рекурсивно продолжает проверку для остатков списков. Листинг % Предикат crossedout/2 проверяет, можно ли получить список A из списка B % путем вычеркивания некоторых элементов. % Если список A пустой, то результат всегда истинный. crossedout([],_). % Если список B пустой, и A не пустой, то результат всегда ложный. crossedout(_,[]):- !, fail. % Если голова списка A совпадает с головой списка B, рекурсивно проверяем остальные элементы списков. crossedout([X|A],[X|B]):- crossedout(A,B). % Если голова списка A не совпадает с головой списка B, рекурсивно проверяем голову списка A со следующим элементом списка B. crossedout(A,[_|B]):- crossedout(A,B). Результат работы Рисунок 1. Результат работы программы для задания №1 4 Задание №2 Описание Этот предикат реализует два правила: Если X и Y находятся в начале списка L и сразу за ними следует друг за другом элемент, то они считаются соседними. Если X и Y не находятся в начале списка, он пропускает первый элемент и рекурсивно вызывает себя для оставшейся части списка. Листинг % Предикат p(X, Y, L) - истинный тогда и только тогда, когда X и Y являются соседними элементами списка L. p(X, Y, [X, Y | _]). % X и Y являются соседними элементами, если они идут друг за другом в списке L. p(X, Y, [_ | T]) :- % Переходим к следующему элементу списка и рекурсивно проверяем. p(X, Y, T). Результат работы Рисунок 2. Результат работы программы для задания №2 5