суббота, 24 ноября 2012 г.

Prolog #2.1

Погружение в Prolog.

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

2.1. Логическое программирование

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

Факты и правила

Всё в Prolog определено в терминах двух конструкций: факт и правило. Факт - это выражение на языке Prolog, состоящее лишь из идентификатора, за которым следует н-ка констант(н-ка - это кортеж). Идентификатор интерпретируется как имя (математического) отношения и факт означает, что данная н-ка значений находится в отношении. В Prolog идентификатор отношения называется предикатом; когда кортеж значений находится в отношении, мы говорим, что этот кортеж удовлетворяет предикату. 

В качестве простого примера рассмотрим следующую программу на Prolog, которая определяет ориентированный граф из 5 узлов - в данном примере содержатся только факты.

Пример 1 - Ориентированный граф I

edge(a, b).
edge(a, e).
edge(b, d).
edge(b, c).
edge(c, a).
edge(e, b).

Как мы видим, эта программа содержит 6 фактов. Интуитивно, эти 6 фактов описывают ориентированный граф, в котором есть грани от a к b, a к e, b к d, и так далее. Идентификатор edge - это предикат, и 6 фактов определяют отношение edge на графе; идентификаторы a, b, c, d, e - это абстрактные константные значения, обозначающие имена для узлов графа. Константные значения схожи по своей сути с тем, что вы уже возможно использовали в языках Pascal и C - типы перечисления.

Факт обозначает то, что определенный кортеж значений удовлетворяет предикату безусловно. Правило, с другой стороны, это выражение на языке Prolog, в котором есть условия, определяющие в каких случаях кортеж значений удовлетворяет предикату(как набор if-else - прим. переводчика). Вообще говоря, факт - это частный случай правила, где условие всегда удовлетворяется(т.е. эквивалентно "true").

Граф - очень интересная штука, но не такая уж и практичная, если мы больше ничего не можем на нем задать, кроме отношения "edge". Следующий пример содержит правило, которое определяет свойство "путь длиной два" между двумя гранями.

Пример 2 - Ориентированный граф II

edge(a, b).
edge(a, e).
edge(b, d).
edge(b, c).
edge(c, a).
edge(e, b).

tedge(Node1, Node2) :-
        edge(Node1, SomeNode),
        edge(SomeNode, Node2).

Последние 3 строки этой программы формируют правило, которое задает новый предикат tedge. Левая часть правила выглядит точь в точь как факт, за исключением того, что параметры  начинаются с большой буквы, что дает понять системе Prolog, что это не константы, а переменные. Правая часть правила состоит из двух термов разделенных запятой, которая читается как "AND"(И). Приведем пример чтения данного правила:

 Пара (Node1, Node2) удовлетворяет предикату tedge, если существует узел SomeNode, такой, что пары (Node1, SomeNode) и (SomeNode, Node2) оба удовлетворяют предикату edge.

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

Комментариев нет:

Отправить комментарий