Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СППР

.pdf
Скачиваний:
192
Добавлен:
19.02.2016
Размер:
10.12 Mб
Скачать

159

Нравится (Василий, А ) автомобиль(Л), производится. (А, германия). He сложно заметить, что при помощи такой конструкции можно

представлять правила-продукции для реализации продукционной модели представления знаний.

Возникает вопрос: “А для чего, вообще, необходимы правила?” Действительно, утверждение: “Василию нравятся все автомобили” можно реализовать путем задания множества простых фактов, например:

нравится (василий, мерседес), нравится (насилий, бмв). нравится (василий, опель).

Однако, уже из этого примера ясно, что это очень неудобно потому, что существует очень много марок автомобилей и, всех их необходимо указывать. Другой способ выразить этот факт - это создать правило: “Василию нравится X, если X является автомобилем”.

Объекты данных На рисунке 1.9.3. показана классификация объектов данных Пролога

[94]. Пролог-система распознает тип объекта по его синтаксической формуле в тексте программы, то есть, для разных объектов предусмотрено разные формы записи.

Рис.1.39 Объекты данных языка Пролог

Атомы и числа Вообще, атомы можно создать с помощью трех способов:

а) из цепочки букв, цифр и символа подчеркивания которая начинается с маленькой буквы, например:

василий

х2г

160

номер_группы б) из специальных символов: <------>

= = = = = =>

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

в) из цепочки символов в одинарных кавычках, например: ‘Василий’ ‘ВасилийПетруненко’ ‘Украина’

Это очень удобно, когда мы желаем, например, иметь атом, который начинается с большой буквы. Заключая его в кавычки, мы делаем его отличным от переменной.

Числа В Прологе они бывают целыми и вещественными. Синтаксис целых

чисел очень простой, например: 1, 1313, 0, -97. Ho не все целые числа могут быть представленными в ЭВМ, поэтому диапазон целых чисел ограничивается интервалом между некоторыми ‘ минимальным и максимальным числами, которые определяются конкретной реализацией Пролога. Например, во многих реализациях Пролога этот диапазон задается интервалом о т-16 383 до 16 383.

Синтаксис вещественных чисел также зависит от реализации. Будем придерживаться простых правил, которые видно из примеров:

3.14,-0.0035,100.2.

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

Константы В Прологе константьі бывают шести типов:

char - символ ASCII, например: 1у \ 5’, integer - целое;

real - вещественное;

string - цепочка символов в кавычках;

symbol - символьная константа (атом первого типа); file - символьное имя файла.

161

Переменные Как мы определили раньше, переменные - это цепочки, которые

состоят из букв, цифр и символов подчеркивания. Они начинаются с прописной (большой) буквы либо с символа подчеркивания:

Z

Результат

Список_студентов

_х25

_34

Область действия переменной (лексический диапазон имени) - одно предложение языка. Это означает, что если, например, имя X встречается в двух предложениях, то оно обозначает две различные переменные. Ho в середине одного предложения, каждое его появление обозначает одну и ту же переменную.

Для констант ситуация другая, - один и тот же атом обозначает один и тот же объект в каком-либо предложении программы.

Особенное место отводится, так называемой, “анонимной

переменной”, которая

записывается в виде

одного

символа

подчеркивания:

 

 

 

Если переменная

встречается в предложении

один раз,

то нет

необходимости придумывать ей имя. Например, в правиле:

“Для всех X, X имеет ребенка, если X является родителем некоторого У”, которое записывается:

имеет_ребенка (X) := родитель(Х, У).

Здесь мы определяем свойство “иметь ребенка” таким образом, что оно не зависит от имени ребенка. Поэтому приведенное выше правило, можно записать так:

имеет_ребенка (X) := родитель (Х,_).

Каждый раз, когда в предложении встречается отдельный символ подчеркивания, он обозначает новую “анонимную переменную”.

Если “анонимная переменная” встречается в вопросе, то ее значение не выводится во время ответа системы на этот вопрос, например:

?- родитель (X, _).

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

Структуры Структурные объекты (или просто структуры) - это особенные

объекты, которые состоят из нескольких компонент [94]. Эти компоненты, в свою очередь, также Morj7T быть структурами.

Например, дату можно рассматривать как структуру из трех компонент: день, месяц, год.

162

Хотя структуры состоят из отдельных компонент, в программе они ведут себя как целые объекты.

Для того чтобы объявить структуру (объединить компоненты в структуру), нужно указать функтор и за ним в скобках через запятые - все компоненты. Например:

дата (день, месяц, год)

t \ f /

функтор аргументы

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

Все структурные объекты можно изобразить в виде дерева:

дата

I

день месяц год

Приведем другой пример, который показывает, как можно использовать структуры для представления геометрических объектов: точка, линия, треугольник.

Новые типы данных:

