Разделы презентаций


Лекция 5. Сентенциальное программирование: PROLOG

Содержание

Третья находка языка PROLOG, перенесенная в программирование из метода резолюций, — это стандартизация цели. Целью доказательства в методе резолюций всегда является получение пустого дизъюнкта, то есть

Слайды и текст этой презентации

Слайд 1
Общие концепции
Язык логического программирования PROLOG

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

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

Лекция 5. Сентенциальное программирование: PROLOG

Общие концепции   Язык логического программирования PROLOG представляет собой одну из моделей сентенциального программирования.

Слайд 2
Третья находка языка PROLOG,

перенесенная в программирование из метода резолюций, — это стандартизация цели.

Целью доказательства в методе резолюций всегда является получение пустого дизъюнкта, то есть стирание доказываемого выражения (с логической точки зрения, приведение его к абсурду). Точно так же и в языке PROLOG: успешное исполнение программы означает стирание поля зрения.
Четвертая находка создателей языка PROLOG взята из ограничения классической логики. Хорновские формулы



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


Общие концепции

Третья находка языка PROLOG, перенесенная в программирование из метода резолюций, — это

Слайд 3 Когда рассматривается исполнение программы в нетрадиционном языке

(например, PROLOG-программы), то естественно воспринимать конкретную реализацию языка как новую

машину нетрадиционной архитектуры с высокоуровневыми командами (в данном случае как PROLOG-машину).
Данные, используемые PROLOG-машиной, размещаются во всех частях поля памяти и имеют общую структуру.
Рассмотрим на уровне абстрактного синтаксиса структуру данных, обрабатываемых языком PROLOG. Все данные языка PROLOG являются термами. Термы построены из атомов при помощи функциональных символов. Атомами могут быть переменные и константы, в свою очередь, делящиеся на имена и числа. Функциональные символы являются именами и называются функторами. Среди функторов выделяются детерминативы, которые в реализации делятся на предикаты и встроенные функции (функции обычно используются внутри выражений, а предикаты являются основными единицами управления и обычно используются вне скобок как основной функциональный символ выражения). Детерминативы должны быть описаны в программе, а остальные функторы рассматриваются просто как структурные единицы и могут оставаться неописанными.

Поле зрения, поле памяти и PROLOG-программа

Когда рассматривается исполнение программы в нетрадиционном языке (например, PROLOG-программы), то естественно воспринимать конкретную реализацию

Слайд 4 В поле памяти выделяется поле зрения, содержащее

непосредственно обрабатываемые программой данные. Оно называется также целью и состоит

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

grandfather(X,Z) :- parent(X,Y), father(Y,Z).

Поле зрения, поле памяти и PROLOG-программа

В поле памяти выделяется поле зрения, содержащее непосредственно обрабатываемые программой данные. Оно называется также

Слайд 5Поле зрения, поле памяти и PROLOG-программа
Предложение состоит

из головного выражения (соответствующего заключению хорновской формулы) и его раскрытия:

нескольких выражений, соединенных как последовательно достигаемые подцели (они соответствуют посылкам хорновской формулы)1).
В любой момент исполнения программы база данных и база знаний могут быть модифицированы.
Теперь перейдем к конкретному представлению данных.
В конкретном синтаксисе переменные языка представлены именами, состоящими из букв и начинающимися с большой буквы либо с символа подчеркивания _. Переменная _ называется анонимной переменной и считается различной во всех своих вхождениях.
Константы языка PROLOG2) в конкретном синтаксисе делятся на имена (идентификаторы, начинающиеся с маленькой буквы либо совокупность нескольких специальных символов типа <, =, $), символы и числа (символы отождествляются с целыми числами, являющимися их кодами). Произвольная последовательность символов может быть сделана единой константой, например:

