Научная статья на тему 'ФОРМАЛЬНОЕ ОПИСАНИЕ МЕХАНИЗМА ЛОГИЧЕСКОГО ВЫВОДА В ПРОЛОГЕ'

ФОРМАЛЬНОЕ ОПИСАНИЕ МЕХАНИЗМА ЛОГИЧЕСКОГО ВЫВОДА В ПРОЛОГЕ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
172
128
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ / LOGIC PROGRAMMING / МЕХАНИЗМ ЛОГИЧЕСКОГО ВЫВОДА / INFERENCE ENGINE / ПОИСК С ВОЗВРАТОМ / BACKTRACKING / РЕКУРСИЯ / RECURSION

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Залогова Л.А.

Цель статьи: обосновать целесообразность и изложить формальное описание механизма логического вывода в Прологе. Неформальное описание того, как Пролог-система отвечает на вопросы, позволяет ввести основные понятия механизма вывода, однако даёт понятное объяснение поиска решения только простых задач. Формальное же описание механизма логического вывода позволяет понять все особенности организации и управления поиском решения задач любой сложности. Так как программирование на Прологе требует глубокого понимания процесса доказательства цели, использование формального описания механизма вывода является достаточно важным.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Залогова Л.А.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

FORMAL DESCRIPTION OF THE INFERENCE ENGINE IN PROLOG

The purpose of the paper is to demonstrate the appropriateness and to present a formal description of the inference engine in Prolog. A non-formal description of the situation, when Prolog-system answers the questions, allows one to identify the key notions of the inference engine, although this description gives clear explanation for finding the solutions of simple problems only. The formal description of inference engine, on the other hand, helps to understand all the peculiarities of organization and managing the finding solutions for problems of different complexity. Since the Prolog programming presupposes deep understanding of the target validation process, the formal description of inference engine is quite important.

Текст научной работы на тему «ФОРМАЛЬНОЕ ОПИСАНИЕ МЕХАНИЗМА ЛОГИЧЕСКОГО ВЫВОДА В ПРОЛОГЕ»

2014

ВЕСТНИК ПЕРМСКОГО УНИВЕРСИТЕТА

Математика. Механика. Информатика

Вып. 4(27)

УДК 004.432.4

Формальное описание механизма логического вывода в Прологе

Л. А. Залогова

Пермский государственный национальный исследовательский университет Россия, 614990, Пермь, ул. Букирева,15 zalogova. la@gmail .com

Цель статьи: обосновать целесообразность и изложить формальное описание механизма логического вывода в Прологе. Неформальное описание того, как Пролог-система отвечает на вопросы, позволяет ввести основные понятия механизма вывода, однако даёт понятное объяснение поиска решения только простых задач. Формальное же описание механизма логического вывода позволяет понять все особенности организации и управления поиском решения задач любой сложности. Так как программирование на Прологе требует глубокого понимания процесса доказательства цели, использование формального описания механизма вывода является достаточно важным.

Ключевые слова: логическое программирование; механизм логического вывода; поиск с возвратом; рекурсия.

1. Введение

Идея логического стиля программирования заключается в том, чтобы

1) описать совокупность утверждений на формальном языке (базу знаний);

2) сформулировать цель (вопрос);

3) воспользоваться системой логического вывода для получения решения.

К примеру, на языке Пролог, который поддерживает логическую парадигму, достаточно описать предметную область и поставить цель, а Пролог-система автоматически найдёт решение (если оно существует). При использовании такого языка основное внимание уделяется описанию объектов и связей между ними, а не разработке последовательности действий для достижения цели.

В математических терминах Пролог-программа интерпретируется следующим образом:

^ факты и правила - множество аксиом, а вопрос пользователя - теорема;

^ механизм вывода пытается доказать эту теорему, т. е. логически вывести её из аксиом.

Несмотря на то, что поиск решения выполняется автоматически, программирование на Прологе (описание предметной области и

© Залогова Л. А., 2014

постановка цели) требует глубокого понимания, и, следовательно, наглядного представления механизма логического вывода.

2. Неформальное описание механизма вывода

Для простейших задач достаточно неформального описания того, как Пролог-система отвечает на вопросы. Кроме того, неформальное описание позволяет

^ наглядно продемонстрировать основную идею механизма вывода;

^ ввести базовые понятия механизма вывода - сопоставление и указатель отката;

^ рассмотреть особенности переменных в Прологе.

Основная идея механизма вывода. Сопоставление

Пусть программа на Прологе содержит утверждения:

спорт (пётр, плавание) /* Петр увлекается плаванием */

спорт ( иван, Х) :- спорт ( пётр, Х ) /* Иван увлекается теми же видами спорта, что и Пётр */ и цель

спорт ( иван, плавание ) /* увлекается ли Иван плаванием?*/

