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