Uploaded by egor.andrianov34

Трушляков М.А. Лабораторная №2

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего
образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И
РАДИОЭЛЕКТРОНИКИ»
(ТУСУР)
ОТЧЕТ
по лабораторной работе №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
Download