- •Введение
- •1. Составление программ
- •1.1. Основные определения
- •1.2. Декларации в программах
- •1.3. Объявление предикатов и типов их аргументов
- •1.4. Другие разделы программы
- •Упражнения
- •2. Механизмы доказательства правил
- •2.1. Сопоставление с откатом
- •2.2. Рекурсия
- •Упражнения
- •3.Операции в Visual Prolog. Ввод-вывод
- •3.1. Операции
- •3.2. Предикаты ввода-вывода
- •4. Управление процессом доказательства правил
- •4.1. Искусственный откат
- •4.2. Отсечение
- •4.3. Повтор, определяемый пользователем
- •5. Списки
- •5.1. Процедуры обработки списков
- •5.2. Организация стеков и очередей
- •6. Внутренняя база фактов
- •7. Иерархическая организация данных
- •8. Работа с деревьями и графами
- •8.1. Двоичные деревья
- •8.2. Графы
- •9. Работа с именами и строками
- •Заключение
- •Библиографический список
- •Оглавление
1.3. Объявление предикатов и типов их аргументов
В традиционном Прологе программа состоит из последовательно записанных фактов и правил; цель программы вводится в строке приглашения интерпретатора. Программа на VIP состоит из нескольких разделов (секций). Факты и правила записываются в раздел предложений(clauses), цель доказательства – в раздел цели (goal). Кроме того, VIP требует объявления типов аргументов предикатов. Для этого предназначены разделы предикатов (predicates) и доменов (domains). (В программе английские названия разделов могут быть записаны как заглавными, так и строчными буквами).
В разделе предикатов приводятся шаблоны всех предикатов программы с указанием типов их аргументов:
<имя предиката>(<список типов аргументов>).
Типы аргументов могут быть стандартными или определенные пользователем. Подробно стандартные типы перечислены в описании конкретной версии VIP; общепринятыми являются следующие:
real (числовые действительные), integer (числовые целые), char (символьные), symbol (символические имена), string (строки).
Примеры соответствующих констант:
real – 45,74; integer – 128; char – ‘a’; symbol – яблоко, string – “Волк”.
Наша программа для хищников в VIP имеет вид:
PREDICATES
животное(symbol)
ест(symbol, symbol)
хищник(symbol)
CLAUSES
животное(волк).
животное(заяц).
ест(волк, заяц).
еcт(заяц, капуста).
хищник(Х): – животное(Х), животное(Y), ест(X,Y).
GOAL
хищник(X).
Раздел предикатов должен предшествовать разделу предложений, в котором используются соответствующие отношения. В разделе не надо объявлять стандартные предикаты, такие как write, nl, read, assert и др, которые всегда успешны.
Компилятор контролирует значение аргументов на соответствие объявленным типам. Например, будет обнаружена ошибочная запись факта «животное(34)».
Если типы аргументов предикатов не стандартные, то они должны быть объявлены в разделе domains. Здесь пользователь вводит свои типы аргументов и может указать, хотя и необязательно, к каким стандартным типам они принадлежат. Этот раздел предшествует разделу предикатов. Например, (далее при записи программ используются комментарии, которые выделяются символами «%» или «/* …….*/»)
DOMAINS
порода=symbol
рост=symbol
окрас=symbol
шерсть=symbol
/*можно записать одной строкой:
порода, рост, окрас, шерсть=symbol*/
PREDICATES
собака( порода, рост, окрас, шерсть).
агрессивная (порода)
осторожно(порода)
не_опасайтесь(порода)
характер_собаки(порода)
CLAUSES
собака(такса, маленький, мраморный, гладкошерстная).
собака(чихуахуа, маленький, любой, гладкошерстная).
собака(пудель, средний, черный, кудрявый).
собака(немецкая_овчарка, высокий, рыжечерная, жесткошерстная).
агрессивная(такса).
агрессивная(чихуахуа).
cпокойная(пудель)
cпокойная(немецкая_овчарка)
осторожно(Х):-собака(X,Рост,Окрас,Шерсть),
агрессивная(Х).
не_опасайтесь(Y):-собака(Y,Рост,Окрас,Шерсть),
спокойная(Y ).
характер_собаки(X):-осторожно(X),
write(“Осторожно”);
не_опасайтесь(X),write(“Не опасайтесь”).
GOAL
характер_собаки(такса).
Для того чтобы избежать неоднозначности, пользовательские типы будем называть доменами, оставляя слово «тип» для стандартных. Предикат «собака» имеет 4 аргумента, домен первого – порода, второго – рост, третьего – окрас, четвертого – шерсть и все они имеют тип symbol. Компилятор проверяет соответствие типов аргументов предикатов соответствующим доменам. Например, если по ошибке тело правила «осторожно» мы запишем так:
собака(X, Y,W,Z), агрессивная(Y),
то компилятор отметит несоответствие домена переменной Y в предикате «собака» и в предикате «агрессивный»: в «собаке» он стоит на 2-м месте и в соответствии с объявлением предиката имеет домен «рост», а неизвестная в предикате «агрессивная» должна иметь домен «порода».
Другие варианты объявлений доменов рассматриваются в разд. 7.
