
- •Методическое пособие
- •Архангельск,
- •«К 2011 году большинство программ будут писать компьютеры…».
- •История и перспективы развития языка Пролог
- •2. Краткая инструкция по работе в среде pie32
- •3. Механизм вывода в системе Пролог. Примеры Термы и объекты
- •Запросы к базе данных
- •Унификация
- •Правила
- •Рекурсивные процедуры
- •Базы знаний
- •Решение логических задач
- •Арифметические выражения
- •Примеры программ
- •Часть II. Указания к выполнению контрольной работы
- •Введение
- •Генеалогическое дерево
- •Перевод генеалогического дерева в базу фактов
- •Составление правил искомых родственных связей в базе знаний
- •Лабораторная работа №3
- •Список литературы
Базы знаний
Как уже отмечалось, программа на языке Пролог, содержащая факты и правила, составляет базу знаний. При разработке программ на Прологе часто используют встроенные предикаты, т.е. предикаты, определяемые автоматически при инициализации интерпретатора Пролога.
Встроенные предикаты используются так же, как и определяемые пользователем предикаты. Единственное ограничение – встроенный предикат не может являться головой правила или появляться в факте. Просмотреть все встроенные предикаты можно запросом:
?- op(X,Y,Z).
Одним из наиболее часто используемых встроенных предикатов является предикат not/1 (отрицание). Этот предикат истинен, если его аргумент ложен, и наоборот.
Пример: Если мы определим правило
ложь(X) :- not(X).
то следующие запросы будут эквивалентны:
?- not(больше(собака, лошадь)).
Yes;
?- ложь(больше(собака, лошадь)).
Yes
Другим часто используемым встроенным предикатом является =/2 (унификация): =(X, Y). Этот предикат допускает более удобную форму записи X = Y. Значение этого предиката истинно, если термы X и Y удается унифицировать.
На предикат not/1 похож встроенный предикат \=, зависящий от двух аргументов. Утверждение X \= Y эквивалентно утверждению not(X = Y).
Иногда бывает полезно использовать предикаты, про которые заранее известно, истинны они или ложны. Для этих целей используют предикаты true/0 и fail/0. Предикат true всегда истинен, в то время как fail всегда ложен.
Встроенный предикат read/1 позволяет считывать термы с клавиатуры. При этом приглашение Пролога ?- меняется на |: (в PIE32 работает по-другому). Вводимый терм должен обязательно заканчиваться точкой.
Пример:
?- read(Name), read(Age).
|: коля. 15.
Name = коля
Age = 15
Yes
?- read(X), больше_2(X,Y).
|: осел.
X = осел
Y = собака ;
X = осел
Y = обезьяна ;
No
Если при обработке запросов Пролога вы пожелаете получить более подробный вывод, то для этих целей можно использовать предикат write/1. Аргументом этого предиката может являться любой допустимый терм Пролога. В случае, когда аргументом является переменная, будет напечатано ее значение.
Выполнение предиката nl/0 осуществляет перевод строки: последующий вывод начнется с новой строки. Предикат tab/1 выводит количество пробелов, определяемое его аргументом (в PIE32 не поддерживается).
Пример:
?- write('Hello World!').
Hello World!
Yes
?- write('Hello'), nl, tab(5), write('World!').
Hello
World!
Yes
?- X = слон, write(X), nl.
слон
X = слон
Yes
В последнем примере сначала переменная X унифицируется с атомом слон, а затем значение переменной X, т. е. слон, выводится на экран при помощи предиката write/1. После перехода на новую строку Пролог выдает отчет об унифицированной переменной, т. е. печатает X = слон.
Большинство Пролог-систем, но не PIE32, предоставляет доступ к справочной информации при вызове предиката help/1. Примененный к терму (обычно представляющего имя встроенного предиката) он осуществляет вывод краткого описания этого терма.
Пример:
?- help(write).
write(+Term)
Write Term to the current output, using brackets and operators
where appropriate. See feature/2 for contrillong floating point
output format.
write(+Stream, +Term)
Write Term to Stream.
Yes
И, напоследок, поговорим о комментариях. Комментарии никак не влияют на выполнение программы, но при правильном их использовании они оказываются весьма существенной частью исходного текста. Несколько удачно расположенных строк с комментариями могут оказать человеку, читающему программу, большую помощь. Пролог игнорирует произвольное число строк, заключенное между символами /* и */. Все, что находится между % и концом строки, также рассматривается как комментарий:
Пример:
/* Это
комментарий */
% Это тоже комментарий