Передовица » Макулатура » ИиО » Пролог-Д на Агате

Пролог-Д на Агате (N3/1991)

М. Алексеев. Группа сайта просит вас связаться с нами! (ЗАЧЕМ ЭТО?)

Пролог-Д - учебная версия языка логического программирования Пролог, разработанная и реализованная на "Ямахе" и БК-0010 в Йошкар-Оле С.Г. Григорьевым с сотрудниками. Изучение основ Пролога-Д является важной частью одного из новых школьных курсов ОИВТ [1]. К сожалению, до сих пор очень многие представляют себе программирование состоящим в основном из Бейсика или, в лучшем случае, из процедурных языков типа Паскаля. Логическое же программирование открывает для учащихся, да и для преподавателей, как бы новое измерение в информатике. Кроме того, знакомство с Прологом, как с языком построения баз знаний и запросов к ним, предопределяет гораздо более осмысленное обращение с традиционными базами данных и экспертными системами.

Нам очень хотелось показать Пролог своим ученикам, но найти какие-либо сведения о его реализациях на "Агате" не удалось. Пришлось реализовать самим. За помощь в этом автор признателен С.Г. Григорьеву, В.В. Малахову, А.Г. Уртминцеву и В.А. Цикозе.

Описание Пролога-Д, приёмы программирования и элементы методики преподавания изложены ранее в серии статей [2-5]. В этом Агат-версия практически ничем не отличается от ямаховской, поэтому ниже будут описаны в основном особенности пользовательского интерфейса и системной реализации Пролог-Д на "Агате".

Особенности языка Пролог-Д на "Агате"

Имена фактов, правил, переменных могут иметь неограниченную длину. Числа могут быть не только целыми, но и дробными, возможна экспоненциальная форма представления. Конструкция "список" пока не реализована. Не допускается использование одноимённых предикатов с разным числом аргументов. Запись выражения (факта, правила, вопроса) завершается символом ";". В строке может быть несколько таких выражений. Допускается структурная запись правил, пробелы и символы перевода строки между предикатами игнорируются. Имеются следующие встроенные предикаты:

