- •1.1. Факты
- •Вопросы или целевые утверждения
- •Переменные
- •1.4. Правила
- •1.5. Конъюнкция целевых утверждений
- •Пополнение базы знаний
- •Структура программы на языке Visual Prolog
- •Заключение
- •Пример выполнения контрольного задания
- •"Среда",14,"з").
- •Контрольные вопросы
- •Контрольные задания
- •Предметная область "Кулинария ".
- •Предметная область "Студенты группы".
- •Предметная область "Поставщики продуктов".
- •Предметная область "Оценка деятельности преподавателя". Отношения-факты:
- •Предметная область "Шахматы".
- •Предметная область "Управление троллейбусами".
- •Предметная область "Междугородные переговоры". Отношения-факты:
Структура программы на языке Visual Prolog
Рассмотрим еще один пример программы на языке Visual Prolog.
/* программа "Студенты" */
DOMAINS
student = string
facultet = string
gruppa = integer
FACTS
студент(student,gruppa)
наим_фак(integer,facultet)
группа(gruppa)
CLAUSES
/* определение отношения "группа" с помощью фактов*/
группа(943).
группа(843).
группа(232).
/* определение отношения "студент" с помощью фактов*/
студент("Орлова Л.И.", 943).
студент("Семенова М.П.", 232).
студент("Цуканова В.В.", 943).
/* определение отношения "наименование факультета"
с помощью фактов */
наим_фак(1,"РТФ").
наим_фак(2,"ФЭ").
наим_фак(3,"ФАИТУ").
наим_фак(4,"ФВТ").
наим_фак(7,"ИЭФ").
PREDICATES
nondeterm факультет(gruppa, facultet)
вторая_цифра(gruppa,integer)
CLAUSES
/* определение отношения "факультет" с помощью правила*/
факультет(NG,F):- вторая_цифра(NG,G2),
наим_фак(G2,F).
/* определение отношения "вторая цифра" с помощью правила */
вторая_цифра(NG,G2):- Gl = NG mod 100,
G2 = Gl div 10.
GOAL
группа(Gruppa),студент(Student, Gruppa);
студент(Studentl,Gruppal),
факультет(Gruppal, Facultetl).
Программа на языке Visual Prolog имеет структуру, состоящую из следующих разделов:
DOMAINS /*описание типов данных*/
DATABASE (FACTS) /*описание предикатов
динамической базы данных*/ PREDICATES /*описание предикатов */
CLAUSES /*утверждения: факты и правила */
GOAL /* вопросы пользователя */
В разделе DOMAINS программист определяет классы объектов, задавая их символические имена, и с помощью стандартных типов данных описывает их свойства. Например, классы объектов типа "студент", "факультет", "группа" задаются следующим образом:
DOMAINS
student = string facultet = string
gruppa = integer
Таким образом, в этом разделе программист создает свои типы (области - DOMAINS) данных.
В разделах PREDICATES, DATABASE (FACTS) описываются образцы предикатов, а именно: задаются имена предикатов, число их аргументов, смысл аргументов с помощью имен классов. Например:
PREDICATES
nondeterm факультет(gruppa, facultet)
вторая__цифра (gruppa, integer)
Такое описание показывает, что в предикате факультет первым аргументом является номер группы, а вторым - наименование факультета. Ключевые слова determ и nondeterm в описании предиката означают, что предикат может быть согласован с базой знаний соответственно один раз или много раз.
Различие PREDICATES и DATABASE в том, что в DATABASE описываются предикаты динамической базы данных, состоящей только из фактов, которые можно добавлять, удалять и изменять в процессе выполнения программы. Раздел PREDICATES содержит описание фактов и заголовков правил, однако соответствующие этим описаниям утверждения нельзя динамически изменять.
Раздел CLAUSES содержит собственно программу, т. е. все факты и правила, описывающие предметную область и составляющие базу знаний.
В программе могут присутствовать несколько утверждений, описывающих одно и то же отношение. Все они являются возможными различными вариантами описания этого отношения. Таким образом, совокупность утверждений с одинаковыми заголовками, т. е. с одинаковым именем и тем же числом аргументов, называется определением отношения или процедурой. Утверждения одного определения отношения должны быть сгруппированы вместе. Все утверждения о предметной области (программа), находящиеся в области действия программы Пролога, называются базой знаний. Структура раздела (CLAUSES) утверждений программы на языке Пролог приведена на рис. 3.
Раздел GOAL содержит вопросы пользователя.
Классы объектов предметной области, введенные программистом, описываются с помощью следующих стандартных типов данных:
symbol - символическое имя (person,у,a,mas);
string - строка - любая последовательность символов в двойных кавычках ("Катрин", "Домодедово");
char - отдельный символ, заключенный в апострофы (‘R’, **’);
integer - целое число в диапазоне от -32768 до 32767;
byte - целое число в диапазоне от 0 до 255; word- целое число в диапазоне от 0 до 65535;
real - любое число, может быть представлено в экспоненциальной форме
Рис. 3. Структура раздела утверждений программы
Данные типа symbol в отличие от данных типа string запоминаются в таблице символов. Таблица символов размещается в оперативной памяти, поэтому ее использование обеспечивает наиболее быстрый поиск. Однако для построения таблицы символов требуется дополнительное время.
.
Логические программы можно рассматривать как мощное расширение модели реляционной базы данных (БД). Факты программы образуют отношения БД. Правила реализуют запросы. Основные операции реляционной алгебры легко выражаются в логическом программировании. Пять основных операций определяют реляционную алгебру: объединение, симметрическая разность, декартово произведение, проекция и выборка. Покажем, как каждая из них выражается в логической программе.
Операция объединения строит одно «-арное отношение из двух я-арных отношений г и s. Новое отношение, которое обозначим r_union_s, является объединением г и s. Это отношение задается логической программой, состоящей из двух правил:
r_union_s (Х1,Х2,Хп) г(Х1,Х2,...,Хп) .
r_union_s (XI, Х2, ...,Xn) : - s (Х1,Х2,...,Хп) .
Пример:
блюдо(У):-мясо(Y).
блюдо (Y) :-рыба(Y) .
Из примера следует, что объединение отношений можно использовать для обощения знаний о предметной области.
О
пределение
симметрической
разности
использует понятие отрицания:
А
В = (А В) (А В).
r_diff_s(Xl,X2,...,Xn) :- r (Х1,Х2,...,Хп) ,
not s(Xl, X 2,..., X n) .
r_dif f_s (Xl,X2,..,Xn ):- s (Xl,X2,...,Xn) ,
not r(Xl,X2,...,Xn) .
Пример:
футболист_либо_волейболист(X) :- футболист(X),
not волейболист(X).
футболист_либо_волейболист(X):- волейболист(X),
not футболист (X).
Декартово произведение г_x_s может быть определено одним правилом:
r_x_s(Xl, Х2,., .. …, Xm,, Yl,, Y2,.., Yn) : -
r(Xl, Х2, ..., Хт),
s (Yl, Y2,Yn) .
Пример:
/* Определение отношения "обед" */
обед(X,Y,Z):-закуска(X), блюдо(У), десерт(г).
Проекция состоит в построении отношения, использующего лишь некоторые аргументы исходного отношения: г13(Х1, ХЗ):- г(XI, Х2, ХЗ).
Пример:
аптека(6, "Циолковского, 7", "44-67-57").
телефон_аптеки(NomApt, TelApt):-
аптека(NomApt, __, TelApt).
Чтобы получить выборку, достаточно в теле правила записать условия отбора:
rv(XIв ХЗ):- r(XI, Х2, ХЗ), Х2>Х1.
Пример:
аптека(6, "Циолковского, 7", "44-67-57"). телефон_аптеки(NomApt, TelApt):-
аптека(NomApt, _, TelApt),
NomApt < 8 .
/*Определение отношения сбалансированный обед*/
сбалансированный_обед(X,Y,Z):-обед(X,Y,Z),
значение(X,Y,Z,V),
V<800.
Операция соединения двух или нескольких отношений определяется следующим образом:
/* определение отношения "факультет" с помопхью правила */
факультет(NG,F):-вторая_дифра(NG,G2),
наим_фак(G2,F).
Здесь два отношения связаны общей переменной G2.
Теоретический материал этого пункта поможет вам выполнить первое контрольное задание, в котором вы должны с помощью фактов создать базу данных и с помощью правил определить запросы к ней.
