Язык программирования SWI-Prolog. Учебно-методическое пособие
.pdf
Задание 8. Используя цифры 1, 2, 3, 4, 5, 6, 7, 8, 9 по одному разу, составить два натуральных числа А и В такие, что квадрат числа А равен числу В.
Задание 9. Найти два натуральных числа P и Q таких, что в их совместной записи присутствуют по одному разу все цифры от 1 до 9 и дробь P/Q равна 4/5 (достаточно найти одно решение).
Задание 10. В таблице размером 3×3 уже поставлены числа 1, 2 и 3. Нужно заполнить остальные клетки таблицы числами 4, 5, 6, 7, 8 и 9 так, чтобы сумма чисел в каждой строке и каждом столбце равнялась15 (задача имеет два решения).
Замечание. Если потребовать, чтобы суммы элементов как одной, так и другой диагонали равнялись15, то задача будет иметь единственное решение.
Задание 11. Дана последовательность цифр 123456789. Требуется разбить последовательность на числа, и расставить между ними знаки «+» и «–» так, чтобы в результате получилось заданное значение100. Получить все решения.
Для иллюстрации приведём одно из решений: 123+45–67+8–9 = 100.
Задание 12. Разработать игру «Угадай число». Программа «задумывает» случайное целое число от1 до 100, предлагает пользователю ввести пробное значение и сравнивает его с задуманным. Если значения совпадают, программа выводит слово'Угадал!' и завершается. Если задумано меньшее значение, программа выводит сообщение 'Моё число меньше!' и продолжает работу. Соответственно, если задумано большее значение, программа выводит сообщение 'Моё число больше!' и продолжает работу.
Подсказка. Для ввода данных используйте оператор read(переменная).
101
Задание 13. Игра со спичками. На столе лежит N спичек. Два игрока по очереди берут из кучки от 1 до 3 спичек. Проигрывает тот, кто возьмёт последнюю спичку.
Реализуйте в диалоговом режиме игру пользователя с компьютером. Первый ход делает пользователь – вводит число взятых спичек. Ваша программа должна проверять корректность хода и сообщать в ответ, сколько спичек берёт компьютер. В конце игры программа должна сообщить игроку результат: «Вы выиграли» или «Вы проиграли».
Реализуйте две стратегии игры за компьютер:
1)случайный выбор числа спичек;
2)оптимальный выбор числа спичек. Выигрышная стратегия состоит в том, чтобы при каждом ходе оставлять игроку число спичекK такое, что K mod 4 = 1. Если это невозможно, то следует брать одну спичку.
Задание 14. Собрался Иван-царевич на бой со Змеем Горынычем, трехглавым и треххвостым. – Вот тебе меч-кладенец, – сказала царевичу Баба Яга. – Одним ударом ты можешь срубить Змею либо одну голову, либо две головы, либо один хвост, либо два хвоста. Запомни: срубишь голову – новая вырастет; срубишь хвост – два новых вырастут; срубишь два хвоста – голова вырастет; срубишь две головы– ничего не вырастет. За сколько ударов Иван-царевич может срубить Змею Горынычу все головы и все хвосты?
Задание 15. Папа, мама, бабушка и внук тёмной ночью должны перейти по хлипкому мостику через глубокий овраг. Мостик выдерживает не более двух человек, поэтому вся семья вместе перейти мост не может. К сожалению, у них всего один фонарик, без которого идти по мосту нельзя. Нельзя также перебрасывать фонарик с одной стороны на другую, поэтому единственный возможный вариант предполагает следующую последовательность действий:
1)переходят два человека;
2)один возвращается обратно;
3)переходят два человека;
4)один возвращается обратно;
5)переходят два человека.
102
Известно, что папа может перейти мостик за 1 минуту, мама – за 2 минуты, бабушка – за 10 минут, внук – за 5 минут. Когда через мостик идут два человека, то время перехода определяется по более медленному члену семьи. То есть папа с мамой будет идти 2 минуты, а с бабушкой – 10 минут.
Требуется определить конкретную последовательность переходов так, чтобы уложиться в 17 минут.
Задание 16. Игровое поле представляет собой таблицу размером4×4 клеток. В клетках размещены кружки двух разных цветов. При щелчке мышкой по какому-нибудь кружку его цвет и цвет соседних по горизонтали и соседних по вертикали кружков изменяется на противоположный. После щелчка в центре игрового поля цвет изменят пять кружков, на краю поля – четыре, а в углу – только три кружка. Цель игры состоит в том, чтобы сделать все кружки одного и того же цвета.
Требуется разработать предикат, который получает начальную расстановку кружков и определяет по каким кружкам нужно щелкнуть мышкой, чтобы все кружки стали одного и того же цвета.
Для примера рассмотрим рисунок с начальной расстановкой кружков. Пронумеруем поля игрового поля слева направо и сверху вниз последовательными целыми числами от 1 до 16. Тогда белые кружки находятся в позициях 2, 8 и 13. Чтобы сделать все кружки белыми, нужно щелкнуть мышкой на кружках с номерами1, 3, 10 и 16. Этот список и должен являться решением задачи.
Задание 17. Игровое поле представляет собой полоску из пяти клеток. На двух левых клетках стоят белые шашки, на двух правых– чёрные,
103
среднее поле свободно. Шашка может перейти на соседнее поле (если оно свободно) или перепрыгнуть через одну шашку, чтобы встать на свободное поле. При этом белые шашки могут ходить и прыгать только вправо , а чёрные – только влево.
Игроку необходимо получить конечную позицию, в которой чёрные шашки находятся слева, а белые – справа от пустой ячейки.
Требуется написать предикат, который в качестве решения формирует последовательность номеров клеток, на которых стоят делающие ход шашки.
Пример. Последовательность ходов 2, 4, 3 означает, что первым ходом игрок передвигает белую шашку с поля 2 на поле 3. На втором ходе чёрная шашка 4 перепрыгивает через шашку 3 и становится на поле 2. Третий ход делается белой шашкой с поля 3 на поле 4.
Последовательность ходов приводит к следующей позиции,
из которой возможны два варианта продолжения: 1, 2 или 5, 4, но оба они приводят в тупик. Тем не менее, решение задачи существует. Желаем удачи!
104
ПРИЛОЖЕНИЕ
Использование веб-интерфейса для разработки программ на языке программирования SWI-Prolog
Главная страница сайта swish.swi-prolog.org имеет следующий вид:
Она разделена на три области.
В левой части окна пользователь выбирает тип создаваемого объекта– программа (кнопка Program) или документ (кнопка Notebook). Оба варианта позволяют создать объект на основе шаблона. По умолчанию выбран пустой шаблон (пункт Empty). В этом случае после нажатия на кнопку Program слева появляется пустое поле для набора кода программы.
Справа внизу располагается область для набора цели – текста запроса и кнопка Run! для запуска запроса на выполнение. Справа вверху расположена область вывода результатов выполнения запроса. Сюда же выводится отладочная информация в режимеdebug при использовании в запросе оператора trace для трассировки программы.
105
Пример.
Выберем тип создаваемого объекта– Program. В левой части окна наберём программу суммирования элементов списка:
listsum([], 0) :- !. listsum(L,S) :-
L =[ H|T ], listsum(T,W), S is W + H.
а в области цели – запрос L = [3, 18, -1], listsum(L,S) и нажмем кнопку Run. В результате получим:
Если результат выполнения программы неоднозначен, то при нажатии кнопки Run! в окне результата появится только первый вариант решения и набор кнопок Next, 10, 100, 1000, Stop. При нажатии кнопки Next появляется следующий вариант решения, при нажатии кнопки 10 – следующие 10 вариантов, …, при нажатии кнопки Stop выполнение программы прекращается.
106
Пример. Предикат append(L1, L2, L) разбивает переданный ему список L на две части, конкатенация которых образует исходный список. Для L = [2, 18, -1] мы должны получить следующие варианты разбиения:
L1 |
= [], |
L2 |
= [3, 18, -1] |
|
|
||
L1 |
= [3], |
L2 = [18, -1] |
|
|
|||
L1 |
= [3, 18], |
L2 = [-1] |
|
|
|||
L1 |
= [3, 18, |
-1], |
L2 = [] |
|
|
||
Наберем в |
области |
цели запросL = [3, 18, |
-1], append(L1, L2, |
L) и |
|||
нажмем |
кнопку Run!, |
а |
после получения |
первого варианта |
решения |
||
нажмем два раза кнопку Next. Вот что мы увидим на экране.
Чтобы получить сразу все варианты решения, нам достаточно было нажать кнопку 10.
107
СПИСОК ЛИТЕРАТУРЫ
1.Братко И. Программирование на языке Пролог для искусственного ин-
теллекта. – М.: Мир, 1990. – 560 с.
2.Братко И. Алгоритмы искусственного интеллекта на языке Пролог. –
М.: Вильямс, 2004. – 640 с.
3.Доорс Дж., Рейблейн А.Р., Вадера С. Пролог – язык программирования будущего. – М.: Финансы и статистика, 2003. – 144 с.
4.Клоксин У., Меллиш К. Программирование на языке Пролог. – М.: Мир, 1987. – 336 c.
5.Малпас Дж. Реляционный язык Пролог и его применение. – М.: Наука, 1990. – 464 с.
6.Набебин А.А. Логика и Пролог в дискретной математике. – М.: МЭИ, 1996. – 452 с.
7.Сошников Д.В. Парадигма логического программирования. – М.: Вузовская книга, 2006. – 220 с.
8.Стерлинг Л., Шапиро Э. Искусство программирования на языке Пролог.
–М.: Мир, 2003. – 333 c.
9.Шрайнер П.А. Основы программирования на языке Пролог. – М., 2005.
–173 с.
10.Сайт http://www.swi-prolog.org/pldoc/ – документация по SWI-Prolog (на английском языке) [Электронный ресурс]. – Режим доступа: открытый ресурс
11.Сайт https://swish.swi-prolog.org/ – online-система программирования на SWI-Prologe. [Электронный ресурс]. – Режим доступа: открытый ресурс
12.Богомолова О.Б. Логические задачи. – Изд-е 4-е, испр. и доп. – М.: БИНОМ. Лаборатория знаний, 2013. – 277 с.
13.Козлова Е.Г. Сказки и подсказки (задачи для математического кружка).
–Изд-е 2-е, испр. и доп. – М.: МЦНМО, 2004. –165 с.
14.Мочалов Л.П. Головоломки. – М.: Просвещение, 1996. – 190 с.
108
ОГЛАВЛЕНИЕ |
|
ВВЕДЕНИЕ .............................................................................................................. |
3 |
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ ................................................................................. |
4 |
1.1. Общие сведения о языке Prolog..................................................................... |
4 |
1.2. Объекты и синтаксис языка Prolog................................................................ |
5 |
1.2.1. Алфавит и ключевые слова языка ........................................................... |
5 |
1.2.2. Переменные.............................................................................................. |
5 |
1.2.3. Числа и сопоставление значений ............................................................ |
5 |
1.2.4. Арифметические операции и математические функции ....................... |
6 |
1.2.5. Атомы и термы ......................................................................................... |
8 |
1.2.6. Списки ...................................................................................................... |
9 |
1.2.7. Встроенные предикаты для работы со списками ................................. |
11 |
1.2.8. Структура программы ........................................................................... |
13 |
1.3. Ветвление, рекурсия, циклы........................................................................ |
14 |
1.3.1. Ветвление ............................................................................................... |
15 |
1.3.2. Рекурсия ................................................................................................. |
16 |
1.3.3. Циклы ..................................................................................................... |
17 |
1.4. Отсечение ..................................................................................................... |
22 |
1.5. Структуры данных: стек, очередь, дерево .................................................. |
23 |
1.6. Предикаты высших порядков ...................................................................... |
27 |
1.7. Решение задач .............................................................................................. |
29 |
1.8. Программирование с ограничениями ......................................................... |
32 |
1.9. Запросы к базе данных ................................................................................ |
40 |
1.10. Логические задачи...................................................................................... |
45 |
1.11. Игры и головоломки ................................................................................... |
51 |
1.12. Организация диалога с пользователем ..................................................... |
58 |
1.13. Отладка программы ................................................................................... |
59 |
1.14. Использование встроенной документации ............................................... |
61 |
2. ПРАКТИЧЕСКАЯ ЧАСТЬ ................................................................................. |
64 |
2.1. Задачи на вычисление .................................................................................. |
64 |
2.2. Работа со списками ...................................................................................... |
69 |
2.3. Структуры данных ....................................................................................... |
75 |
2.4. Числовые ребусы.......................................................................................... |
78 |
2.5. Базы данных ................................................................................................. |
80 |
2.6. Логические задачи ....................................................................................... |
90 |
2.7. Игры и головоломки .................................................................................... |
99 |
ПРИЛОЖЕНИЕ.................................................................................................... |
105 |
СПИСОК ЛИТЕРАТУРЫ ..................................................................................... |
108 |
109
Учебное издание
ГУТМАН Геннадий Натанович, САУШКИН Михаил Николаевич
Язык программирования SWI-Prolog
Редактор Ю.А. Петропольская
Компьютерная верстка И.О. Миняева Выпускающий редактор Н.В. Беганова
Подписано в печать 02.03.20 Формат 60×84 1/16. Бумага офсетная Усл. п. л. 6,34. Уч.-изд. л. 6,31
Тираж 40 экз. Рег. № 7/20
Федеральное государственное бюджетное образовательное учреждение высшего образования «Самарский государственный технический университет» 443100, г. Самара, ул. Молодогвардейская, 244. Главный корпус
Отпечатано в типографии Самарского государственного технического университета
443100, г. Самара, ул. Молодогвардейская, 244. Корпус № 8
110
