Structural facts about GuardedPlusCal.Block's list-like interface, and the two induction
principles the semantics is proved by. Purely syntactic — nothing here mentions values, memories,
or the semantics, which is why it sits under Syntax/ rather than Semantics/.
Block is a non-empty list in disguise (begin ++ [last]), so it supports both a left-to-right
view (cons/end, Block.cons_end_induct) and a right-to-left one (concat/end,
Block.concat_end_induct). Semantics/Lemmas.lean needs both: reduction composes left to right,
while concat-shaped rewrites arise from appending a terminal statement.
Left-to-right induction: a block is either a single (possibly terminal) statement or a non-terminal statement in front of a smaller block.
Equations
Instances For
Block.cons_end_induct specialized to non-terminal blocks, where the motive need not be
index-polymorphic.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Right-to-left induction: a block is either a single statement or a smaller block extended on the
right. The counterpart of Block.cons_end_induct, needed wherever a proof peels the last
statement off.