'C:\"SICS Prolog"\program.pl'.
Поле зрения, поле памяти и PROLOG-программа    Предложение состоит из головного выражения (соответствующего заключению хорновской

Слайд 6Поле зрения, поле памяти и PROLOG-программа
Любое константное

имя может служить функтором. Функторы различаются арностью (т. е. количеством

аргументов), таким образом, может быть сразу несколько функторов с одним и тем же именем. Например, write(a(1)) и write(a(1),file1) используют различные функторы. Некоторые функции могут быть описаны как операции (инфиксные, префиксные либо постфиксные). В отличие от почти всех остальных языков, операции рассматриваются лишь как сокращение для выразительности. Например, x+y означает в точности то же, что и +(x,y).
Для некоторых из предопределенных в системе функций и предикатов имеются дополнительные ограничения на аргументы3). Например, в функции load(f) f должно быть именем файла.
Поле зрения (цель), содержащее непосредственно обрабатываемые программой данные, состоит из последовательности термов, разделенных либо запятыми (в этом случае они понимаются как "последовательно достигаемые подцели"), либо символами |, в этом случае подцели "альтернативны".Наиболее важным и классическим является случай последовательно достигаемых подцелей, через который определяется и семантика альтернативных подцелей4).


Поле зрения, поле памяти и PROLOG-программа    Любое константное имя может служить функтором. Функторы различаются

Слайд 7Поле зрения, поле памяти и PROLOG-программа
В конкретном

представлении предложение, например,

grandfather(X,Z) :- parent(X,Y), father(Y,Z).

Также рассматривается как терм, поскольку имена , (здесь символ запятой — имя операции) и :- рассматриваются как инфиксные операции, причем запятая связывает сильнее.
Как правило, предложения, относящиеся к одному и тому же предикату, группируются вместе, например:
parent(X,Y) :- mother(X,Y).
parent(X,Y) :- father(X,Y).

Порядок предложений существенен.
База данных состоит из фактов. Факты могут выражаться в одном из двух видов. Во-первых, факт может рассматриваться как предложение, немедленно приводящее к успеху (успех— это стирание целей). Поэтому он может быть записан:
father(ivan,vasilij):-true.
Поле зрения, поле памяти и PROLOG-программа    В конкретном представлении предложение, например,

Слайд 8Поле зрения, поле памяти и PROLOG-программа
Здесь мы

встретились с одной из двух стандартных целей: true обозначает очевидную

удачу, а fail — очевидную неудачу.
Во-вторых, специально для фактов имеется скоропись, означающая то же самое:
father(ivan,vasilij).
В принципе, все остальные структуры языка PROLOG выражаются через элементарные, определенные выше. Но некоторые из структур прагматически настолько важны, что получили отдельное оформление и более эффективную реализацию. Это, прежде всего, списки и строки. Список, в принципе, определяется как терм, построенный из других термов и пустого списка [] применением двухместного функтора .(head,tail). Выстроенная в стандартном порядке композиция
.(a,.(b,. . . , .(z,[]). . . ))

Понимается как линейный список и обозначается [a,b,. . . ,z].

Для обозначения присоединения нескольких данных термов к началу списка имеется стандартная операция
[t,u|L].

Поле зрения, поле памяти и PROLOG-программа    Здесь мы встретились с одной из двух стандартных

Слайд 9Поле зрения, поле памяти и PROLOG-программа
Строки рассматриваются

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

в двойные кавычки:

"Ну, получили то, что искали? Ответьте y или n.”

Заслуживает упоминания механизм введения новых операций в язык PROLOG. Каждый пользователь может определить свои собственные унарные или бинарные операции или переопределить стандартные. Приведем в качестве примера описания некоторых стандартных операторов языка PROLOG:
:- op(1200,xfx, ':-').
:- op(1200,fx, [':-','?-']).
:- op(1000,xfy, ',').
:- op(700, xfx, [=,is,<,=<,==]).
:- op(500, yfx, [+,-]).
:- op(500, fx, [+,-,not]).
:- op(400, yfx,[*,/,div]).

Поле зрения, поле памяти и PROLOG-программа    Строки рассматриваются как линейные списки кодов символов и