точка = точка (real, real) (имеется в виду, что точка задается двумя координатами, которые имеют тип вещественных чисел);

отрезок = отрезок (точка, точка) (отрезок задается уже новым, раньше не известным типом - точкой);

треугольник = треугольник (точка, точка, точка) (треугольник уже задается с помощью трех точек).

Попробуем привести пример из области электротехники. Представим простую электрическую схему. .

Атомы rl, г2, гЗ, г4 - имена резисторов.

посл(гД г2) - терм для обозначения последовательного электрического соединения трех резисторов:

пар(/7, г2) - терм для обозначения параллельного электрического соединения двух резисторов:

163

Сравнения

Наиболее важной операцией над термами является сравнение. Пусть даны два терма. Будем говорить, что их можно сравнить, если:

(1)- они вдентичны;

(2)- переменным в обоих термах можно приписать в качестве значений объекты (то есть конкретизировать их) таким образом, чтобы после подстановки этих объектов в термы вместо переменных, термы стали идентичными.

Например, термы дата (Д, Т, 1983) и дата (Д1, май, У1) можно сравнить при следующей конкретизации:

Д = Д1 T = май

У1 = 1983

С другой стороны, дату (Д, М, 1983) и дату (Д1, M l,1944) сравнить не возможно, как и термы дата {X, У, Z) и точка (X У, Z).

Сравнение - процесс, на вход которого подаются два терма, а он проверяет, соответствуют ли они один одному.

Запрос на сравнение можно задать путем использования оператора Например:

?- дата(Д,М,1983) = дата(Д1,май,У7).

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

Так: Д = Д1, а не, например, Д = I и Д1 = I

(то есть какие-либо, но не равнозначные Д и Д1).

164

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

?- дата(Д, М, 1983) = дата (Д1, май, Л ), дагаСД, М, 1983) = дата (15, М, У).

Для достижения первой цели, система присвоит переменным такие значения:

Д = Д1 M = май

У1 = 1983

После достижения второй цели, значения переменных станут более конкретизированными:

Д = 15

Д1 - 15 M = май

У1 = 1983 У= 1983

Этот пример показывает, что переменным во время вычисления последовательности целей присваиваются все более конкретные значения.

1.93. ОБЩИЙ ВИД ПРОГРАММЫ, НАПИСАННОЙ НА ЯЗЫКЕ ТУРБО ПРОЛОГ

Турбо Пролог был разработан фирмой Borland International и работает под управлением операционной системы MS-DOS. Следует заметить, что

это компилятор,

а не интерпретатор,

какими были его предшественники

[101]. Он отличается высокой скоростью компиляции и выполнения.

Общий вид программы на Турбо Прологе:

trace

 

 

 

 

/* не обязательно */

project "название проекта"

 

 

I* не обязательно */

include "другой исходный файл"

 

/* не обязательно */

domains

 

 

 

 

/* описание аргументов

предикатов*/

 

 

 

 

 

личность = symbol

 

 

 

смена = symbol

 

/* не обязательно */

database

 

 

 

работает (личность,смена). /* описание !фвднкатов,

 

 

 

 

 

которые можно*/

predicates

 

 

 

/* добавлиь* исключал, */

 

 

 

/* опредсдвргс» обязательно */

знает(личность^шчносгь).

, ί* область,каждогоаргумента */

goal

 

 

/*пюШ.тЫяяпсяьио*/