Факты и правила используются для доказательства цели. Пролог ищет факты и головы правил, сопоставимые с целью. Два факта сопоставимы (или соответствуют друг другу), если выполняются следующие три условия: имена отношений одинаковы; отношения имеют равное количество аргументов; аргументы, расположенные в одинаковых позициях, сопоставимы.

Сопоставление аргументов осуществляется по следующим правилам: имена конкретных объектов сопоставимы, если они совпадают; переменная сопоставима с именем конкретного объекта; переменная сопоставима с другой переменной.

Неформальное описание механизма вывода сводится к следующему.

Пролог просматривает утверждения в том порядке, в каком они вводились в базу знаний (на печатной странице это соответствует просмотру сверху вниз). Поэтому сначала сравнивается цель

спорт (иван, плавание) и факт спорт (пётр, плавание).

Первые аргументы несопоставимы. Следовательно, попытка сопоставить цель и факт неуспешна. Пролог продолжает поиск следующего предиката "спорт" и находит правило: спорт (иван, Х) :- спорт (пётр, Х).

Цель и голова сопоставимы. В результате сопоставления переменная Х означивается, т.е. принимает значение "плавание". Теперь каждому появлению переменной Х в правиле соответствует значение "плавание": спорт (иван, плавание): - спорт (пётр, плавание).

На следующем этапе Пролог должен проверить истинность тела правила для того, чтобы доказать или опровергнуть его голову. Таким образом, подцель

спорт (пётр, плавание) создаётся самим Прологом. Для доказательства подцели Пролог просматривает базу знаний и находит факт

спорт (пётр, плавание), который сопоставим с подцелью. Следовательно, голова правила действительно имеет место и доказана истинность цели. Новый факт успешно выведен, хотя он в явном виде в базе знаний отсутствует.

2.2.Особенности переменных. Указатели отката

Описание базы знаний "Спорт" :

спорт (иван, плавание) (1)

спорт (пётр, лыжи ) (2)

{А} спорт (пётр, плавание) (3)

{Б} спорт (пётр, коньки) (4)

Цель

спорт ( пётр, Х ), причём, необходимо найти все решения, удовлетворяющие цели.

Сначала переменная цели Х не имеет значения. В этом случае говорят, что переменная неозначена. Неозначенные переменные называют свободными.

Продолжим неформальное описание механизма логического вывода.

Пролог пытается сопоставить цель с фактом (1). Так как первые аргументы несопоставимы, то попытка - неуспешна. На следующем шаге Пролог сопоставляет цель с фактом (2). Значением переменной Х становится "лыжи", т.е. переменная Х означивается объектом "лыжи". Однако существуют другие утверждения, которые могут быть использованы для доказательства цели. Поэтому Пролог устанавливает указатель отката {А} на следующий факт для отношения "спорт". С этого указателя Пролог сделает попытку найти другое решение. Переменная Х больше несвободна (связана). Пролог печатает имя объекта, которое обозначает переменная - "лыжи". Теперь необходимо найти другой объект, который могла бы обозначать переменная Х. Это значит, что Пролог должен "забыть" о том, что переменная Х связана с объектом "лыжи", и снова продолжить поиск с неозначенной переменной Х. Таким образом, переменная Х вновь становится свободной и выполняется откат в точку {А}. В точке, определённой этим указателем отката, Пролог находит утверждение спорт (пётр, плавание) и устанавливает указатель отката {Б} на следующий факт для отношения "спорт". Переменная Х означивается объектом "плавание". Пролог печатает новое значение переменной, "забывает" о том, что Х обозначает "плавание" и выполняется откат в точку {Б}. В результате сопоставления цели и факта (4) переменная Х означивается объектом "коньки". В нашем примере нет больше информации о том, какими видами спорта увлекается Пётр, поэтому Пролог завершает поиск. Ответ: Х = лыжи Х = плавание Х = коньки одной стороны, использование неформального описания механизма вывода необходимо, с другой стороны - не всегда оправдано, так как даёт понятное объяснение поиска решения только для простых задач. Поиск решения более сложных задач не столь очевиден. Часто трудно удержать в памяти сопоставления и вновь появляющиеся

подцели, которые нужно доказать. В этом случае для описания механизма вывода неформальный подход вряд ли подойдёт. Формальное же представление механизма вывода позволяет понять все особенности организации и управления поиском решения, и, следовательно, научиться профессионально составлять программы.

3. Формальное описание механизма вывода

Формальное описание процесса доказательства цели удобно представлять в виде схемы. Элемент этой схемы изображается так:

цель, которую нужно доказать

Подстановка

утверждение, которое используется для доказательства

новые подцели, которые нужно доказать

Замечание. В дальнейшем используются базовые понятия механизма вывода - "сопоставление" и "указатель отката", введённые при неформальном описании поиска решения.

3.1. Поиск без возвратов

