Исчисление событий
Исчисление событий — это логическая теория для представления событий и рассуждения о них, а также о том, каким образом события изменяют состояние некоторого реального или искусственного мира. Исчисление событий применяется как к действиям, совершаемым агентами, так и к внешним событиям, находящимся вне контроля какого-либо агента.
Обзор
Исчисление событий описывает состояние мира в каждый момент времени как множество всех фактов (называемых флуентами), которые справедливы в этот момент. События инициируют и завершают флуенты.
В отличие от большинства других подходов к рассуждению об изменениях, исчисление событий явно выделяет время: события связываются с моментами их наступления, а флуенты — с моментами их действия.
Исходная версия исчисления событий, предложенная Робертом Ковальски и Мареком Серготом в 1986 году[1], была сформулирована как программа на языке логического программирования и разрабатывалась для представления нарративов и обновлений баз данных[2]. Каве Эшги показал, как использовать исчисление событий для планирования[3], применяя абдуктивное логическое программирование для генерации гипотетических действий, направленных на достижение желаемого состояния.
В 1990-х годах Мюррей Шэнахан и Роб Миллер расширили исчисление событий и переформулировали его в терминах предикатной логики с ограничением[4]. Эти и последующие расширения позволили формализовать недетерминированные действия, параллельные действия, действия с отложенными и постепенными эффектами, а также действия с длительностью, непрерывными изменениями и неинертными флуентами.
Михил ван Ламбалген и Хамм показали, что формулировка исчисления событий как программы с логическими ограничениями может обеспечить алгоритмическую семантику времени и аспекта для естественного языка[5].
Флуенты и события
В исчислении событий флуенты подвергаются реификации, то есть представляются с помощью термов. Например, выражение говорит о том, что зелёный блок находится на столе в момент времени 1. Здесь — это предикат, а — терм. В общем виде атомарная формула выражает, что флуент справедлив в указанный момент времени.
События также реифицируются и представляются термами. Например, выражает, что зелёный блок был перемещён на красный блок в момент времени 3. В общем виде означает, что событие произошло в заданный момент.
Связи между событиями и инициируемыми или завершаемыми ими флуентами выражаются с помощью следующих атомарных формул:
- — если событие происходит в момент времени, то флуент становится справедливым после этого момента.
- — если событие происходит в момент времени, то флуент перестаёт быть справедливым после этого момента.
Независимая от предметной области аксиома
Исчисление событий было частично разработано как альтернатива исчислению ситуаций[6][7] — как решение известной проблемы фреймов при представлении и рассуждении об изменениях состояния мира под действием событий.
Существует много вариантов исчисления событий. Однако ядро одной из самых простых и полезных версий можно выразить с помощью единственной, независимой от предметной области аксиомы:
Эта аксиома утверждает, что
- флуент справедлив в момент , если
- событие произошло в момент и
- инициирует в и
- предшествует и
- не существует такого события и момента , чтобы
- произошло в и
- завершает в и
- .
Решение проблемы фреймов в исчислении событий достигается благодаря интерпретации этой аксиомы в рамках немонотонной логики, например, в предикатной логике с ограничениями (circumscription)[8] либо как программы на логике Хорна с отрицанием как неудачей[1]. На самом деле, circumscription является одним из вариантов семантики для отрицания как неудачи[9], и тесно связано с семантикой полноты программ на логике Хорна[10] (где если трактуется как если и только если).
Ключевая аксиома исчисления событий определяет предикат через предикаты , , , и . Для применения исчисления событий к конкретной задаче необходимо также определить эти вспомогательные предикаты.
Исчисление событий допускает различные определения временных предикатов и . На практике время чаще всего представляется дискретно (натуральными числами) или непрерывно (неотрицательные вещественные числа). Однако время может быть и частично упорядочено.
Аксиомы, зависящие от предметной области
Для применения исчисления событий в конкретной предметной области требуется определить, какие события инициируют или завершают какие флуенты. Например, в предметной области «мир блоков» событие перемещения объекта на новое место инициирует флуент , то есть объект находится на новом месте, и завершает флуент для предыдущего положения:
Если нужно зафиксировать, что флуент изначально справедлив в некоторый момент (например, в момент 1), то с помощью описанной выше аксиомы потребуется специальное событие, инициирующее флуент:
Аксиомы, зависящие от задачи
Для использования исчисления событий после определения предикатов , , , , необходимо задать предикаты , которые описывают конкретный контекст задачи.
Например, в мире блоков можно описать начальное состояние двух блоков (красный блок лежит на зелёном, а зелёный — на столе), а затем последовательность событий: перемещение красного блока на стол в момент 1 и перемещение зелёного блока на красный в момент 3 — итоговое «переворачивание» башни:
Реализация на языке Пролог
Исчисление событий естественным образом реализуется на чистом Прологе (без нелогических расширений). Например, вышеописанный сценарий для мира блоков реализуется (с незначительными упрощениями) следующим образом:
holdsAt(Fluent, Time2) :-
before(Time1, Time2),
happensAt(Event, Time1),
initiates(Event, Fluent, Time1),
not(clipped(Fluent, Time1, Time2)).
clipped(Fluent, Time1, Time2) :-
terminates(Event, Fluent, Time),
happensAt(Event, Time),
before(Time1, Time),
before(Time, Time2).
initiates(initialise(Fluent), Fluent, Time).
initiates(move(Object, Place), on(Object, Place), Time).
terminates(move(Object, Place), on(Object, Place1), Time).
happensAt(initialise(on(green_block, table)), 0).
happensAt(initialise(on(red_block, green_block)), 0).
happensAt(move(red_block, table), 1).
happensAt(move(green_block, red_block), 3).
Данная программа на Прологе отличается от предыдущей формализации следующими моментами:
- Ядро аксиомы переписано с использованием дополнительного предиката
clipped(Fact, Time1, Time2)., что позволяет устранить экзистенциальные кванторы, чтобы все переменные были неявно универсально квантифицированы (как принято в Прологе). - Изменён порядок условий, чтобы ответы на запросы формировались в хронологическом порядке.
- Из условия исключено равенство, то есть
before(Time1, Time).предполагает, что события не могут одновременно инициировать и завершать один и тот же флуент. Это упрощает определение за счёт исключения условия .
Пример подходящего определения:
before(Time1, Time2) :-
timeline(Eternity),
append(Before, [Time2 | After], Eternity),
member(Time1, Before).
timeline([0, 1, 2, 3, 4, 5]).
</ref> предиката before(Time1, Time2) позволяет получить ответы на запрос «что справедливо когда» по временной шкале:
?- holdsAt(Fluent, Time).
Fluent = on(green_block,table), Time = 1.
Fluent = on(red_block,green_block), Time = 1.
Fluent = on(green_block,table), Time = 2.
Fluent = on(red_block,table), Time = 2.
Fluent = on(green_block,table), Time = 3.
Fluent = on(red_block,table), Time = 3.
Fluent = on(red_block,table), Time = 4.
Fluent = on(green_block,red_block), Time = 4.
Fluent = on(red_block,table), Time = 5.
Fluent = on(green_block,red_block), Time = 5.
Программа также позволяет строить отрицательные запросы: «какие флуенты в какие моменты НЕ справедливы». Для корректной работы необходимо предварительно определить все переменные в отрицательных условиях, например:
timePoint(1).
timePoint(2).
timePoint(3).
timePoint(4).
timePoint(5).
fluent(on(red_block, green_block)).
fluent(on(green_block, red_block)).
fluent(on(red_block, table)).
fluent(on(green_block, table)).
?- timePoint(T), fluent(F), not(holdsAt(F, T)).
F = on(green_block,red_block), T = 1.
F = on(red_block,table), T = 1.
F = on(red_block,green_block), T = 2.
F = on(green_block,red_block), T = 2.
F = on(red_block,green_block), T = 3.
F = on(green_block,red_block), T = 3.
F = on(red_block,green_block), T = 4.
F = on(green_block,table), T = 4.
F = on(red_block,green_block), T = 5.
F = on(green_block,table), T = 5.
Инструменты для рассуждений
Помимо Пролога и его диалектов, существуют и другие инструменты для рассуждения на основе исчисления событий:
Расширения
Примечания
Литература
- Brandano, S. (2001). «The Event Calculus Assessed», IEEE TIME Symposium: 7-12.
- Kowalski, R., Sadri, F. (1995). «Variants of the Event Calculus», ICLP: 67-81.
- Mueller, E. T. (2015). Commonsense Reasoning: An Event Calculus Based Approach (2-е изд.). Waltham, MA: Morgan Kaufmann/Elsevier. ISBN 978-0128014165. (Пособие по применению исчисления событий)
- Shanahan, M. (1997). Solving the frame problem: A mathematical investigation of the common sense law of inertia. MIT Press.
- Shanahan, M. (1999). «The Event Calculus Explained» Springer Verlag, LNAI (1600): 409-30.