Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Funktsionalnoe_i_logicheskoe_programmirovanie.doc
Скачиваний:
31
Добавлен:
19.01.2023
Размер:
1.75 Mб
Скачать

Лабораторная работа 5. Управление выводом в Прологе. Простейшие рекурсивные программы.

В данной лабораторной работе мы приступаем к изучению языка Пролог – языка логического программирования. Язык Пролог является декларативным языком, то есть «описательным». В данном пособии примеры приведены на VisualProlog 5.2, однако, существует много версий языка Пролог и все лабораторные работы могут выполняться в любой из них.

5.1 Факты и правила. База знаний. Запросы.

Программа на Прологе чаще всего представляет собой совокупность знаний о некоторых объектах предметной области. Основной программной единицей Пролога является предикат – функция, аргументами которой являются объекты, и которая возвращает логическое значение. Предикаты бывают двух основных типов – факты и правила. Факт – это некоторое истинное утверждение о предметной области. Он имеет заголовок и список аргументов, заключенный в круглые скобки и разделяющийся запятыми, и заканчивается точкой. Например, пусть у нас есть следующая информация об успеваемости студентов:

Имя

Предмет

Оценка

Артем

математика

3

Влада

математика

5

Влада

информатика

4

Сагит

философия

3

Сагит

информатика

4

Рустем

философия

3

Назовем наш предикат-факт именем student и запишем следующую базу знаний, для этого в меню File выбираем пункт New и в появившемся окне наберем текст:

У нас описаны два раздела – раздел предикатов, где мы указываем заголовки предикатов и тип их аргументов и раздел клозов – непосредственно сами факты-предикаты. Служебное слово nondeterm перед именем предиката означает, что данный предикат может быть согласован более одного раза. Для запуска программы нам нужен еще один раздел – раздел цели. Там мы можем задать всевозможные запросы к нашей базе знаний, используя константы и переменные. Переменные в Прологе всегда начинаются с заглавной буквы, а также могут быть анонимными (вспомните Haskell) и обозначаться знаком подчеркивания. Покажем различные типы запросов к нашей базе знаний:

Запрос на естественном языке

Описание в разделе цели

Результат

Верно ли, что Влада сдала математику на 5?

Верно ли, что Сагит сдал философию на 4?

На какую оценку Артем сдал математику?

На какую оценку Артем сдал информатику?

Какие студенты сдали информатику на 4?

Есть ли студенты, сдавшие математику на 5?

Какие предметы Сагит сдал на 4?

Есть ли в базе информация о том, как Рустем сдал математику?

Если же мы захотим задать более сложные запросы к нашей базе знаний, придется использовать второй тип предикатов - правила. Правило, помимо заголовка и списка аргументов, имеет список предикатов-подцелей. Правило–предикат будет иметь истинное значение, если выполнены все его подцели, то есть правило есть конъюнкция своих подцелей. Например, если требуется вывести имена студентов и названия тех предметов, которые они сдали не хуже чем на 4, можно задать новый предикат таким образом (не забыв добавить его описание в раздел predicates):

Результат выполнения: