I'm trying to understand some Isabelle code, and there is some syntax I don't understand. I haven't seen them in tutorials, including the two bundled with the Isabelle2017 distribution, "Programming and Proving in Isabelle/HOL" and "The Isabelle/Isar Reference Manual". The fact that they're symbols, combined with Isabelle's very small user base, means that the answer is pretty un-google-able.
The first is tall angle brackets ⟨
⟩
, and the second is a double asterisk **
which renders in the output console as ∧*
(which is notably different than ASCII ^
).
Here's an example;
lemma pre_fifth_pure [simp]:
"triple net failures (a ** b ** c ** d ** ⟨ P ⟩) cod post =
(P ⟶ triple net failures (a ** b ** c ** d) cod post)"
The angle brackets always seem to surround a proposition. The definition of the triple
function implies that (a ** b ** c ** d)
is of type state_element set ⇒ bool
, where a state_element
is just a conjunction of a bunch of constructors;
datatype state_element =
StackHeightElm "nat"
| StackElm "nat * w256" ... (* 20 lines like this *)
Are these two pieces of syntax related? How could (a ** b ** c ** d)
be a function? Why can it have different numbers of the things delimited by the stars? Is this somehow custom defined syntax? The mysteries abound.