Theory Denotation

Up to index of Isabelle/HOL/IMP

theory Denotation
imports Natural
begin

(*  Title:      HOL/IMP/Denotation.thy
    ID:         $Id: Denotation.thy,v 1.19 2007/07/11 09:18:52 berghofe Exp $
    Author:     Heiko Loetzbeyer & Robert Sandner, TUM
    Copyright   1994 TUM
*)

header "Denotational Semantics of Commands"

theory Denotation imports Natural begin

types com_den = "(state×state)set"

constdefs
  Gamma :: "[bexp,com_den] => (com_den => com_den)"
  "Gamma b cd == (λphi. {(s,t). (s,t) ∈ (phi O cd) ∧ b s} ∪
                       {(s,t). s=t ∧ ¬b s})"

consts
  C :: "com => com_den"

primrec
  C_skip:   "C \<SKIP>   = Id"
  C_assign: "C (x :== a) = {(s,t). t = s[x\<mapsto>a(s)]}"
  C_comp:   "C (c0;c1)   = C(c1) O C(c0)"
  C_if:     "C (\<IF> b \<THEN> c1 \<ELSE> c2) = {(s,t). (s,t) ∈ C c1 ∧ b s} ∪
                                                {(s,t). (s,t) ∈ C c2 ∧ ¬b s}"
  C_while:  "C(\<WHILE> b \<DO> c) = lfp (Gamma b (C c))"


(**** mono (Gamma(b,c)) ****)

lemma Gamma_mono: "mono (Gamma b c)"
  by (unfold Gamma_def mono_def) fast

lemma C_While_If: "C(\<WHILE> b \<DO> c) = C(\<IF> b \<THEN> c;\<WHILE> b \<DO> c \<ELSE> \<SKIP>)"
apply simp
apply (subst lfp_unfold [OF Gamma_mono])  --{*lhs only*}
apply (simp add: Gamma_def)
done

(* Operational Semantics implies Denotational Semantics *)

lemma com1: "⟨c,s⟩ -->c t ==> (s,t) ∈ C(c)"
(* start with rule induction *)
apply (induct set: evalc)
apply auto
(* while *)
apply (unfold Gamma_def)
apply (subst lfp_unfold[OF Gamma_mono, simplified Gamma_def])
apply fast
apply (subst lfp_unfold[OF Gamma_mono, simplified Gamma_def])
apply fast
done

(* Denotational Semantics implies Operational Semantics *)

lemma com2: "(s,t) ∈ C(c) ==> ⟨c,s⟩ -->c t"
apply (induct c arbitrary: s t)

apply simp_all
apply fast
apply fast

(* while *)
apply (erule lfp_induct2 [OF _ Gamma_mono])
apply (unfold Gamma_def)
apply fast
done


(**** Proof of Equivalence ****)

lemma denotational_is_natural: "(s,t) ∈ C(c)  =  (⟨c,s⟩ -->c t)"
  by (fast elim: com2 dest: com1)

end

lemma Gamma_mono:

  mono (Gamma b c)

lemma C_While_If:

  C (WHILE b DO c) = C (IF b THEN c; WHILE b DO c ELSE SKIP)

lemma com1:

  c,s -->c t ==> (s, t) ∈ C c

lemma com2:

  (s, t) ∈ C c ==> c,s -->c t

lemma denotational_is_natural:

  ((s, t) ∈ C c) = c,s -->c t