Описание языка
и интерпретатора Пролога
Каймин В.А., Каймин С.В., Уртминцев А.Г.
1.
Назначение языка и системы программирования Пролог
Язык
Пролог и система
программирования Пролог предназначены для практикума по
информатике с базами знаний, экспертными системами и изучения элементов математической
логики и принципов логического вывода на ЭВМ.
Настоящая версия языка и системы
программирования Пролог были созданы в 1989-1991 гг. для поддержки школьного и
вузовского практикума по информатике на базе персональных компьютеров IBM PC.
Первая версия интерпретатора Пролога была создана для школьных
персональных компьютеров Ямаха в Крыму Серегем Кайминым и Андреем Уртминцевым в августе
Данная версия интерпретатора
Пролога вместе с базовым пакетом
офисных программ поставлялась на всем
спектре отечественных школьных ЭВМ и в том числе для отечественных компьютеров
модели IBM PC.
Спецификации настоящей
версии языка Пролог были созданы В.А.Кайминым тогда
же одновременно со сдачей первого пробного учебника по информатике для средних
школ в соавторстве с А.Щеголевым и Д.Боголюбовым (Федюшиным).
Язык Пролог был включен в самый первый
пробный учебник по информатике в целях изучения элементов математической
логики, без которых невозможно объяснение принципов огбработки
информации и работы вычислительных машин.
Основным результатом от включения в
курс информатики языка Пролог стало более углубленное изучение логики в школах
и вузах, включая математические принципы логического вывода и проектирования
баз знаний и экспертных систем.
Среди современных систем наиболее
широкое распространение через Интернет получили зарубежные интерпретаторы и
системы программирования Visual Prolog, GNU Prolog и CWI Prolog.
Система Visual
Prolog -
наиболее профессиональная коммерческая система логического программирования.
Демонстрационную версию этой системы можно найти и загрузить через Интернет.
Системы GNU Prolog
и CWI Prolog - это системы логического
программирования Open
Source,
свободно распространяемые и устанавливаемые на основе генеральной публичной
лицензии GNU.
Современные системы
программирования на языке Prolog построены
на тех же самых базовых принципах логического программирования и математических
процедурах логического вывода, на которых были основаны и реализованы самые
первые отечественные системы логического программирования.
2. Описание языка
Пролог
2.1. Базовые понятия языка Пролог
Основными
понятиями в языке Пролог являются факты,
правила и вопросы. Из фактов и правил образуются описания данных, процедур и
программы на языке Пролог. Вопросы – это основное средство ведения диалога с
базами знаний и программами, имеющимися в памяти ЭВМ.
Факты в Прологе служат для описания
конкретных данных и простейших сведений. Примеры фактов:
мама( зина,Вова ) – Зина – мама Вовы
папа( миша,Вова ) –
Миша – папа Вовы
Семантика: каждый факт
в Прологе интерпретируется как некоторое истинное утверждение. Опираясь
на эти утверждения, интерпретатор Пролога рассматривает различные вопросы как
утверждения, которые должны быть доказаны или опровергнуты исходя из имеющихся
фактов и правил.
Группы фактов могут образовывать
данные. Совокупность данных, размещаемых на дисках, образуют базы данных. Общее
определение данных в Прологе:
данные:
<факт>;
[<факт>;...]
Правила используются для описания
определений, процедур принятия решений и обработки данных. Примеры
использования правил для описания определения понятия "родитель":
родитель(x,y) ¬ папа(x,y); – Родитель – это папа или мама
родитель(x,y) ¬ мама(x,y).
Процедуры
образуются из некоторых групп правил. Общая форма описания процедур в Прологе:
процедура:
[<факты>]
<правило>; [<правило>; ...]
Пример описания рекурсивной процедуры,
в которой определяемое понятие задается через самое себя:
предок(x,y) ¬родитель(x,y);
предок(x,z) ¬родитель(x,y), предок(y,z);
Программа на Прологе – это совокупность
процедур над определенными данными:
программа:
<процедуры>;
[<данные>;]
Описания баз данных
на Прологе образуют совокупность описаний данных:
база данных:
<данные>;
[<данные>; ... ]
Базы знаний на Прологе описываются
наборами фактов и правил определения обобщенных понятий над ними:
база знаний:
<данные>;
<правила>;
Вопросы в Прологе служат запросами к
базам данных и знаний, а также обращениями к процедурам и программам. Примеры
вопросов:
? мама( x,Вова
);
? предок( x,Вова );
2.2.
Описания фактов
Факты
в Прологе описываются в следующей
форме:
факт:
<имя>(<арг>[,<арг> ... ]);
Описания фактов начинается с имени. В
роли имен могут использоваться любые последовательности букв и цифр,
начинающиеся с буквы:
имя:
<буква>[<буква><цифра>
... ]
Буквы
могут быть выбраны из русского и латинского алфавитов.
После имени в описаниях фактов задается список аргументов, заключаемых в
круглые скобки. В конце описания каждого из фактов ставится точка с запятой.
В роли аргументов могут быть указаны
любые слова, словосочетания и числа. Словосочетание – это любая
последовательность слов, соединенных знаком подчеркивания.
словосочетание:
<слово>[<слово>
...]
Слова, как и имена, – это любые
последовательности из букв и цифр, начинающиеся с букв:
слово:
<буква>[<буква><цифра>
...]
Числа в данной реализации Пролога – это
только целые числа (отрицательные – со знаком минус):
число:
[–]<цифра>[<цифра> ..]
Примеры записи чисел – 0, 1, +3, –25.
2.3.
Правила записи вопросов
Вопросы
в Прологе служат для записи простых или сложносоставных
запросов к базам знаний или обращений к процедурам и программам. Ответами на
запросы к базам данных и знаний могут быть логические значения ДА (истина) или НЕТ (ложь) либо список конкретных данных, отвечающих запросу.
Общая форма записи сложносоставных
вопросов:
сложный вопрос:
?
<вопрос>[,<вопрос> ..];
В сложносоставных вопросах составляющие
его подвопросы разделяются запятыми. Любой вопрос в
Прологе начинается со знака вопроса "?"
и заканчивается знаком "точка с запятой". Пример сложносоставного
вопроса:
? папа(х,у),папа(y,вова);
Простые вопросы имеют следующую форму
записи:
простой вопрос:
? <имя>(<арг>[,<арг> ..]);
Здесь <имя> – это имя
некоторого факта или правила в программе или базе знаний. Количество аргументов
в таком простейшем вопросе должно строго совпадать с количеством аргументов
(параметров) в описаниях соответствующих фактов и правил.
В роли аргументов в вопросах могут указываться
как конкретные значения, так и переменные. Если в вопросе указаны только конкретные
значения, то ответом будет логическое значение ДА или НЕТ.
Если в вопросе
указываются переменные, то при положительном
ответе дополнительным результатом будет вывод конкретных значений переменных,
указанных в исходном вопросе.
В роли переменных в Прологе могут
указываться латинские и русские буквы, как строчные, так и прописные: a, b, c,
..., x, y, z; A, B, C, ..., X, Y, Z; а, б, в, ...
, э, ю, я; А, Б, В, ..., Э, Ю, Я.
В качестве имен переменных могут употребляться любые
слова и словосочетания, заканчивающиеся знаком апострофа ['].
Примеры имен: дед
', внук’, x1
', оценка4 '
и т.п.
В вопросах и правилах на Прологе
аргументы могут иметь неопределенные значения. Для этого вместо конкретных значений
или имен переменных в вопросе указывается знак подчеркивания
[ _ ].
Пример вопроса с использованием
неопределенных значений:
? мама( мать', _ );
Ответом на указанный вопрос будет
перечень имен всех матерей, сведения о которых имеются в базе знаний.
2.4.
Запись правил и процедур
Правила в Прологе используются для
описания определений, запросов к базам данных, а также обращений к другим
правилам и процедурам. Примеры записи правил:
родитель(x,y) ¬ мама(x,y);
родитель(x,y) ¬ папа(x,y);
бабушка(x,z) ¬ мама(x,y),родитель(y,z);
дедушка(x,z) ¬ папа(x,y),родитель(y,z);
Общая
форма записи правил на Прологе:
правило:
<заголовок> ¬ <определение>;
Здесь <заголовок> отделяется от <определения> двумя знаками:
¬ "меньше"
и "тире". В конце правила записывается "точка с запятой".
Заголовки правил
имеют следующую форму:
заголовок:
<имя>(<парам>[,<парам> ...])
Здесь <имя> – это любое
слово или словосочетание. В роли параметров в заголовках правил могут
указываться переменные или конкретные значения либо неопределенные значения с
помощью знака подчеркивания [ _ ].
Описание заголовка служит образцом
записи обращений к правилам и процедурам. Определения в правилах образуются из
обращений к другим правилам и процедурам, а также из запросов к данным и
встроенным процедурам Пролога. Общая форма записи определений в правилах:
определение:
<заголовок>[,<заголовок> ...]
Запросы и определения
отделяются в описаниях правил запятыми и записываются по тем же правилам, что и
заголовки.
Порядок записи обращений и запросов в
определениях правил в Прологе существенен, поскольку он задает порядок их
применения и выполнения.
Нарушение порядка записи в вопросах и правилах может привести к значительному
изменению конечных результатов выполнения правил и процедур.
Результатом выполнения любых процедур и правил в Прологе всегда являются
логические значения – ДА либо НЕТ, соответствующее
успеху или неуспеху их применения.
Применение правил в Прологе совпадает с проверкой условий в логике.
Соответственно форма записи обращений к правилам и процедурам в Прологе
совпадает с формой записи предикатов в математической логике.
В отличии от
математической логики, где существенны только логические значения этих
предикатов, в Прологе результатом применения правил и процедур может быть
конкретизация значений переменных, указанных в обращениях к ним.
Пример обращения к процедурам:
?
родитель(x,вова);
x
= зина
Полученный ответ имеет двойной
результат: во-первых, подтверждение истинности наличия "родителей"
у "вовы", а во-вторых, конкретизация
переменной "х" в
обращении к процедуре "родитель" с именем "вова",
которая дает значение "х = зина".
Конкретизация значений переменных в запросах и обращениях к процедурам и правилам
в Прологе может иметь различного рода побочные эффекты – вывод на экран линий,
точек, картинок, сообщений, запись и считывание данных и т.п.
Результаты выполнения процедур и
программ на Прологе в этом смысле могут быть эквивалентны результатам
выполнения программ на других языках программирования для ЭВМ.
2.5. Встроенные предикаты Пролога
Для операций над числами в
рассматриваемой версии Пролога имеются следующие арифметические предикаты:
Предикат: |
Смысл: |
|
СУММА(
x,y,z ) ПРОИЗВ( x,y,z ) ЧАСТНОЕ( x,y,z ) ОСТАТОК( x,y,z ) РАВНО( x,y ) БОЛЬШЕ( x,y ) МЕНЬШЕ(
x,y ) |
{
x+y = z
} {
x*y = z
} {
[x/y] = z } {
x – [x/y] = z } {
x = y } {
x > y } {
x < y } |
|
Арифметические предикаты по смыслу и функциям существенно отличаются от
арифметических операций в традиционных языках программирования. Прежде всего любой из этих предикатов вырабатывает логическое
значение ИСТИНА или ЛОЖЬ в зависимости от того, имеет или
не имеет решение арифметическая задача, представляемая предикатом.
Примеры:
? СУММА( 2,2,5 );
НЕТ
? СУММА( 2,2,z );
z
= 4
? СУММА( x,2,5 );
x
= 3
Арифметические предикаты позволяют
решать простейшие арифметические уравнения, автоматически производя
соответствующие вычисления, если эти решения существуют.
Обращения к предикатам, связанным с
умножением и делением целых чисел, может дать отрицательный результат из-за
отсутствия решений в некоторых случаях:
? ПРОИЗВ( 2,y,5 );
НЕТ
? ЧАСТНОЕ( 5,2,z );
z
= 2
? ОСТАТОК( 5,2,r );
r
= 1.
Предикаты БОЛЬШЕ
и МЕНЬШЕ вместе
с предикатом РАВНО
могут использоваться для сравнения различных численных
переменных и констант. А предикаты "неменьше"
и "небольше" могут быть определены через
отрицание предикатов БОЛЬШЕ и МЕНЬШЕ:
небольше(x,y) ¬ НЕ( БОЛЬШЕ(x,y) );
неменьше(x,y) ¬ НЕ( МЕНЬШЕ(x,y)
);
Предикат РАВНО может использоваться также для сравнения значений переменных
и констант. При этом переменные могут быть и числовыми, и символьными, и других
типов. Примеры:
? РАВНО(5,z);
z
= 5
? РАВНО(x,миша);
x
= миша
? РАВНО(коля,оля);
НЕТ.
Вывод графических изображений
на экран в настоящей версии интерпретатора
может
производиться с помощью следующих предикатов:
ТОЧКА( x,y,c );
ЛИНИЯ( x,y, u,v, c );
ОКРУЖНОСТЬ( x,y,c);
где (x,y) и (u,v) – координаты точек на
экране, а c –
цвет точки. Конкретные значения кодов цветов и диапазоны значений координат
точек на экране зависят от типа ЭВМ.
А. Графические
предикаты:
Предикат: |
Смысл: |
Пример: |
|
ФОН(c) |
задание цвета фона |
ФОН(8) |
|
ТОЧКА(x,y,c) |
вывод точки |
ТОЧКА(0,0,2) |
|
ЛИНИЯ(x,y,u,v,c) |
вывод отрезка линии |
ЛИНИЯ(0,0,50,50,4) |
|
ОКРУЖНОСТЬ(x,y,c) |
вывод окружности |
ОКРУЖНОСТЬ(90,90,10,
6) |
|
ЗАКРАСКА(x,y,c) |
закраска фигур |
ЗАКРАСКА(10,40,8) |
Б. Предикаты
ввода-вывода:
|
Предикат: |
Смысл: |
Пример: |
|
|
ВЫВОД(
<Значение> ) |
вывод
набора значений |
ВЫВОД
("имя", х) |
|||
ВВОДСИМВ (s) |
ввод
символьных данных |
||||
ВВОДЦЕЛ (n) |
ввод
числовых данных |
|
|||
ПС |
перевод
строки |
|
|||
В. Логические
предикаты:
|
Предикат: |
Смысл: |
Пример: |
||
ИСТИНА |
логическая
константа |
|
|
||
ЛОЖЬ |
логическая
константа |
|
|
||
НЕ(<Предикат>) |
отрицание
предиката |
НЕ(РАВНО(z,0)) |
|
||
3. Основные возможности интерпретатора
Пролога
Интерпретатор Пролога может
использоваться на персональных компьютерах IBM
PC с операционной
системой Windows или
MS DOS.
Для работы интерпретатора необходимы накопитель на жестком
диске и оперативной памяти не менее 250 Кбайт.
Интерпретатор находится на жестком диске
в каталоге с именем PROLOG. Запуск
интерпретатора проводится с помощью команды
> prolog
Если запуск прошел успешно, то на
экране появится изображение
(С) Файл
Диалог Окна Свободно: 303Кб.
18:40:54 |
-[_]---------------------
D:\PROLOG\FAMILY.PRL
------------------1-[]- |
мама(зина,вова);
|
папа(вова,лена); |
бабушка(x,z)<-мама(x,y),мама(y,z); |
бабушка(x,z)<-мама(x,y),папа(y,z); |
|
|
|
|
|
|
F1 Подсказка
F3 Открыть
Alt-F3 Закрыть F4 Диалог F10 Меню |
Интерпретатор
Пролога предоставляет следующие возможности:
– работа в
диалоге с базами данных и программами на Прологе;
– поиск и чтение программ и баз данных,
записанных на дисках;
– ввод и редактирование новых программ и
баз данных;
– запись на диски новых или
отредактированных программ;
– вывод на печать программ и баз данных
на Прологе.
Диалог с системой программирования Пролог
начинается нажатием клавиши F4.. Результатом выполнения команды будет
появление на экране окна диалога
Файл
Редактор Диалог
|
||
---- РЕДАКТОР — |
||
мама( |
ДИАЛОГ |
|
папа ( |
? мама(x,вова); |
|
бабуш |
x = зина |
|
бабуш |
ДРУГИХ РЕШЕНИЙ НЕТ |
|
|
|
|
|
|
|
|
|
|
|
||
|
||
|F1 Подсказка F3 Открыть Alt-F3 Закрыть F4 Диалог |
В режиме "Диалог" можно вводить вопросы по отношению к фактам и правилам,
имеющимся в программе или базе данных, которые размещены в оперативной памяти
ЭВМ. Поиск ответов на вопросы начинается нажатием клавиши ввода Enter. Ответы на вопросы выводятся здесь же в окне диалога
вслед за вопросом.
В окне
диалога можно задать серию вопросов
к базе знаний или программе на, вернуться к любому вопросу и запустить его еще раз с новыми данными, а
также просматривать протокол диалога в любом порядке. Для завершения диалога необходимо закрыть окно
диалога с помощью команды Alt–F3 – закрытие текущего окна.
Для
ввода и редактирования программ необходимо перейти в режим
"Редактор". Для перехода к
вводу необходимо нажать клавишу F3 – открытие нового окна
и приступить к построчному вводу текста. Ввод и редактирование текстов программ
на Прологе выполняется по правилам, традиционным для редакторов текстов.
Для
операций с файлами на дисках – записи,
чтения, поиске, необходимо перейти в режим "Файл" нажатием
клавиши F2 – работа с файлами. Результатом будет появление на экране
следующего меню:
Открыть.. F3
|
Сохранить F2
|
Сохранить как.. |
Смена Каталога.. |
Вызов DOS |
Выход Alt-X |
При
переходе в режим "Открытие файлов" на экране появится окно:
-[_] ---- Открыть окно — |
||
|
||
Имя
|
||
*.* |
||
Файлы |
||
APP.PRL |
PROLOG.EXE |
Открыть |
BLOK1.PRL |
PROLOG.HLP |
Отмена |
FAMILY.PRL |
..\ |
Помощь |
HOM1.PRL |
|
|
HOMES.PRL |
|
|
|
||
D:\PROLOG\*.*
|
||
APP.PRL 0 Сен 8, 1991
5:01pm |
Для записи программ на
диски необходимо перейти в режим работы с файлами (F2 – работа с файлами) и выбрать один из двух режимов:
Сохранить F2
Сохранить как ...
Режим "Сохранить
как ..." из меню "Файл" служит для сохранения файла, открытого в текущем
окне, под другим именем. При выполнении этой операции на экране появится
следующее окно, в котором нужно будет указать новое имя файла:
[_] ------ Сохранить как ------- |
Новое имя: D:\PROLOG\HOMES.PRL |
Окей Отмена |
|
Для
завершения работы необходимо перейти в меню "Файл"
и указать в нем "Выход". Этого же можно достичь нажатием
клавиш Alt – X. Если
в каком-либо окне измененная, но несохраненная программа, то вы будете
предупреждены об этом.