Uploaded by Nebiros Nebiros

Лабораторная № 2 Функциональное и логическое программирование Чора А.Н.

advertisement
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ
УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра автоматизированных систем управления (АСУ)
ТУСУР
(Лабораторная работа № 2 по дисциплине
«Функциональное и логическое программирование»)
Вариант 1
Выполнил:
Студент гр.
з-432П10-5
_______________
(подпись)
И. О. Фамилия
«___»__________20____г.
(дата)
Проверил:
______________________________
(должность, ученая степень, звание)
______________ /____________________/
(подпись)
И. О. Фамилия
«____»_______________20____г.
(дата)
Томск 2023
Задание состоит из двух задач, в которых требуется составить программы на
Прологе для написания простых предикатов. При составлении программ (если не
оговорено противное) можно использовать все встроенные предикаты Пролога.
Тексты всех программ, если вы мыслите в духе логического программирования,
получаются небольшие. SWI-Prolog не имеет стандартного help'а для Windows, для
этого используется предикат help. Вызов help(<имя предиката>) выдает на экран
информацию об этом предикате. Вызов help(7) выдает на экран список всех
встроенных предикатов с комментариями. Текстовый файл руководства по
SWI-Prolog - pl\library\manual. Отладку предикатов можно осуществлять спомощью
предиката трассировки trace(<имя предиката>), трассировка предиката отключается
- trace(<имя предиката>, -all).
Вариант 1
1. Напишите предикат, аналогичный предикату subst (см. первое контрольное
задание, вариант 8, задача 2), но производящий взаимную замену X на Y, т.е.
X->Y, Y->X.
2. Напишите предикат, который определяет, является ли данное натуральное
число простым.
Воспользуйтесь более общей задачей:
ispr(N, M) - "Число N не делится ни на одно число большее или равное M и
меньшее N".
Имеем ispr(N, M) -истинно, во-первых, если N = M, и, во-вторых, если истинно
ispr(N,M+1) и N не делится на M.
Решение Задача 1.
mutual_subst([], _, []).
mutual_subst([X|T], Y, [Y|Result]) :X == Y,
mutual_subst(T, Y, Result).
mutual_subst([Y|T], X, [X|Result]) :Y == X,
mutual_subst(T, X, Result).
mutual_subst([H|T], X, [H|Result]) :H \== X,
H \== Y,
mutual_subst(T, X, Result).
mutual_substitute(List, X, Y, Result) :mutual_subst(List, X, TempResult),
mutual_subst(TempResult, Y, Result).
; Пример использования
?- mutual_substitute([a, b, c, a, b], a, b, Result).
Result = [b, a, c, b, a].
?- mutual_substitute([1, 2, 3, 1, 2, 3], 2, 3, Result).
Result = [1, 3, 2, 1, 3, 2].
Решение Задача 2.
ispr(N) :ispr(N, 2).
ispr(N, M) :N =:= M,
!.
ispr(N, M) :N mod M =\= 0,
NextM is M + 1,
ispr(N, NextM).
; Примеры использования
?- ispr(7).
true.
?- ispr(10).
false.
Download