- •Практическое занятие 1. Основы логического программирования
- •Основные парадигмы программирования
- •Понятие предиката
- •Унификация - процесс нахождения решения в Прологе
- •Факты и правила в Прологе
- •Пример программы на Прологе
- •Практикум 1-1
- •Практикум 1-2
- •Практикум 1-3
- •Контрольное задание 1 Исходные данные
- •Задание 1. Генеалогическое дерево
- •Задание 2. Представление правил
- •Практикум 2-1
- •Практикум 2-2
- •Стандартные предикаты
- •Ввод и вывод
- •Практикум 2-3
- •Описание арифметических операций
- •Практикум 2-4
- •Самостоятельные задания
- •Практическое занятие 3. Управление процессом решения задачи. Поиск с возвратом. Рекурсия
- •Использование предиката fail
- •Практикум 3-1
- •Использование предиката cut
- •Практикум 3-2
- •Использование рекурсии
- •Практикум 3-3
- •Практикум 3-4
- •Практикум 3-5
- •Практикум 3-6
- •Хвостовая рекурсия
- •[Head|Tail] [Голова|Хвост]
- •Практикум 4-1
- •Встроенный предикат findall
- •Практикум 4-2
- •Вычисление длины списка
- •Практикум 4-3
- •Проверка принадлежности элемента списку
- •Практикум 4-4
- •Слияние двух списков
- •Практикум 4-5
- •Вычисление суммы списка чисел
- •Практикум 4-6
- •Практикум 4-7
- •Удаление элемента из списка
- •Практикум 4-8
- •Получение элемента списка по его номеру
- •Практикум 4-9
- •Запись элементов списка в обратном порядке
- •Поиск максимального (минимального) элемента в списке
- •Практикум 4-10
- •Самостоятельные задания
- •Контрольное задание 2 Исходные данные
- •Практическое занятие 5. Решение логических задач
- •Пример простой логической задачи (два измерения)
- •Практикум 5-1
- •Практикум 5-2
- •Пример задачи (три измерения)
- •Практикум 5-3
- •Пример задачи (альтернативные высказывания)
- •Практикум 5-4
- •Практикум 5-5
- •Самостоятельные задания
- •Контрольное задание 3 Исходные данные
- •Задача 1
- •Задача 2
- •Задача 3
- •Задача 4
- •Задача 5
- •Задача 6
- •Задача 7
- •Задача 8
- •Задача 9
- •Задача 10
- •Задача 11
- •Задача 12
- •Задача 13
- •Задача 14
- •Задача 15
- •Задача 16
- •Задача 17
- •Задача 18
- •Задача 19
- •Задача 20
- •Задачи повышенной сложности
Практикум 2-1
|
Создайте базу знаний (БЗ), хранящую сведения о студентах (не менее 10) и их средних баллах. Напишите правило, определяющее «хороших» (по среднему баллу) студентов. Практически у каждого студента есть какое-то хобби (возможно, не одно). Добавьте факты с информацией о хобби в БЗ. Создайте запросы для ответов на следующие вопросы:
|
Множество правил, заголовки которых содержат одинаковые имена предикатов и одинаковое количество аргументов, называются процедурой. На рис. 2.1 представлены правила, которые реализуют процедуру нахождения наибольшего из двух действительных чисел, определяемую предикатом вида max(number1, number2, max_number). Считается, что между этими правилами неявно присутствует соединительный союз "или".
Рис. 2.1. Нахождение максимального числа
Практикум 2-2
|
Создайте программу вычисления максимального и минимального из трех целых чисел.
|
В секции goal задается внутренняя цель программы. Цель может состоять из нескольких предикатов (из нескольких подцелей). Если внутренняя цель не используется, то в процессе работы есть возможность вводить в диалоговом окне внешнюю цель.
Часто целью является сложный запрос к программе. Для разрешения какой-либо сложной цели Пролог должен разрешить все его подцели, создав при этом необходимое множество связанных переменных. Если же одна из подцелей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с другими значениями переменных. Этот процесс называется "поиск с возвратом".
Стандартные предикаты
В систему Пролог включено более 200 встроенных стандартных предикатов и более дюжины стандартных доменов. В случае использования этих предикатов и доменов нет необходимости объявлять их в программе.
Ввод и вывод
С помощью встроенных предикатов ввода-вывода программа, взаимодействуя с пользователем, может принимать от него данные и печатать результаты. Рассмотрим простейшие предикаты ввода\ вывода.
Ввод данных.
readln(X) – для ввода строки
readint(X) – для ввода целых чисел
readchar(X) – для ввода символов
readreal(X) – для ввода действительных чисел
По умолчанию данные вводятся с клавиатуры терминала, ввод завершается нажатием клавиши “Enter”.
Для вывода используется предикат
write(T1,T2,…,Tn).
Он выводит значения T1,T2,…,Tn на текущее устройство вывода, по умолчанию, на экран. Предикат write(…) не допускает повторного согласования и выполняется лишь один раз. Переход на новую строку при печати данных обеспечивается встроенным предикатом nl, название которого образовано аббревиатурой (начальными буквами) слов «newline» новая строка. Как и write, предикат nl выполняется только один раз.
Перечень и назначение стандартных предикатов приведен в Приложении 1.
Рассмотрим пример программы, в которой используется обращение к стандартным предикатам (рис.2.2):
Рис. 2.2. Использование стандартных предикатов
В этой программе запрашивается Ваше имя, а затем оно выводится на экран.