Рассмотрим условие задачи, предложенное в книге [3], и опишем её на Прологе.

Тони, Майкл и Джон - члены альпинистского клуба. Каждый член этого клуба является горнолыжником, скалолазом или и тем и другим. Все скалолазы не любят дождь. Все горнолыжники любят снег. Джон любит снег. Майкл любит всё, что не любит Тони, и не любит всё, что любит Тони. Тони любит снег и дождь. Есть ли член альпинистского клуба, который является скалолазом и не является горнолыжником? Кто он?

Описание базы знаний "Клуб альпинистов":

спортсмен (майкл ) спортсмен ( тони ) спортсмен ( джон ) любит ( джон, снег ) любит ( тони, снег )

любит ( тони, дождь ) любит (майкл, X) :-

not (любит (тони, X))

есть (X, горнол ):-

спортсмен (X ), любит (X, снег) есть (X, скалол):-

спортсмен (X ), not (любит (X, дождь)) Цель: есть (Z, скалол),

not (есть (Z, горнол))

Формальное описание доказательства этой цели представлено на рис. 1.

Даже для такой несложной задачи достаточно трудно запомнить подцели, которые необходимо доказать. Формальное же описание процесса поиска решения позволяет наглядно и быстро разобраться во всех сопоставлениях и доказательствах подцелей.

3.2. Поиск с возвратом

При решении большинства задач Пролог использует метод проб и ошибок, который называется поиском с возвратом. Идея этого метода состоит в следующем. Если в результате поиска решения полученный результат не даёт искомого ответа, то Пролог выбирает другой вариант поиска. Подобным образом ищется путь в лабиринте. Один из способов найти выход из лабиринта - это поворачивать налево на каждой развилке лабиринта до тех пор, пока не встретится тупик. Тогда следует вернуться к последней развилке и попробовать свернуть вправо, после чего опять поворачивать налево на каждой развилке. Путём методичного перебора всех возможных путей, в конце концов, найдётся выход. Решение будет найдено, если оно существует.

Несколько утверждений (альтернатив) одного предиката могут быть использованы для доказательства подцели (развилка). В этом случае Пролог выбирает первое утверждение и ставит указатель отката у второго утверждения. Если использование первой альтернативы не дало желаемого результата (эквивалентно достижению тупика в лабиринте), Пролог возвращается к указателю отката и делает выбор второй альтернативы. При этом указатель отката устанавливается на следующую альтернативу.

есть (Z, скалол ) , not ( есть (Z, горнол )) Z <- X

есть (X, скалол ) :- спортсмен (X ),

not (любит (X, дождь))

спортсмен (X ), not (любит (X, дождь )), not ( есть (X, горнол ))

X <- майкл

спортсмен ( майкл ) not ( любит (майкл, дождь )), not (есть (майкл, горнол))

Х <- дождь

любит (майкл, Х ) :- not (любит ( тони, Х )) not ( not (любит (тони, дождь ))), not ( есть (майкл, горнол ))

любит ( тони, дождь )

not ( есть ( майкл, горнол )) X <- майкл

есть (X, горнол ) :- спортсмен (X ),

любит ( X, снег ) not ( спортсмен ( майкл ) , любит ( майкл, снег ))

спортсмен ( майкл )

not ( любит ( майкл, снег ))

X <- снег

любит (майкл, X ) :- not (любит ( тони, X ))

not ( not ( любит ( тони, снег )))

любит ( тони, снег )

ДА

Ответ: Z = майкл

