Интеллектуальные информационные системы
Теоретическая часть лабораторной работы №1
Знакомство с Visual Prolog. Структура программы на Прологе. Факты, правила, вопросы.
1. СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ PROLOG
Обычно программа Visual Prolog включает три или четыре основных раздела. Это раздел выражений clauses, раздел описания предикатов predicates, раздел доменов domains и раздел цели goal.
1.1. Раздел clauses
В разделе выражений clauses программист размещает все включаемые в программу факты и правила.
Выражения, относящиеся к определенному предикату, должны размещаться в разделе clauses вместе. Последовательность определяющих предикат выражений называется ПРОЦЕДУРОЙ.
Фактом называют отношение или свойство, о котором известно, что оно имеет значение истина. Например:
pred1(1).
pred2(3,"Start").
pred3(computer(ibm,ps_2)).
Правилом же является конструкция, содержащая некоторые условия:
pred4(Arg1,Arg2,...,ArgN) if
pred5(...) and pred6(...) and ... predN(...).
или:
pred4(Arg1,Arg2,...,ArgN) :- pred5(...), pred6(...), ... , predN(...).
где «:-» соответствует «if», а «,» соответствует «and».
Иначе, правило – это связанное отношение. Правила позволяют Прологу логически выводить одну порцию информации из другой. Правило принимает значение «истина», если доказано, что заданный набор условий является истинным.
1.2. Раздел predicates
Если программист определяет в разделе clauses свой собственный предикат, то он ДОЛЖЕН объявить его в разделе predicates. В противном случае Visual Prolog не будет знать, о чем идет речь. Когда объявляется предикат, Прологу сообщается о том, к каким доменам принадлежат аргументы этого предиката.
Предикаты определяются фактами и правилами. В разделе predicates просто перечисляется каждый предикат с указанием доменов аргументов.
Имя предиката должно начинаться с буквы; после этой буквы могут следовать буквы, цифры и символы подчеркивания. Величина букв значения не имеет, но все-таки не рекомендуется использовать в качестве первой буквы заглавную.
Общий вид определения предиката:
pred(dom1,dom2,...,domN)
pred – имя предиката (имя отношения) (формально оно относится к типу symbol), dom – тип данных конкретного аргумента (всего аргументов в предикате N – это число аргументов предиката, его называют арностью предиката (от термина arity, и иногда пишут pred/N).
Например:
Predicates
run
sum(real,real,real).
parent(string,string).
student(string).
В этом же разделе можно задать тип детерминизма предиката, вставляя перед объявлением предиката ключевые слова procedure, determ, failure или erroneous. С другой стороны, можно определить недетерминированный предикат – вставляя перед его объявлением ключевые слова nondeterm или multy. Если предикат объявляется как детерминированный, то компилятор выдает предупреждение или ошибку, если найдет недетерминированные предложения для этого предиката. Режимом детерминизма для предикатов по умолчанию является determ.
1.3. Раздел domains
Домены в Прологе подобны типам в Паскале. Они дают возможность присваивать различным видам информации, которая в противном случае выглядела бы одинаково, отличные имена. В программе Visual Prolog объекты в отношении (аргументы предиката) принадлежат доменам; это могут быть домены стандартные или специальные, определяемые программистами.
Раздел domains служит двум очень важным целям. Во-первых, можно определить для доменов осмысленные имена, причем даже в том случае, если внутренне они совпадают с именами уже существующих доменов. Во-вторых, объявления специальных доменов используются для объявления структур данных, которые стандартными доменами не определяются.
Иногда целесообразно объявить домен тогда, когда возникает потребность более четкого выделения каких-либо частей раздела predicates. Объявление программистом своих собственных доменов помогает документировать предикаты, которые определяются путем задания в качестве типа аргумента удобного и понятного имени.
Например:
domains
selector = integer % тип selector для целых чисел
list_str = string* % список со строковыми данными
computer = name(string,list_sel,selector,integer) % описание структуры
1.4. Раздел goal
В Visual Prolog предусмотрен раздел goal, который должен включаться в программу.
Важно отметить то, что содержание раздела goal аналогично правилу. Это попросту список подцелей. Но между разделом goal и правилом есть два отличия:
1. После ключевого слова goal не следует знак :- (если).
2. При запуске программы на выполнение Visual Prolog отрабатывает цель автоматически.
Visual Prolog как бы вызывает цель (обращается к разделу goal), а программа выполняется, пытаясь удовлетворить тело целевого правила. Если достигаются все подцели раздела goal, то программа успешно завершается. Если же в процессе выполнения программы какая-либо подцель не достигается, то и программа заканчивает работу неудачно. Хотя, если смотреть на программу извне, разница между этими двумя случаями не обязательно должна быть видна; программа просто завершается.
1.5. Другие разделы программы
Раздел facts
Программа на Visual Prolog представляет собой совокупность фактов и правил. Иногда в процессе выполнения программы может возникнуть потребность видоизменения (модификации, удаления или добавления) некоторых фактов, с которыми работает программа. В таком случае факты образуют ДИНАМИЧЕСКУЮ или ВНУТРЕННЮЮ базу данных; она может изменяться в процессе выполнения программы. В Visual Prolog для объявления в программе фактов, которые должны стать частью динамической (или изменяющейся) базы данных, предусмотрен специальный раздел - facts.
Такой раздел базы данных объявляется с помощью ключевого слова facts, куда включаются объявления фактов, предназначенных для организации динамической базы данных (БД). В Visual Prolog имеется несколько встроенных предикатов, существенно облегчающих использование динамической БД.
Раздел constants
В программе на Visual Prolog можно объявить и использовать символические константы. Раздел объявления констант начинается ключевым словом constants, после которого следуют сами объявления с соблюдением следующего синтаксиса:
<Идентификатор> = <Макроопределение>
<Идентификатор> – это имя константы, а <Макроопределение> – это то, что этому имени соответствует. Каждое <Макроопределение> заканчивается символом новой строки, так что в одной строке может размещаться только одно описание константы. На объявленные таким образом константы можно затем ссылаться в программе.
Рассмотрим следующий пример:
constants
нуль = 0
один = 1
два = 2
сотня = (10*(10-1)+10)
пи = 3.141592653
еда = мясо
красный = 4
Перед компиляцией программы Visual Prolog заменит каждую константу действительной строкой, которую она представляет.
На использование констант накладываются следующие ограничения:
- определение константы не может ссылаться само на себя;
- в программе может быть несколько разделов constants, но константы должны объявляться до их использования;
- идентификаторы констант являются глобальными и могут объявляться только один раз. Несколько объявлений одного и того же идентификатора приведут к выдаче сообщения Constant identifier can only be declared once (Идентификатор константы может быть объявлен только один раз).
Разделы global
Visual Prolog позволяет объявить в программе некоторые домены, предикаты и выражения ГЛОБАЛЬНЫМИ (в отличие от ЛОКАЛЬНЫХ). Это можно сделать, сформировав в самом начале программы отдельные разделы global domains, global predicates и global facts.
Социальные сети