Факты и правила на Прологе. Основные приемы работы в Visual Prolog
В Прологе решение достигается логическим выводом из ранее известных положений. Обычно, программа на Прологе представляет собой набор фактов с правилами, обеспечивающими получение заключений на основе этих фактов.
Пролог использует упрощенную версию синтаксиса логики предикатов, т.к. он является простым для понимания и очень близок к естественному языку.
Пролог включает механизм вывода, представляющий собой процесс логического объяснения информации. Механизм вывода включает сопоставление образцов. С помощью подбора ответов на запросы он извлекает хранящуюся (известную) информацию. Пролог пытается проверить истинность гипотезы (другими словами — ответить на вопрос), запрашивая для этого информацию, о которой уже известно, что она истинна. Прологовское знание о мире — это ограниченный набор фактов (и правил), заданных в программе.
Одной из важнейших особенностей Пролога является то, что (в дополнение к логическому поиску ответов на поставленные вами вопросы) он может иметь дело с альтернативами и находить все возможные решения, а не одно. Пролог может возвращаться назад и просматривать более одного пути, при решении всех составляющих задачу частей.
Основные сведения о программах на прологе.
1. Программа на Прологе состоит из предложений, которые могут быть фразами двух типов: фактами или правилами.
# Факты — это связи или свойства, о которых программист твердо знаете, что они истинны.
# Правила — это зависимые связи (отношения); они позволяют Прологу выводить один фрагмент информации из другого.
2. Факты могут иметь вид:
property (object, object,…, object). или
relation (object, object,…, object).
где property — это свойство объектов, а relation — связь между объектами. Различия между этими понятиями несущественны, в дальнейшем будем использовать термин «связь».
3. Каждый факт программы задает либо связь, влияющую на один или более объектов, либо свойство одного или более объектов. Например, в факте Пролога
likes (tom, baseball).
связь — это likes (нравится), а объекты — tom (Том) и baseball (бейсбол): Тому нравится бейсбол.
В другом факте
left_hauded (benjamin).
left_hauded (левый крайний) является свойством объекта benjamin; другими словами: Бенджамин — левый крайний.
4. В общем виде правила имеют заголовок и тело, которые выглядят следующим образом:
relation (object, object,…, object) if
relation (object,…, object) and
…
…
relation (object,…, object).
5. Сообразуясь со следующими ограничениями, можно устанавливать любые имена для связей и объектов в своей программе:
# Имя объекта должно начинаться со строчной буквы, за которой может быть любое число символов. Этими символами могут быть: буквы верхнего и нижнего регистров, цифры и символы подчеркивания.
# Имена свойств и связей должны начинаться с буквы, за которой может следовать любая комбинация букв, цифр и символов подчеркивания.
6. Предикат — это символическое имя (идентификатор) связи с последовательностью аргументов. Программа на Прологе — это последовательность предложений и директив, а процедура — это последовательность предложений, описывающих предикат. Предложения, принадлежащие одному предикату, должны следовать друг за другом.
7. Переменные позволяют вам записывать общие факты и правила и задавать общие вопросы.
# Имя переменной в Турбо Прологе должно начинаться с заглавной буквы или символа подчеркивания (_), после которой вы можете использовать любое число букв (верхнего и нижнего регистра), цифр и символов подчеркивания.
# Переменные в Прологе получают свои значения в результате сопоставления констант в фактах или правилах. До получения значения переменная является свободной, после — становится связанной.
# Вы не можете длительно хранить информацию с помощью «связывания» переменной со значением, т.к. переменная является связанной только в пределах предложения.
8. Если в запросе вас интересует только определенная информация, то для игнорирования не нужных вам значений вы можете использовать анонимные переменные. В Прологе анонимные переменные обозначаются одиночным символом подчеркивания (_).
Анонимная переменная может быть использована вместо любой другой переменной; она сопоставляется с чем угодно. Анонимная переменная никогда не принимает какого-либо значения.
9. Задание Прологу вопросов о фактах в вашей программе называется запросами к системе Пролога; более общим термином для запроса является «цель». Пролог пытается разрешить цель (ответить на вопрос), начиная с первого факта и просматривая все факты до достижения последнего из них.
10. Составная цель — это цель, включающая две или более частей; каждая часть составной цели называется подцелью. Составная цель может быть конъюктивной (подцель A and подцель B) или дизъюктивной (подцель A or подцель B).
11. Комментарии делают вашу программу более удобной для чтения. Вы можете заключать комментарии в разделители /*как здесь */ или предварять их одним символом процента, % как здесь.
12. В Прологе имеется несколько способов сопоставления одного с другим:
# Идентичные структуры сопоставляются друг с другом.
# Свободная переменная сопоставляется с константой или с ранее связанной переменной (и становится связанной с соответствующим значением).
# Две свободные переменные могут сопоставляться (и связываться) друг с другом. С момента связывания они трактуются как одна переменная: если одна из них принимает какое-либо значение, то вторая немедленно принимает то же значение.
13. Для обеспечения еще более легкого чтения программ на Турбо Про- логе следующие символы и слова в нем являются попарнозаменяемыми: «if» и «: -«, «and» и «, «, «or» и «; «. Таким образом, следующие два фрагмента программы идентичны:
is_older (Person1, Person2) if is_older (Person1, Person2): —
age (Person1, Age1) and age (Person1, Age1),
age (Person2, Age2) and age (Person2, Age2),
Age1 > Age2. Age1 > Age2.
14. Обычно, программа на Турбо Прологе состоит из трех или четырех ос- новных программных секций. К ним относятся: секция «clauses» (предложе- ний), секция «predicates» (предикатов), секция «domains» (доменов) и, иногда, секция «goal».
15. Программа на Турбо Прологе имеет следующую обобщенную структуру:
domains
/*…
объявление доменов
… */
predicates
/*…
объявление предикатов
… */
goal
/*…
подцель_1,
подцель_2,
и т.д.
… */
clauses
/*…
предложения (факты и правила)
… */
16. Секция clauses — это та, в которой вы размещаете факты и правила, с которыми будет работать Турбо Пролог, пытаясь разрешить цель программы.
17. Секция predicates — это та, в которой вы объявляете свои предикаты и типы (домены) аргументов этих предикатов. Имена предикатов должны начинаться с буквы (желательно строчной), за которой следует последовательность букв, цифр и символов подчеркивания (до 250 знаков). В именах предикатов нельзя использовать символы пробела, минуса, звездочки, обратной (и прямой) черты. Объявление предиката имеет следующую форму:
predicates
predicateName (argument_type1, argument_type2,…,
argument_typeN)
Здесь argument_type1,…, argument_typeN — либо стандартные домены, либо домены, объявленные вами в секции domains. Объявление домена аргумента и описание типа аргумента — суть одно и то же.
18. Секция domains — это та, в которой вы объявляете любые нестандартные домены, используемые вами для аргументов ваших предикатов. Домены в Прологе являются аналогами типов в других языках. Основными стандартными доменами Турбо Пролога являются — char, integer, real, string и symbol; Основная форма объявления доменов имеет следующий вид:
domains
argument_type1,…, argument_typeN = <стандартный домен>
argument_1,…, argument_N = <составной домен 1>;
<составной домен 2>;
<…>;
<составной домен N>;
19. Секция goal — это та, в которой вы задаете цель своей программы; Пролог ищет все решения и выводит на экран все значения, связываемые с переменными.
20. В Турбо Пролог включено более 200 встроенных стандартных предикатов и более дюжины стандартных доменов: в случае использования этих предикатов и доменов у вас нет необходимости объявлять их.
21. Арность (размерность) предиката — это число принимаемых им аргументов; два предиката с одним именем могут иметь различную арность. Предикаты с различными версиями арности должны собираться вместе, причем и в секции predicates и в секции clauses; однако предикаты с различной арностью рассматриваются как абсолютно разные.
22. Правила имеют форму:
ЗАГОЛОВОК: — <Подцель1>, <Подцель2>,…, <ПодцельN>.
Для разрешения правила Пролог должен разрешить все его подцели, создав при этом соответствующее множество связанных переменных. Если же одна из подцелей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с другими значениями переменных. Это процесс называется «поиск с возвратом».
23. Символ Пролога «if» отличается от «IF», используемых в других языках: правило Пролога работает в соответствии с условной формой then/if, тогда как оператор других языков IF работает в соответствии с условной формой if/then.
24. Менее используемыми секциями программ на Турбо Прологе являются секции database и constants, а также различные глобальные (global) секции. Кроме этого, вы можете задавать компилятору (в форме директив) особые инструкции, располагая их в начале исходного текста вашей программы.