Рис. 1. Доказательство цели есть ((Z, скалол), not (есть (Z, горнол))

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

Именно формальное описание механизма вывода позволяет наглядно проследить весь процесс поиска решения и постепенное формирование результата при использовании рекурсивных правил.

Используя формальное описание механизма вывода, рассмотрим на примере процесс поиска с возвратом и организацию повторяющихся действий через рекурсию.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Задача. Определить, существует ли путь между двумя вершинами в циклическом графе. Для решения задачи воспользуемся графом, изображённым на рис. 2.

Рис. 2. Граф с циклом

Описание базы знаний «Поиск пути» дуга (a, c). дуга ( c, f ). дуга ( f, a).

дуга ( f, h). {1}

дуга ( h, k).

цельпуть (X, Y, P) :-путь (X, Y, P, [X],. (2)

путь ( X, X, [ X], _) :- !. (3)

путь (X, Y, [X, Y], _) :- дуга (X, Y), !. (4) путь (X, Y, [X\ R], T ) :- дуга (X, Z), not (найден (Z, T )), путь (Z, Y, R, [Z\ T]). (5) найден (H, [ H \ _ ]). (6)

найден (H, [_ \ T]) :- найден (H, T ). (7) Цель: цель путь (a, h, P).

Доказательство этой цели представлено на рис. 3. Пунктирными линиями показано формирование результата при возврате из рекурсивных вызовов.

5^

цель путь (a, h, P)

X<-a Y<- h

Рис. 3 (начало)

[a, c, f, h ] - ответ

P <- [a, c, f h ]

4^ цель путь ( X, Y, P) :- путь ( X, Y, P, [ X]) (2)

путь (a, h, P, [a ])

X <- a Y <- h P <- [ X \ R] T <- [ a ]

P <- [a, c, f, h ]

----4^

путь ( X, Y, [ X \ R], T ) :-

дуга ( X, Z ), not (найден (Z, T )), путь (Z, Y, R, [Z \ T ] ) (5)

дуга (a, Z), not (найден (Z, [a ])), путь (Z, h, R, [Z \ a ] ) дуга ( a, c )

Z <- c

Продолжение рис. 3

дуга (c, Z), not (найден (Z, [c, a])), путь (Z, h, R1, [Z | c,a ] ) дуга ( c, f )

Z <- f

not (найден (f, [ c, a])), /* истина - см. ссылку «В» */ путь ( f, h, R1, [f, c, a ] )

....... 2У

X <- f Y <- h R1 <- [fl R2 ] ' T <- [ f, c, a]

R1 <- [ f, h ]

путь (X, Y, [X | R2 ], T) :-

дуга ( X, Z), not ( найден (Z, T)), путь (Z, Y, R2, [Z | T] ) (5)

дуга ( f, Z ), not (найден (Z, [f, c, a])), путь (Z, h, R2, [Z | f, c ,a ] )

Z <- a

дуга ( f, a)

установка указателя отката {1} на факт дуга ( _ f, h )

not (найден (a, [ f, c, a])), /* ложь - см. ссылку «С» */-> необходимо передоказательство подцели дуга ( f Z);

дуга ( f Z ), not (найден (Z, [f, c, a])), путь (Z, h, R2, [Z | f c ,a ] ) дуга ( f, h )

Z <- h

not (найден (h, [f, c, a ])), /* истина - см. ссылку «D» */ путь ( h, h, R2, [ h, f, c , a ] )

X <- h R2 <- [h ] -

R2 <- [h ]

путь ( X, X, [ X], _) :- !

ДА

Рис. 3. Доказательство цели цель путь ( a, h, P)

Продолжение рис. 3

«А»

not ( найден ( c, [ a ] ))

H <- c T <- [ ]

найден (H, [ _ | T]) :- найден (H, T) (7)

not найден ( c, [ ]) ) истина

«В»

not ( найден ( f, [c, a ] )

H <-f T <- [a ]

найден (H, [ _ | T]) :- найден (H, T) (7)

not найден ( f, [ a ]) ) истина

H <- f T <- [ ]

найден (H, [ _ | T]) :- найден (H, T) (7)

not найден ( f, [ ]) ) истина «С» и «D» доказываются аналогично «В»

Без формального описания механизма вывода достаточно трудно проследить доказательство всех подцелей и формирование окончательного результата при возврате из рекурсивных вызовов.

Заключение

Программирование на Прологе требует глубокого понимания механизма логического вывода, поэтому необходимо средство его наглядного представления. С одной стороны, неформальное описание механизма вывода необходимо, так как позволяет наглядно продемонстрировать основную идею доказательства цели; с другой стороны - даёт понятное объяснение поиска решения только для достаточно простых задач. Формальное же описа-

ние механизма вывода - наглядное представление процесса доказательства цели для задач различной сложности.

Список литературы

1. Братко И. Алгоритмы искусственного интеллекта на языке Prolog. М.: Вильямс, 2004. 637 с.

2. Адаменко А.Н., Кучуков А.М. Логическое программирование и Visual Prolog. СПб.: БХВ-Петербург, 2003. 992 с.

3. Нильсон Н. Искусственный интеллект. Методы поиска решений. М.: Мир, 1973.

4. Шрайнер П.А. Основы программирования на языке Пролог: Учебное пособие. М: Интернет-Университет Информационных Технологий, 2005.

Formal description of the inference engine in Prolog

L. A. Zalogova

Perm State University, Russia, 614990, Perm, Bukirev st., 15 zalogova. la@gmail. com

The purpose of the paper is to demonstrate the appropriateness and to present a formal description of the inference engine in Prolog. A non-formal description of the situation, when Prolog-system answers the questions, allows one to identify the key notions of the inference engine, although this description gives clear explanation for finding the solutions of simple problems only. The formal description of inference engine, on the other hand, helps to understand all the peculiarities of organization and managing the finding solutions for problems of different complexity. Since the Prolog programming presupposes deep understanding of the target validation process, the formal description of inference engine is quite important.

Key words: logic programming; inference engine; backtracking; recursion.

i Надоели баннеры? Вы всегда можете отключить рекламу.