Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФиЛП_материалы / Материалы / Prolog / ПособиеПролог.doc
Скачиваний:
55
Добавлен:
01.06.2015
Размер:
449.02 Кб
Скачать

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.

Соседние файлы в папке Prolog