- •Введение
- •1. История Пролога
- •2. Синтаксис и семантика Пролог-программ
- •2.1. Объекты данных1
- •2.2. Декларативный смысл Пролог-программ
- •2.3. Основные определения
- •3. Практическое программирование на Прологе
- •3.1. Структура Пролог-программы
- •3.2. Некоторые предопределенные термы
- •3.3. Свободные и связанные переменные
- •3.4. Внутренняя бд Пролога
- •3.5. Обработка условий и организация циклов в Prolog’е
- •3.5.1. Обработка условия
- •3.5.2. Использование предиката типа repeat
- •3.6. Списки в Прологе
- •3.6.1. Примеры списков
- •3.6.2. Разделение списков на голову и хвост
- •3.6.3. Некоторые полезные программы для работы со списками
- •1. Слияние списков.
- •2. Сортировка списков
- •3.7. Ввод и вывод
- •3.7.1. Файловая система
- •Операции с именами файлов
- •Чтение и запись
- •3.8. Строки и функции работы со строками
- •4. Простенькая экспертная система
- •Игрушечная эс «Кто чем увлекается?»
- •5. Базовые понятия и термины Пролога
- •5.1. Объекты
- •5.2. Внутренние дела Пролога
- •5.3. Что такое шаблоны?
- •5.4. Управление поиском
- •Литература
5. Базовые понятия и термины Пролога
Следуя известному «алгоритму пастора», который начинал каждую проповедь так: «Сейчас я расскажу Вам о том, о чем я буду говорить, затем я расскажу это, а затем я расскажу о том, о чем я говорил», изложение материала подошло к точке, где я должен сказать о том, о чем я рассказывал.
5.1. Объекты
«Пролог - это язык программирования, предназначенный для обработки символьной нечисловой информации. Особенно хорошо он приспособлен для решения задач, в которых фигурируют объекты и отношения между ними.» [Братко]
Теперь вспомним, из каких «кирпичиков» строятся объекты. Любой класс объектов определяется набором составляющих его подъобъектов и структурой. Элементарные классы объектов не имеют структуры и описываются одним из встроенных типов данных, которые называются еще встроенными доменами.
Домен - имя простого или составного терма (не функтор!), которое, в свою очередь, может замещать этот терм в определении другого сложного терма.
domains
...............................
dom1=functor1(integer,string)
dom2=functor2(symbol,real,dom1)
...............................
Конкретный экземпляр элементарного класса называется атомом. Это - числовые, символьные и строчные константы.
Термы
Все типы данных в Прологе называются термами. Имя терма называется доменом.
Терм может быть простым. Простой терм - это любой класс объектов, определяемый прямо (object=integer) или косвенно доменом стандартного типа:
object2=object;object2=object*
Терм может быть сложным, т.е. состоять из функтора и списка термов, разделенных запятыми и заключенного в круглые скобки
любить(миша,шоколад).
Структура - это другой термин для обозначения сложного терма. Основной характеристикой структуры является ее размерность (или арность) - число термов в списке.
Любая структура определяет некоторое отношение между составляющими ее термами (объектами). В таком случае функтор – это имя отношения. Например, терм (факт)
мяч(форма(сфера),материал(резина),размер(25), цвет([синий,красный]))
определяет конкретный объект класса «мяч». Функтор «мяч» есть имя одноместного отношения «быть объектом».
В рамках программы дается процедурная интерпретация всех отношений. Программисту рекомендуется составлять осмысленные имена всех объектов и функторов, помогающих читателю разобраться в интерпретации и самому программисту не забывать о ней.
Стандартные типы данных являются «аксиоматическими» и не нуждаются в объявлении. Поскольку PDC Prolog является строго типизированным языком, домены необходимы для определения предикатов («процедур» с процедурной точки зрения на Пролог).
Простые домены следует рассматривать как характеристики объектов, выраженные (в конечном итоге) в терминах встроенных типов.
Сложные домены определяют иерархию по вхождению менее сложных объектов в более сложные.
Множество доменов, с помощью которых описываются все объекты отношения, называется системой типов.
Задавая системы типов, мы подготовливаем поле для задания аксиом, которые в Прологе выражаются либо фактами внутренней БД или безусловно верными предикатами (которые также называются фактами, пример: черный(X):-темный(X).
Таким образом, сами логические процедуры могут служить в качестве описаний структур данных.
Пролог-программа
Пролог-программу следует рассматривать как доказательство теоремы, сформулированной в разделе GOAL. Доказательство использует аксиомы, сформулированные как факты Пролога, а также вспомогательные теоремы, сформулированые в виде предложений.
Часто используемый термин цель - это и есть теорема или целевое утверждение. Предложения и отдельные его утверждения рассматриваются как подцели.
Вопрос - это та же теорема или цель. Использование этого термина связано со взглядом на пролог-программу как систему управления Базой Знаний, сами знания в которой представлены фактами.
В случае «Кто у нас большой и темный?» вторая интерпретация конъюнкции большой(X),темный(X) - это теорема о существовании большого и темного объекта X.
Для формулирования целей и подцелей используются переменные.
Переменная - символическое имя, которому может быть сопоставлен определенный домен (определенный в разделе domains или стандартный). Если сравнивать с русским языком, то переменная – это местоимение, которое должно получить конкретное значение. Переменная должна начинаться с буквы в верхнем регистре (или символа подчеркивания)и может содержать только буквы, цифры и знаки подчеркивания. Переменные могут быть связными (имеющими значение), несвязными (свободными, не имеющими значения) и анонимными.
Переменная анонимная - переменная "_", используемая вместо обычной переменной в том случае, когда не важно значение соответствующей ей обычной переменной.
Из переменных, отношений, конкректных экземпляров объектов, используя очень простой синтаксис, конструируются утверждения и предложения Пролога.
Утверждение - одно или несколько отношений, связанных конъюнктивно (отношения, перечисляемые через запятую).
Предложение - утверждение, заканчивающееся точкой, которое может быть фактом и правилом.
Правило - утверждение, истинность которого зависит от выполнения ряда условий.
Заметим, что любое математическое выражение можно назвать отношением, поскольку его можно представить в префиксной записи, и тогда у нас получится обращение к предикату (вызов процедуры).
Правила состоят из двух частей - головы правила и тела правила - соединенных логической связкой «если»: (if|:-)." И синтаксически и семантически левая часть правила – это отношение, что то же самое, что и утверждение. Т.е. правило в целом читается как «отношение имеет место быть, если верны утверждения в правой части» или «утверждение в левой части верно, если верны утверждения в правой части правила.»
Левая часть правила или предложение, состоящее из одного утверждения, называется предикатом.
В этом смысле раздел clauses содержит определения предикатов.
Предикаты должны быть объявлены в разделе predicates.
Предикат может содержать одно или несколько утверждений:
женщина(умная).
женщина(красивая).
женщина(нежная).
женщина(страстная).
женщина(сварливая).
.................
Предикату могут соотвествовать несколько правил. В таком случае говорят о «множественном определении предиката»
Число объектов определяет арность предиката. Предикат женщина имеет арность, равную 1.
Пример предиката нулевой арности:
люблю_женщину:-
женщина(умная),
женщина(красивая),
женщина(нежная),
женщина(страстная).