Introduction
Situation calculus was initially proposed by John McCarthy (who also invented Lisp as well as Garbage Collection) in the 1960's. Since then, many resources are old and outdated, since everyone now has adopted Raymond Reiter's version from the earlier 90's as a starting point, which they also largely expand upon.
Situation calculus is a second-order branching-time predicate logic for representing about dynamically changing worlds. It is a multi-sorted logic with actions, fluents, and situations. Fluents are dynamic properties that change over time, that take objects as their arguments. Actions also take objects as their argument, and have a precondition first-order formula ($Poss$ / 'possible'). After executing an action, fluents are updated with another first-order formula, one formula per fluent, that specifies the effects of certain named actions occuring are, also known as a successor state axiom. This provides the foundations for describing all change in the world, which alleviates another problem in knowledge representation, namely the frame problem.
So, what are situations then? Situations are very simple: they are a trace of actions that have been performed thus far at any given point. The initial situation $S_0$ states that no action has been performed. So, situations are merely an execution history and entirely described with their fluents derivable from a list of actions. Insert image of situation tree here
The basics
The four foundational axioms are as follows:Applications of situation calculus
Agent languages
Typically, the situation calculus is not used alone, but with other languages/interpreters. A famous family of these is known as theGOLOG-family of languages, with many variants:- Golog — the OG.
- ConGolog - adds concurrency (both interleaving and true concurrency later on, as well as interrupts and prioritised execution for reactive programming/exogenous events).
- IndiGolog — online execution extension of ConGolog.
- TeamGolog —