Theory CKA
section ‹Behaviour Structure \label{sec:behaviour_structure}›
text ‹
Hoare et al.~\<^cite>‹"Hoare2011aa"› presented the framework of Concurrent Kleene Algebra (\CKAabbrv) which captures the concurrent
behaviour of agents. The framework of \CKAabbrv is adopted to describe agent behaviours in distributed
systems. For a \CKAabbrv~$\CKAstructure$,~$\CKAset$ is a set of possible behaviours. The operator~$+$ is
interpreted as a choice between two behaviours, the operator~$\CKAseq$ is interpreted as a sequential
composition of two behaviours, and the operator~$\CKApar$ is interpreted as a parallel composition of
two behaviours. The operators~$\CKAiterSeq{\,}$ and~$\CKAiterPar{\,}$ are interpreted as a finite sequential
iteration and a finite parallel iteration of behaviours, respectively. The element~$0$ represents the
behaviour of the \emph{inactive agent} and the element~$1$ represents the behaviour of the \emph{idle agent}.
Associated with a \CKAabbrv~$\cka$ is a natural ordering relation~$\CKAle$ related to the semirings upon which the
\CKAabbrv is built which is called the sub-behaviour relation. For behaviours~$a,b \in \CKAset$, we
write~$a \CKAle b$ and say that~$a$ is a sub-behaviour of~$b$ if and only if~$a + b = b$.
›
theory CKA
imports Main
begin
no_notation
rtrancl ("(_⇧*)" [1000] 999)
notation
times (infixl "*" 70)
and less_eq ("'(≤⇩𝒦')")
and less_eq ("(_/ ≤⇩𝒦 _)" [51, 51] 50)
text ‹
The class \emph{cka} contains an axiomatisation of Concurrent Kleene Algebras and a selection of useful theorems.›
class join_semilattice = ordered_ab_semigroup_add +
assumes leq_def: "x ≤ y ⟷ x + y = y"
and le_def: "x < y ⟷ x ≤ y ∧ x ≠ y"
and add_idem [simp]: "x + x = x"
begin
lemma inf_add_K_right: "a ≤⇩𝒦 a + b"
unfolding leq_def
by (simp add: add_assoc[symmetric])
lemma inf_add_K_left: "a ≤⇩𝒦 b + a"
by (simp only: add_commute, fact inf_add_K_right)
end
class dioid = semiring + one + zero + join_semilattice +
assumes par_onel [simp]: "1 * x = x"
and par_oner [simp]: "x * 1 = x"
and add_zerol [simp]: "0 + x = x"
and annil [simp]: "0 * x = 0"
and annir [simp]: "x * 0 = 0"
class kleene_algebra = dioid +
fixes star :: "'a ⇒ 'a" ("_⇧*" [101] 100)
assumes star_unfoldl: "1 + x * x⇧* ≤⇩𝒦 x⇧*"
and star_unfoldr: "1 + x⇧* * x ≤⇩𝒦 x⇧*"
and star_inductl: "z + x * y ≤⇩𝒦 y ⟹ x⇧* * z ≤⇩𝒦 y"
and star_inductr: "z + y * x ≤⇩𝒦 y ⟹ z * x⇧* ≤⇩𝒦 y"
class cka = kleene_algebra +
fixes seq :: "'a ⇒ 'a ⇒ 'a" (infixl ";" 70)
and seqstar :: "'a ⇒ 'a" ("_⇧;" [101] 100)
assumes seq_assoc: "x ; (y ; z) = (x ; y) ; z"
and seq_rident [simp]: "x ; 1 = x"
and seq_lident [simp]: "1 ; x = x"
and seq_rdistrib [simp]: "(x + y);z = x;z + y;z"
and seq_ldistrib [simp]: "x;(y + z) = x;y + x;z"
and seq_annir [simp]: "x ; 0 = 0"
and seq_annil [simp]: "0 ; x = 0"
and seqstar_unfoldl: "1 + x ; x⇧; ≤⇩𝒦 x⇧;"
and seqstar_unfoldr: "1 + x⇧; ; x ≤⇩𝒦 x⇧;"
and seqstar_inductl: "z + x ; y ≤⇩𝒦 y ⟹ x⇧; ; z ≤⇩𝒦 y"
and seqstar_inductr: "z + y ; x ≤⇩𝒦 y ⟹ z ; x⇧; ≤⇩𝒦 y"
and exchange: "(a*b) ; (c*d) ≤⇩𝒦 (b;c) * (a;d)"
begin
interpretation cka: kleene_algebra plus less_eq less "1" "0" seq seqstar
by (unfold_locales, simp_all add: seq_assoc seqstar_unfoldl seqstar_unfoldr seqstar_inductl seqstar_inductr)
lemma par_comm: "a * b = b * a"
proof -
have "(b*a) ; (1*1) ≤⇩𝒦 (a;1) * (b;1)" by (simp only: exchange)
hence "b * a ≤⇩𝒦 a * b" by (simp)
hence "a * b ≤⇩𝒦 b * a ⟷ a * b = b * a" by (rule antisym_conv)
moreover have "a * b ≤⇩𝒦 b * a" proof -
have "(a*b) ; (1*1) ≤⇩𝒦 (b;1) * (a;1)" by (rule exchange)
thus ?thesis by (simp)
qed
ultimately show ?thesis by (auto)
qed
lemma exchange_2: "(a*b) ; (c*d) ≤⇩𝒦 (a;c) * (b;d)"
proof -
have "(b*a) ; (c*d) ≤⇩𝒦 (a;c) * (b;d)" by (rule exchange)
thus ?thesis by (simp add: par_comm)
qed
lemma seq_inf_par: "a ; b ≤⇩𝒦 a * b"
proof -
have "(1*a) ; (1*b) ≤⇩𝒦 (a;1) * (1;b)" by (rule exchange)
thus ?thesis by simp
qed
lemma add_seq_inf_par: "a;b + b;a ≤⇩𝒦 a*b"
proof -
have "a;b ≤⇩𝒦 a*b" by (rule seq_inf_par)
moreover have "b;a ≤⇩𝒦 b*a" by (rule seq_inf_par)
ultimately have "a;b + b;a ≤⇩𝒦 a*b + b*a" by (simp add: add_mono)
thus ?thesis by (simp add: par_comm)
qed
lemma exchange_3: "(a*b) ; c ≤⇩𝒦 a * (b;c)"
proof -
have "(a*b) ; (1*c) ≤⇩𝒦 (a;1) * (b;c)" by (rule exchange_2)
thus ?thesis by simp
qed
lemma exchange_4: "a ; (b*c) ≤⇩𝒦 (a;b) * c"
proof -
have "(1*a) ; (b*c) ≤⇩𝒦 (a;b) * (1;c)" by (rule exchange)
thus ?thesis by simp
qed
lemma seqstar_inf_parstar: "a⇧; ≤⇩𝒦 a⇧*"
proof -
have "a ; a⇧* ≤⇩𝒦 a * a⇧*" by (rule seq_inf_par)
hence "1 + a ; a⇧* ≤⇩𝒦 1 + a * a⇧*" by (simp add: add_left_mono)
hence "1 + a ; a⇧* ≤⇩𝒦 a⇧*" by (simp add: star_unfoldl order_trans)
hence "a⇧; ; 1 ≤⇩𝒦 a⇧*" by (rule seqstar_inductl)
thus ?thesis by simp
qed
end
end