Collecting Semantics for Example Program
The general form of collecting semantics is:
Here will be except at the entry into our control-flow graph.
Example Program with One Variable
// v0 x := 0; // v1 while (x < 10) { // v2 x := x + 3; } // v3
Concrete Domain: Sets of States
Because there is only one variable:
- state is an element of (value of )
- sets of states are sets of integers, (concrete domain)
- for each command , strongest postcondition function
Strongest Postondition
Compute or example statements:
Sets of States at Each Program Point
Collecting semantics computes with sets of states at each program point
We sometimes write as a shorthand for , for .
In the initial state the value of variable is arbitrary:
post Function for the Collecting Semantics
From here we can derive that maps to new value of :
The fixpoint condition becomes a system of inequations
whereas the postfix point (see Tarski's fixpoint theorem) becomes
Computing Fixpoint
To find fixpoint, we compute the sequence for :
Thus, all subsequent values remain the same and is the fixpoint of collecting semantics equations. In general we may need infinitely many iterations to converge.
Question: Suppose that we have a program that terminates for every possible initial state. Can we always find a finite constant such that
i.e. the sequence such as the one above is guaranteed to stabilize?
Example: Assume an arbitrary initial value and consider the loop. Compute a sequence of sets of states at the point after the increment statement in the loop, following the equations for collecting semantics.
if (y > 0) { x = 0 while (x < y) { x = x + 1 } }
What always works from omega continuity:
where on a tuple above means taking union of each component separately, so .