Theory RKAT

(* Title: Refinement KAT
   Author: Victor Gomes, Georg Struth
   Maintainer: Victor Gomes <victor.gomes@cl.cam.ac.uk>
               Georg Struth <g.struth@sheffield.ac.uk> 
*)

subsection ‹Refinement Component›

theory RKAT
  imports "AVC_KAT/VC_KAT"

begin

subsubsection‹RKAT: Definition and Basic Properties›

text ‹A refinement KAT is a KAT expanded by Morgan's specification statement.›

class rkat = kat +
  fixes R :: "'a  'a  'a"
  assumes spec_def:  "x  R p q  H p x q"

begin

lemma R1: "H p (R p q) q"
  using spec_def by blast

lemma R2: "H p x q  x  R p q"
  by (simp add: spec_def)

subsubsection‹Propositional Refinement Calculus›

lemma R_skip: "1  R p p"
proof -
  have "H p 1 p"
    by (simp add: H_skip)
  thus ?thesis
    by (rule R2)
qed

lemma R_cons: "t p  t p'  t q'  t q  R p' q'  R p q"
proof -
  assume h1: "t p  t p'" and h2: "t q'  t q"
  have "H p' (R p' q') q'"
    by (simp add: R1)
  hence "H p (R p' q') q"
    using h1 h2 H_cons_1 H_cons_2 by blast
  thus ?thesis
    by (rule R2)
qed

lemma R_seq: "(R p r)  (R r q)  R p q"
proof -
  have "H p (R p r) r" and "H r (R r q) q"
    by (simp add: R1)+
  hence "H p ((R p r)  (R r q)) q"
    by (rule H_seq_swap)
  thus ?thesis
    by (rule R2)
qed

lemma R_cond: "if v then (R (t v  t p) q) else (R (n v  t p) q) fi  R p q"
proof - 
  have "H (t v  t p) (R (t v  t p) q) q" and "H (n v  t p) (R (n v  t p) q) q"
    by (simp add: R1)+
  hence "H p (if v then (R (t v  t p) q) else (R (n v  t p) q) fi) q"
    by (simp add: H_cond n_mult_comm)
 thus ?thesis
    by (rule R2)
qed

lemma R_loop: "while q do (R (t p  t q) p) od  R p (t p  n q)"
proof -
  have "H (t p  t q) (R (t p  t q) p)  p" 
    by (simp_all add: R1)
  hence "H p (while q do (R (t p  t q) p) od) (t p  n q)"
    by (simp add: H_loop)
  thus ?thesis
    by (rule R2)
  qed

lemma R_zero_one: "x  R 0 1"
proof -
  have "H 0 x 1"
    by (simp add: H_def)
  thus ?thesis
    by (rule R2)
qed

lemma R_one_zero: "R 1 0 = 0"
proof -
  have "H 1 (R 1 0) 0"
    by (simp add: R1)
  thus ?thesis
    by (simp add: H_def join.le_bot)
qed

end

end