знает (4& .

,

■...

 

 

 

ctowV

 

 

.

работает(васидийдаерай).

 

M f t v r i H T ίИ И И 1 И Й :Я М М 1 М 1

165

знает (X1Y):- работает (X, S), работает (Y, S), X o Y .

Если в программе присутствует директива goal (цель), то во время выполнения программы система вычислит эту цель только один раз и закончит программу. Если в программе нет директивы goal, то во время выполнения программы пользователь может ее задать, то есть интерактивно вводить запросы.

В первой части программы, которая определяется директивой domains, могут определяться шесть стандартных типов аргументов:

char- знаковый, записывается между апострофами;

integer- целое число а, которое может находиться в диапазоне: -32768 <= а <=32768;

real - вещественное число;

string- множество символов (цепочка) в кавычках;

symbol - символьное значение: имя, которое начинается с маленькой буквы, или текст, в апострофах;

file - файл.

Во второй части программы, которая определяется директивой predicates, определяются форматы предикатов, которые используются. Вообще, можно избежать применения директивы domains, если сделать замену имен аргументов в секции predicates, их типами, которые указаны в секции domains.

Например: predicates

отец(symbol, symbol).

муж(зутЬо1, symbol).

В третьей части программы, которая определяется директивой clauses, формулируются правила. В Турбо Прологе правила бывают 2-х типов: правила, которые состоят только из фактов, и правила, которые состоят из фактов и других правил.

Например, рассмотрим следующую базу данных: domains

имя = symbol predicates

отец(имя,имя). мать(имя,имя).

clauses

отец(павел,юлия). мать(юлия,михаил).

В приведенной базе данных мы имеем дело с первым типом правил, а именно - с правилами, которые состоят только из фактов (высказываний). Во время выполнения программы, в ответ на приглашение Goal·.-, можно сформулировать вопрос:

166

Goal:- отец (X,Y), то есть записать: “Кто, чей отец?”, и получить ответ: А,=павел, У=юлия.

Рассмотрим более сложный пример, в котором база данных состоит из правил второго типа, то есть состоят из фактов и других правил.

domains

имя = symbol predicates

отец(имя,имя). муж(имя,имя). дед(имя,имя). мать(имя,имя).

clauses

 

 

отец(андрей,апексей).

/* 1 */

отец(федор,мария).

/* 2 */

отец(алексей,лариса).

/* 3 */

отец(алексей,Владимир).

/* 4 */

муж(апексей,мария).

I* 5*/

дед(А",J):- OTeu(X, Z),afieu,(Z, Y).

I* 6 */

дед(Х,

отец(Л", Z),M8Tb(Z,У)·

1*1*1

мать(Х, Y)·.- муж(Ζ, А),отец (Ζ,Υ).

/* 8 ■*/

Рассмотрим, как анализируется следующий вопрос: goal:-a,en(X,Y).

С начала Пролог-система находит в базе данных правило или факт, который может быть унифицированным с вопросом. В нашем примере, первым таким правилом является правило с номером (б), из которого, применяя факты (1), (3) и (4), получаем первые решения: '

Л"=андрей, У=лариса А^андрей, У=владимир

Затем, в соответствии с принципом выбора всех решений, Прологсистема переходит к следующему правилу - (7), и анализируя первую подцель этого правила - отец ^.ї), находит факт - отец (андрей,алексей)

(1) и переходит к анализу второй подцели правила. Ho тут на нас ожидает тупиковая ситуация, связанная с тем, что правило (8), построено на предикате “мать” с аргументами (X1Y), а в правиле (7) этот предикат имеет аргументы (Ζ,Υ). Очевидно, что для унификации необходимо, чтобы Z стало X, a Y=Y, то есть можно говорить, что все экземпляры X из правила

(8) станут экземплярами Z из правила (7). Ho переменная Z уже существует в правиле и она не должна смешиваться с новой переменной

Ζ. Поэтому компилятор строит в

памяти таблицу соответствия новых и

старых переменных:

 

мать(^,

(7)

мать(Л,H ):- муж(гі,Kl), oreu(Zl,Fl). (8)

167

В результате унификации переменных, правило (7) будет иметь в базе данных следующий вид:

дсд{Х, A l):- отец(* Л),муж(гі, ЛЛ),OTeq(ZllH ).

Окончательный ответ: X =федор, А1=мария, 21=алексей, К=лариса, У1=владимир.

Следует заметить, что в Пролог-программе нужно обязательно задавать область действия предикатов: на каждое имя предиката необходимо определять хотя бы одно правило.

1.9.4. СРЕДСТВА РАЗРАБОТКИ И ОТЛАДКИ ПРОЛОГ-ПРОГРАММ

В Турбо Прологе, как и в другом языке программирования высокого уровня, существуют встроенные предикаты (функции) ввода-вывода^ данных.

Обобщенная классификация основных функций ввода-вывода языка программирования Турбо Пролог представлена на рисунке 1.9.4.

Рис.1.40 Классификация функций ввода-вывода языка Турбо Пролог

Рассмотрим программу, которая запрашивает ввод фамилии, года рождения и заработной платы сотрудника.

168

predicates anketa

clauses ■anketa:-

мті'ге("Введите Вашу фамилию"),nl, readln(Fam), nl,

ит*е("Введите год рождения"), и/, readint( Vozr), nl,

>ш'?е("Введите Вашу заработную плату"), nl,

readreal(Zarpt), nl,

 

writeC'

_________________ "), nl,

и'п'геС'Фамилия ", Fam

), nl,

writе("Гоц рождения ",Vozr ),nl,

write{"Заработная плата

nZarpl), nl,

write(”_ _____________________ "), nl.

В результате работы программы получим: Введите Вашу фамилию Петренко Введите год рождения:

1960

Введете Вашу заработную плату:

740

 

Фамилия

Петренко

Год рождения

1960

Заработная плата

740

Другой важной особенностью языка Турбо Пролог, является возможность работать с динамичесфми базами'данных. В этом случае базу данных будем называть динамической, если ее можно изменять во время появления новых фактов.

Продемонстрируем это на следующем примере.

Рассмотрим уже знакомую нам базу данных, которая содержит родственные отношения (семейный сбор):

domains

имя = symbol predicates

отец(имя, имя; clauses

отец(а, в). отец(в, с). отец(с, е).