Слайд 10Поле зрения, поле памяти и PROLOG-программа
Первый аргумент

в этих описаниях — приоритет операции. Он может быть от

1 до 1500. Второй аргумент — шаблон операции; x обозначает выражение с приоритетом, строго меньшим приоритета операции; y — выражение с приоритетом, который меньше или равен приоритету операции, f — положение самого символа операции относительно аргументов. Таким образом, шаблон yfx для операции - означает, что выражение X-Y-Z понимается как (X-Y)-Z, шаблон xfy для запятой означает, что t,u,r понимается как t,(u,r),шаблон xfx для :- означает невозможность использования нескольких таких операций подряд без дополнительных скобок. Операции с меньшими приоритетами связывают свои аргументы сильнее. Один и тот же атом может быть определен и как унарная, и как бинарная операция.
Пример описаний операций показывает, что даже локальное использование различения конкретно- и абстрактно-синтаксических представлений программы дает возможность получить большие преимущества. В PROLOG не пришлось отдельно заниматься семантикой операций, поскольку в абстрактном синтаксисе их нет. Автоматически устраняются многие тонкие вопросы, связанные, в частности, с возможностью PROLOG-программы преобразовывать саму себя (см. упр. 7).

Поле зрения, поле памяти и PROLOG-программа    Первый аргумент в этих описаниях — приоритет операции.

Слайд 11Управление исполнением программы

Доказано, что для выражений первого

порядка имеется эффективный алгоритм унификации, находящий для двух выражений унифицирующую

подстановку либо обосновывающий, что такой подстановки нет.
Пример. Две последовательности выражений



где a, b — константы, а латинские буквы из конца алфавита — переменные, унифицируются в


подстановкой



Управление исполнением программы   Доказано, что для выражений первого порядка имеется эффективный алгоритм унификации, находящий для

Слайд 12Управление исполнением программы

А в двух последовательностях


никакие два соответственных выражения унифицированы быть не могут.

Уже в приведенном примере видно, что унификация — глобальная операция.
Заметим, что логический алгоритм унификации обладает свойством частичного исполнения: если унифицировать две подструктуры, то после исполнения унифицирующей подстановки можно продолжить унификацию остальных подструктур, и результат унификации не изменится. Так что выражения могут унифицироваться одно за другим1).
Рассмотрим, как исполняется программа на языке PROLOG. В программе может быть одно целевое предложение, не имеющее головной части. Оно начинается с функтора :- или ?-. В программе, транслируемой и исполняемой в пакетном режиме, обычно используется первый функтор, а при задании цели с терминала в режиме диалога—второй. Разница между ними проявляется лишь в режиме диалога. Второй вариант цели позволяет пользователю после нахождения одного из решений продолжить выполнение программы для поиска следующего решения. Первый такой возможности ему не представляет, программа находит какое-нибудь решение и останавливается.


Управление исполнением программы   А в двух последовательностях   никакие два соответственных выражения унифицированы быть

Слайд 13Управление исполнением программы

Исходная цель называется запросом. Переменные,

входящие в запрос, носят особый статус. Их значения в ходе

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

Управление исполнением программы   Исходная цель называется запросом. Переменные, входящие в запрос, носят особый статус. Их

Слайд 14Управление исполнением программы

Заметим, что переменные предыдущих унификаций отождествляются с переменными

следующих унификаций лишь в том случае, если эти переменные дожили

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


Управление исполнением программыЗаметим, что переменные предыдущих унификаций отождествляются с переменными следующих унификаций лишь в том случае, если

Слайд 15Управление исполнением программы

Так, например, если программа и

ее база данных имеют вид

greater(X,Y):-greater1(X,Y).
greater(X,Y):-greater1(Z,Y),greater(X,Z).
greater1(X,f(X)).
estimation(X,Y):-greater(X,Y),known(Y).
known(f(f(f(f(a))))).
unknown(a).
unknown(b).
то ответом на запрос
?-unknown(Y),estimation(Y,X).
будет
Y=a
X=(f(f(f(f(a))))
Yes
а при попытке ответа на запрос
?-estimation(b,X).
программа зациклится.

Управление исполнением программы   Так, например, если программа и ее база данных имеют вид

Слайд 16Управление исполнением программы

Насколько каверзны вроде бы невинные

предположения (например, условие, что подцели достигаются строго одна за другой

и варианты перебираются в том же порядке), сделанные в языке PROLOG, видно из того, что при логически эквивалентной переформулировке одного из предложений программы
estimation(X,Y):-known(Y),greater(X,Y).
программа успешно ответит на второй запрос
No
То, что некоторый функтор определен как операция, не значит, что он вычисляется. Это просто изменение конкретно-синтаксического представления. Для того чтобы иметь возможность вычислить выражение, нужно определить функтор как внутреннюю или внешнюю функцию. При этом необязательно делать его операцией.
Рассмотренные до сих пор средства языка PROLOG не дают возможности сформулировать отрицание. Впрочем, отрицание и не может присутствовать в хорновых формулах, его наличие разрушает свойства, которые послужили основой для модели вычислений языка PROLOG. Но на практике оно нужно, и поэтому в языке PROLOG введен его суррогат. Этот суррогат дает возможность программисту минимально управлять точками возврата. Если в цели встал на первое место атом ! (называемый предикатом отсечения), то он успешно унифицируется и уничтожает последнюю точку возврата. Предикат ! используется прежде всего для определения отрицания как явного неуспеха подцели.

Управление исполнением программы   Насколько каверзны вроде бы невинные предположения (например, условие, что подцели достигаются строго

Слайд 17Управление исполнением программы

Пример 6.3.2. Рассмотрим, как с

помощью ! и списков программируется поиск пути в лабиринте (и

даже в произвольном ориентированном графе).

way(X,X,[X]).
way(X,Y,[Y|Z]):-connect(U,Y), nomember(Y,Z),way(X,U,Z).
way(X,Y,[Y|Z]):-connect(U,Y), way(X,U,Z).
nomember(Y,Z):-member(Y,Z),!,fail.
nomember(Y,Z).
connect(begin,1).
connect(1,begin).
connect(1,2).
connect(2,3).
connect(3,1).
connect(3,4).
connect(4,end).  
Управление исполнением программы   Пример 6.3.2. Рассмотрим, как с помощью ! и списков программируется поиск пути

Слайд 18Управление исполнением программы

В ответ на запрос

?-way(begin,end,X).

программа

выдаст

X = [end, 4, 3, 2, 1, begin]
Yes

Вместо определения nomember можно написать предложение
way(X,Y,[Y|Z]):-connect(U,Y),not (member(Y,Z)),way(X,U,Z).

Управление исполнением программы   В ответ на запрос        ?-way(begin,end,X).

Слайд 19Управление исполнением программы

Предикат отсечения можно использовать для

того, чтобы превратить PROLOG-программу в программу с традиционным управлением, оставив

из специфики языка лишь операцию унификации. На практике и при обучении часто бывают случаи, когда кому-нибудь никак не удается совладать с PROLOG и отладить свою программу, поскольку он зациклен на императивном стиле программирования. Узнав о !, он облегченно вздыхает и переписывает свою программу таким образом, что она становится изоморфной программе в обычном языке программирования. Как правило, при такой трансформации теряются главные преимущества языка PROLOG, но зато сохраняются все его недостатки.
Прагматические соглашения о порядке выполнения действий в программе привели к тому, что если мы запишем в форме языка PROLOG тривиальную тавтологию
A:-A.
и этот оператор выполнится, то программа зациклится. И по этой причине, и по причине ошибки в унификации предложения языка PROLOG, сохранив внешнюю форму логических, по существу отношения к логике уже не имеют.
подцели.

Управление исполнением программы   Предикат отсечения можно использовать для того, чтобы превратить PROLOG-программу в программу с

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика