# Hoare logic

Hoare logic (also known as Floyd–Hoare logic or Hoare rules) is a formal system with a set of logical rules for reasoning rigorously about the correctness of computer programs. It was proposed in 1969 by the British computer scientist and logician C. A. R. Hoare, and subsequently refined by Hoare and other researchers.[1] The original ideas were seeded by the work of Robert Floyd, who had published a similar system[2] for flowcharts.

## Hoare triple

The central feature of Hoare logic is the Hoare triple. A triple describes how the execution of a piece of code changes the state of the computation. A Hoare triple is of the form

$\{P\}\;C\;\{Q\}$

where P and Q are assertions and C is a command. P is named the precondition and Q the postcondition: when the precondition is met, the command establishes the postcondition. Assertions are formulae in predicate logic.

Hoare logic provides axioms and inference rules for all the constructs of a simple imperative programming language. In addition to the rules for the simple language in Hoare's original paper, rules for other language constructs have been developed since then by Hoare and many other researchers. There are rules for concurrency, procedures, jumps, and pointers.

## Partial and total correctness

Standard Hoare logic proves only partial correctness, while termination needs to be proved separately. Thus the intuitive reading of a Hoare triple is: Whenever P holds of the state before the execution of C, then Q will hold afterwards, or C does not terminate. Note that if C does not terminate, then there is no "after", so Q can be any statement at all. Indeed, one can choose Q to be false to express that C does not terminate.

Total correctness can also be proven with an extended version of the While rule.

## Rules

### Empty statement axiom schema

The empty statement rule asserts that the skip statement does not change the state of the program, thus whatever holds true before skip also holds true afterwards.

$\frac{}{\{P\}\ \textbf{skip}\ \{P\}} \!$

### Assignment axiom schema

The assignment axiom states that after the assignment any predicate holds for the variable that was previously true for the right-hand side of the assignment. Formally, let P be an expression in which the variable x is free. Then:

$\frac{}{\{P[E/x]\}\ x:=E \ \{P\} } \!$

where $P[E/x]$ denotes the expression P in which all free occurrences of x have been replaced with expression E.

The assignment axiom means that the truth of $\{P[E/x]\}$ is equivalent to the after-assignment truth of $\{P\}$. Thus were $\{P[E/x]\}$ true prior to the assignment, by the assignment axiom, then $\{P\}$ would be true subsequent to which. Conversely, were $\{P[E/x]\}$ false prior to the assignment statement, $\{P\}$ must then be false consequently.

This is equivalent to saying that to find the precondition, first take the post-condition and replace all occurrences of the left-hand side of the assignment with the right-hand side of the assignment. Be careful not to try to do this backwards by following this incorrect way of thinking: $\{P\} x :=E \{P[E/x]\}$

Examples of valid triples include:

• $\{x+1 = 43\}\ y:=x + 1\ \{ y = 43 \}\!$
• $\{x + 1 \leq N \}\ x := x + 1\ \{x \leq N\}\ \!$

The assignment axiom proposed by Hoare does not apply when more than one name may refer to the same stored value. For example,

$\{ A \} \ x := 2\ \{y = 3 \}$

is not a true statement if x and y refer to the same variable, because no precondition A can cause y to be 3 after x is set to 2.

### Rule of composition

Hoare's rule of composition applies to sequentially executed programs S and T, where S executes prior to T and is written S;T (Q is called the midcondition):[3]

$\frac {\{P\}\ S\ \{Q\}\ , \ \{Q\}\ T\ \{R\} } {\{P\}\ S;T\ \{R\}} \!$

For example, consider the following two instances of the assignment axiom:

$\{ x + 1 = 43\} \ y:=x + 1\ \{y =43 \}$

and

$\{ y = 43\} \ z:=y\ \{z =43 \}$

By the sequencing rule, one concludes:

$\{ x + 1 = 43\} \ y:=x + 1; z:= y\ \{z =43 \}$

### Conditional rule

$\frac { \{B \wedge P\}\ S\ \{Q\}\ ,\ \{\neg B \wedge P \}\ T\ \{Q\} } { \{P\}\ \textbf{if}\ B\ \textbf{then}\ S\ \textbf{else}\ T\ \textbf{endif}\ \{Q\} } \!$

### Consequence rule

$\frac { P^\prime \rightarrow\ P\ ,\ \lbrace P \rbrace\ S\ \lbrace Q \rbrace\ ,\ Q \rightarrow\ Q^\prime } { \lbrace P^\prime\ \rbrace\ S\ \lbrace Q^\prime\rbrace } \!$

### While rule

$\frac { \{P \wedge B \}\ S\ \{P\} } { \{P \}\ \textbf{while}\ B\ \textbf{do}\ S\ \textbf{done}\ \{\neg B \wedge P\} } \!$

Here P is the loop invariant.

### While rule for total correctness

$\frac { <\;\textrm{is\ well-founded,}\;[P \wedge B \wedge t = z ]\ S\ [P \wedge t < z ]} { [P]\ \textbf{while}\ B\ \textbf{do}\ S\ \textbf{done}\ [\neg B \wedge P] } \!$

In this rule, in addition to maintaining the loop invariant, one also proves termination by way of a term, called the loop variant, here t, whose value strictly decreases with respect to a well-founded relation during each iteration. Note that, given the invariant P, the condition B must imply that t is not a minimal element of its range, for otherwise the premise of this rule would be false. Because the relation "<" is well-founded, each step of the loop is counted by decreasing members of a finite chain. Also note that square brackets are used here instead of curly braces to denote total correctness, i.e. termination as well as partial correctness. (This is one of various notations for total correctness.)

## Examples

 Example 1 $\{x+1 = 43\}\!$ $\ y:=x + 1\ \!$ $\{ y = 43 \}\!$ (Assignment Axiom) $( x + 1 = 43 \Leftrightarrow x = 42 )$ $\{x=42\}\!$ $\ y:=x + 1\ \!$ $\{y=43 \land x=42\}\!$ (Consequence Rule) Example 2 $\{x + 1 \leq N \}\!$ $\ x := x + 1\ \!$ $\{x \leq N\}\ \!$ (Assignment Axiom) ($x < N \implies x + 1 \leq N$ for x, N with integer types) $\{x < N \}\!$ $\ x := x + 1\ \!$ $\{x \leq N\}\ \!$ (Consequence Rule)