Введение

Чем отличается Акторный Пролог от других логических языков?

1. Акторный Пролог поддерживает повторное доказательство подцелей. Собственно, поэтому он так и называется. Повторно доказываемые подцели и есть "логические акторы".

Что такое повторно доказываемые подцели и почему их так важно было реализовать?

Логическая программа состоит из подцелей, которые надо доказать в ходе её исполнения (точно так же как обычная программа состоит из операторов, которые надо исполнить). Доказательство каждой подцели, в общем случае, приводит к конкретизации значений переменных программы. Например, в результате доказательства подцели

A = 5

значение переменной будет конкретизировано, если до этого она не имела значения (была "несвязанной"), или останется прежним, если она уже имела значение 5.

А вот если переменная A имела другое значение, скажем 7, доказательство подцели A=5 закончится неудачей. Потому что между логическими утверждениями A=5 и A=7 существует логическое противоречие.

Другими словами, в логических языках нет разрушающего присваивания, в привычном понимании этого слова. Если какая-либо переменная получила значение в ходе исполнения программы, в дальнейшем это значение может только конкретизироваться. Например, переменная B может сначала получить значение f(_,_,_,_), потом f(4,_,_,_), потом f(4,_,g(_),_), и так далее.

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

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

Откат это очень мощное и полезное средство логического программирования, в Акторном Прологе он тоже есть. Проблема, однако, состоит в том, что откат бывает только внутри компьютера, а в реальной жизни существуют необратимые процессы и явления, откату не подвластные. Например, программа на Прологе может печатать что-то на принтере. Если в программе возникнет откат, она, конечно, вернётся к предыдущему состоянию. Но что в этой ситуации должен делать принтер? Стирать напечатанный текст?

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

Итак, в Акторном Прологе программа состоит из повторно доказываемых подцелей (логических акторов). Далеко не все подцели являются повторно доказываемыми. В настоящее время (2002 г. от Р.Х.) повторно доказываемыми подцелями являются подцели goal, автоматически вызываемые во время создания экземпляров классов. А они уже включают в себя все остальные подели.

Если в ходе исполнения программы потребуется присвоить значение 5 переменной A, которая уже имеет значение 7, необходимо просто отменить результаты доказательства всех акторов, вступающих в логическое противоречие с утверждением A=5, а потом провести повторное доказательство этих акторов, уже при A=5. Если это возможно, таким образом мы осуществим логически корректное разрушающее присваивание. Если нет - ну, что же, придётся делать откат программы. В некотором смысле, откат это и есть отмена результатов доказательства сразу всех подцелей программы, правда, только до некоторой определённой точки в истории исполнения программы.

С точки зрения идеологии Акторного Пролога, во внешнем мире тоже существуют логические акторы, и программа взаимодействует именно с ними. Эти внешние акторы обладают следующими свойствами:

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

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

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

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

Уважаемые коллеги! Если у Вас хватило терпения дочитать до этого места, то сейчас самое время объяснить, чем же наш подход отличается от немонотонных логик, временных логик, модальных логик, transaction logic, defeasible logic и других идей, разработанных ранее в математике, искусственном интеллекте и логическом программировании. Отличие состоит в том, что повторное доказательство подцелей это новый принцип логического вывода, а вовсе не новая логика (Можно предложить различные стратегии исполнения Пролога, реализующие этот принцип). Мы осуществляем логический вывод в обычной логике предикатов первого порядка, как стандартный Пролог. Таким образом, логические акторы - это средство для осуществления модифицируемых рассуждений в динамическом внешнем окружении, а не средство для рассуждений о свойствах динамических объектов и внешней среды. Замечу, что, на самом деле, между этими двумя вещами нет никакого противоречия. Метод повторных доказательств можно точно так же использовать и для вывода в других логических системах, в том числе временных, модальных и др. Это интересная тема для новых исследований.


2. Все программы, написанные на Акторном Прологе, являются "долгоживущими" или "хранимыми" (по-английски это называется persistent). Это значит, что Вы можете в любой момент времени записать состояние программы в файл и выключить компьютер. А потом продолжить исполнение программы с того места, когда она была сохранена. Сохраняются состояния буквально всех объектов программы, включая содержимое текстовых окон и текущие позиции открытых файлов.

Эта возможность была заложена при проектировании языка специально для реализации интеллектуальных агентов. Интеллектуальные агенты - это программы, самостоятельно выполняющие задания, порученные им пользователем, в течение длительных промежутков времени - дней, недель, месяцев и более. Например, интеллектуальный агент может осуществлять поиск и сбор информации в Интернет. Не нужно объяснять, насколько важно, чтобы такие агенты могли запоминать своё состояние и возобновлять своё исполнение в случае сбоев в работе компьютера. Кроме того, я могу в любой момент остановить работу моих агентов, выключить компьютер и пойти домой, или перенести работающего агента с одного компьютера на другой на простой дискетке.

Оглавление