БОЛЬШЕ(А,В), МЕНЬШЕ(А,В), РАВНО(А,В),
НЕ(предикат), !(отсечение), ИСТИНА,
ЛОЖЬ, ПС (перевод строки),
ВЫВОД(переменная/число/текст),
ВВОДСИМ(текст), ВВОДЧИС(число),
СЛОЖЕНИЕ(А,В,С), УМНОЖЕНИЕ(А,В,С),
ТОЧКА(X,Y,ЦВЕТ'), ЗАКРАСКА(X,Y,Ц),
ЛИНИЯ(X,Y,U,V,Ц),
ПРЯМОУГОЛЬНИК(X,Y,U,V,Ц),
ОКРУЖНОСТЬ(X,Y,R,Ц),
для управления системой
ОТВЕТЫ(на экран/на бумагу),
ОПТИМИЗАЦИЯ(нет/есть),
ТРАССИРОВКА(нет/на экран/на бумагу),
ЭКРАН(режим) (аналог процедуры РЖМ Рапиры).

По умолчанию для графических предикатов включается режим СГК - цветная графика: X от 0 до 127, Y от 48 до 127, совмещённая с шестью текстовыми строками. Переключение графической и текстовой страниц производится правой функциональной клавишей "8".

Загрузка системы

Система "Пролог-Д" работает на ПЭВМ "Агат" с дисководом на 140К или 840К в Рапира-интерпретаторе системы "Школьница" версии 1.3 (дата версии 17.10.86 или более поздняя). После загрузки Рапира-интерпретатора и получения приглашения "#" следует ввести команду

ЗАПУСК ПРОЛОГ;

Система "Пролог-Д" занимает почти всю память ПЭВМ, поэтому, если до её запуска вы работали с другими Рапира-программами, вам следует перевызвать систему командой

РАПИРА;

и затем уже запускать Пролог.

Во время загрузки на экране дисплея последовательно появляются две красочные заставки. Последняя предупреждает о том, что для повторного входа в Пролог-Д из Рапира-интерпретатора (приглашение "#") следует вводить

ПРО();

Если же произойдёт сбойный выброс (из-за нехватки памяти) и в верхней строке появится слово ОШИБКА, для возврата следует вводить

ВЫХОД;ПРО();

При входе в Пролог-Д в верхней строке экрана появляется строка основного меню

Диалог Редактор База Режим Выход

по которому клавишами-стрелками ВЛЕВО, ВПРАВО можно перемещать инверсный прямоугольник-указатель и делать выбор клавишей ВВОД.

"Выход" - это выход из "Пролога-Д" в Рапира-интерпретатор.

Диалог с системой

Выбрав в основном меню "Диалог" и получив в нижней строке экрана приглашение ":", можно вводить факты, правила и вопросы, разделённые и завершающиеся символом ";". При вводе можно, как и в Рапира-интерпретаторе, перемещать курсор по экрану клавишами-стрелками, используя ранее набранные строки, а также применять клавиши РЕД (включение/выключение "читающего" курсора), F2 и F3 (удаление и вставка). Ошибочные утверждения и вопросы система отвергает, синтаксически правильные утверждения (факты и правила) запоминает в базе знаний, на вопросы пытается отвечать. Например:

:МАМА(ЛИЗА,НАТАША);
:МАМА(НАТАША);
МАМА с 1 аргументом
 должно быть 2
:МАМА(НАТАША,ТАНЯ);
:?MAMА(ЛИЗА,ТАНЯ);
нет
:?MAMА(ЛИЗА,Д);
Д=НАТАША
:?MAMA(M,D;
Ошибка в MAMA(M,D
:?MAMA(M,D);
М=ЛИЗА
D=НАТАША
M=НАТАША
D=ТАНЯ
:?MAMA(_,ДОЧЬ');
ДОЧЬ=НАТАША
ДОЧЬ=ТАНЯ
:?ПАПА(ДОМ,19);
не знаю
:БАБУШКА(Б,В)<-МАМА(Б,М),MAMA(M,B); 
:?БАБУШКА(К,ТАНЯ);
К=ЛИЗА
:СЛОЖЕНИЕ(6,10,16);
Смените имя,
СЛОЖЕНИЕ - встроенный предикат
:?СЛОЖЕНИЕ(6,10,16);
да
:?УМНОЖЕНИЕ(-4,Х,7);
X=-1.75
:

Нажатие клавиши ВВОД без утверждения или вопроса возвращает систему в основное меню.

Работа с текстами программ

При выборе в основном меню поля <Редактор> включается стандартный текстовый редактор системы "Школьница", настроенный на работу с Пролог-системой.

Здесь привычным для работавших с этим редактором образом действуют все функциональные клавиши и директивы меню редактора: КАТАЛОГ, СЧИТАТЬ ФАЙЛ, ЗАПИСАТЬ ФАЙЛ, СТЕРЕТЬ ФАЙЛ, ДОПИСАТЬ ФАЙЛ, РАБОТАТЬ С ДЗУ 1-2, ОЧИСТИТЬ БУФЕР, ВЫДАТЬ НА БУМАГУ, ЗАПОМНИТЬ ТЕКСТ. Отличие от редактора, вызванного из Рапиры, проявляется в двух директивах.

Директива ВЫЙТИ позволяет вернуться в основное меню Пролог-системы (а не в Рапиру) без анализа редактируемого текста.

По директиве КОНЕЦ ОПИСАНИЯ включается не Рапира-интерпретатор, а дополнительное меню Пролог-интерпретатора: следует ли очистить базу знаний перед интерпретацией новой Пролог-программы или же база знаний будет дополняться. Затем происходит интерпретация Пролог-программы с фиксацией ошибок, если таковые встречаются. Ошибочные утверждения не включаются в базу знаний. Можно отказаться от интерпретации программы, нажав в дополнительном меню клавишу РЕД. С обработкой или без обработки программы система возвращается в основное меню.

При первом входе в редактор буфер пуст, при выходах тексты программ сохраняются в буфере и могут быть использованы при последующих входах. Исключение составляют случаи использования графики, когда буфер редактора очищается.

Работа с базой знаний

При выборе в основном меню <База> появляется меню работы с базой знаний:

Сводка Удалить Очистить базу

"Сводка" - краткая сводка содержимого текущей базы знаний. Например, после вышеприведённого диалога она будет такой:

   Факты
2 МАМА(ЛИЗА,НАТАША)
   Правила
1 БАБУШКА(Б,В)

Видно, что в текущей базе знаний - два факта с именем МАМА, показан первый факт, и понятно, что новые факты с этим именем должны иметь два аргумента. В базе знаний есть также правило БАБУШКА - двухаргументное и одновариантное. Если же мы в диалоге дополним определение правила БАБУШКА отцовской линией

:БАБУШКА(Б,В)<-МАМА(Б,П),ПАПА(П,В);

это правило станет двухвариантным, и в "сводке" перед ним появится 2.

После нажатия любой клавиши в "Сводке" выдаются также сведения о встроенных предикатах системы.

"Удалить" - позволяет удалить все факты и правила с указанным именем.

"Очистить базу" - позволяет уничтожить все факты и правила со всеми именами, возвращая базу знаний к исходному состоянию.

Встроенные предикаты защищены от удаления и очистки.

Режимы работы системы

При выборе в основном меню "Режим" появляется меню режимов работы системы:

Оптимизация Трассировка Ответы

При выборе одного из режимов ниже появляется меню его возможных состояний, текущее состояние выделено инверсно.

"Ответы" - "на экран/на бумагу" - режим вывода ответов системы на вопросы. Обычно ответы выводят на экран, но бывает нужен протокол или ответ не умещается на экране. Естественно, что для вывода на бумагу принтер должен быть включён.

"Трассировка" - "нет/на экран/на бумагу/" - во время поиска в базе знаний ответа на вопрос на бумагу могут выводиться промежуточные запросы и ответы на них. Глубина вложенности запросов отображается отступами с точками. Например:

:ФАКТОРИАЛ(0,1)<-!;
:ФАКТОРИАЛ(N,F)<-СЛОЖЕНИЕ(М,1,N),
:                ФАКТОРИАЛ(М,Е),
:                УМНОЖЕНИЕ(N,Е,F);
:?ФАКТОРИАЛ(3,Ф);
.?СЛОЖЕНИЕ(М, 1, 3)
.М= 2
.?ФАКТОРИАЛ( 2,Е)
..?СЛОЖЕНИЕ(М, 1, 2)
..М= 1
..?ФАКТОРИАЛ( 1,Е)
...?СЛОЖЕНИЕ(М, 1, 1)
...М= 0
...?ФАКТОРИАЛ( 0,Е)
...Е= 1
...?УМНОЖЕНИЕ( 1, 1,Ф)
...Ф= 1
..Е= 1
..?УМНОЖЕНИЕ( 1, 2,Ф)
..Ф= 2
.Е= 2
.?УМНОЖЕНИЕ( 2, 3,Ф)
.Ф= 6
Ф= 6

Сообщения трассировки выводятся на экран зелёным цветом, встроенного предиката ВЫВОД - жёлтым, а диалог обычно идёт в голубом цвете, если это не изменено управляющими символами или функциональными клавишами. Режим трассировки очень удобен не только при отладке программ, но и при объяснении учащимся принципов поиска решений.

"Оптимизация" - "нет/есть" - режим запрещения/разрешения изменения порядка рассмотрения составляющих правило утверждений. Такие перестановки могут отрицательно повлиять на результаты рассмотрения некоторых графических и вычислительных правил, однако обычно рассмотрение с оптимизацией идёт гораздо быстрее, так как при этом в первую очередь рассматриваются наиболее определённые утверждения, дерево поиска невелико и до менее определённых утверждений очередь либо не доходит (при отрицательном результате очередного рассмотрения), либо они становятся более определёнными благодаря результатам предыдущих рассмотрений. Например, без оптимизации из двух вопросов

?MAMA(Б,М),МАМА(М,ТАНЯ); 
?MAMA(М,ТАНЯ),МАМА(Б,М);

ответ на второй вопрос будет получен быстрее, чем на первый. Включив трассировку, увидим:

:?MAMA(Б,М),МАМА(М,ТАНЯ);
.?MAMA(Б,М)
.Б=НАТАША
.М=ТАНЯ
.Б=ЛИЗА
.M=HATAWA
.?MAMA(ТАНЯ,ТАНЯ)
.нет
.?MAMA(НАТАША,ТАНЯ)
.да
Б=ЛИЗА
М=НАТАША

В этом случае система сначала собирает все имеющиеся пары Б и М, т.е. всё, что связано именем МАМА (таких пар может оказаться много, это займёт время и память), потом перебирает в этих парах вторые элементы и проверяет их уже на первом месте в паре с элементом ТАНЯ, находит всё-таки М - НАТАША и с ним Б - ЛИЗА. Более сложные примеры без оптимизации могут вообще не дать результата - не хватит памяти.

:?MAMA(М,ТАНЯ),МАМА(Б,М);
.?MAMA(М,ТАНЯ)
.М=НАТАША
.?MAMA(Б,НАТАША)
.Б=ЛИЗА
M=HATAШA
Б=ЛИЗА

Здесь сразу однозначно определено значение М - НАТАША, а затем по нему - значение Б - ЛИЗА.

С оптимизацией же первый вопрос будет обрабатываться в том же порядке, что и второй:

:?MAMA(Б,М),МАМА(М,ТАНЯ);
.?MAMA(М,ТАНЯ)
.М=НАТАША
.?MAMA(Б,НАТАША)
.Б=ЛИЗА
М=НАТАША
Б=ЛИЗА

Впрочем, на оптимизирующие перестановки тоже уходит какое-то время.

Рассмотрим ещё правило:

:ПЕЧАТЬ(СТРОКА')<-ВЫВОД(СТРОКА'),ПС;

Без оптимизации:

:?ТРАССИРОВКА(НЕТ);
:?ОПТИМИЗАЦИЯ(НЕТ);
:?ПЕЧАТЬ(ПРИМЕР);
ПРИМЕР
да

Здесь - перевод строки после вывода; а с оптимизацией

:?ОПТИМИЗАЦИЯ(ЕСТЬ);
:?ПЕЧАТЬ(ПРИМЕР);

ПРИМЕР да

- перевод строки перед выводом.

Особенности реализации на "Агате"

Интересно, что одна из первых реализаций Пролога на ПЭВМ была осуществлена в начале 70-х гг. в Марселе на предке "Агата" - "Apple-II" - на Паскале.

Описываемая версия Пролога-Д сделана на Рапире. Пролог-система использует и ДОС, и системный стек, и ввод-вывод "Школьницы", и редактор текстов, и графику Рапиры, и арифметику с плавающей запятой. Примерно 20К занимают написанные на Рапире программы диалоговой оболочки Пролог-системы и обработки Пролог-программ, баз знаний и запросов, основанные на широком использовании такого динамичного типа данных, как кортежи. В отличие от традиционного для Пролог-систем подхода, основанного на поиске решения "в глубину" с возвратами (бектрекинг), здесь применён поиск "в ширину", в один проход, когда составляющие правило предикаты анализируются с использованием всего множества значений переменных, давших согласующиеся результаты при анализе предыдущих предикатов. При этом для разрешения тупиковых ситуаций или в интересах оптимизации предусмотрены изменения в порядке просмотра предикатов. Система позволяет работать с Пролог-программами объёмом до 1,5-2К (50-100 предложений) и, несмотря на двойную интерпретацию, показывает удовлетворительное быстродействие. Пролог-система стала частью <Школьницы>, и освоение Пролога-Д облегчается привычным для работавших с Рапирой окружением и управлением.

Возможность реализации такой системы в рамках "Школьницы" в начале работы над проектом была неочевидна, и результат в очередной раз демонстрирует мощь Рапиры.

Конечно, это далеко не инструментальный Пролог, позволяющий создавать интеллектуальные экспертные системы, но эта система обеспечивает полную поддержку машинного курса по учебнику [1]. Это подтверждает опыт работы с ней на уроках ОИВТ в VIII-XI классах нашей школы в 1990/91 учебном году.

С вопросами и заявками на приобретение системы можно обратиться по адресу:

456321, Челябинская обл., г. Миасс, пр. Октября, 25, школа N18, Алексееву Михаилу Николаевичу.

    Литература
  1. Каймин В.А., Щёголев А.Г., Ерохина Е.А., Федюшин Д.П. Основы информатики и вычислительной техники. М.: Просвещение, 1989.
  2. Григорьев С., Морозов М. Давайте попробуем Пролог // Информатика и образование. 1987. N4.
  3. Каймин В., Григорьев С., Угринович Н., Щёголев А. Элементы логики и начала языка Пролог // Информатика и образование. 1989. N4.
  4. Каймин В., Григорьев С. Пролог в школьной информатике // Информатика и образование. 1990. N2.
  5. Григорьев С. Программирование на Прологе-Д // Информатика и образование. 1990. N5.

* * *

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *