Theory SemilatAlg

Up to index of Isabelle/HOL/Jinja

theory SemilatAlg = Typing_Framework:

(*  Title:      HOL/MicroJava/BV/SemilatAlg.thy
    ID:         $Id: SemilatAlg.html 1910 2004-05-19 04:46:04Z kleing $
    Author:     Gerwin Klein
    Copyright   2002 Technische Universitaet Muenchen
*)

header {* \isaheader{More on Semilattices} *}

theory SemilatAlg = Typing_Framework:

(*<*)
syntax
  lesubstep_type :: "(nat × 's) set => 's ord => (nat × 's) set => bool"
                    ("(_ /{<='__} _)" [50, 0, 51] 50)
(*>*)
syntax (xsymbols)
  lesubstep_type :: "(nat × 's) set => 's ord => (nat × 's) set => bool"
                    ("(_ /{\<sqsubseteq>_} _)" [50, 0, 51] 50)
constdefs 
  lesubstep_type :: "(nat × 's) set => 's ord => (nat × 's) set => bool"
  "A {\<sqsubseteq>r} B ≡ ∀(p,τ) ∈ A. ∃τ'. (p,τ') ∈ B ∧ τ \<sqsubseteq>r τ'"

consts
  pluslussub :: "'a list => ('a => 'a => 'a) => 'a => 'a" 
(*<*)
syntax 
  pluslussub :: "'a list => ('a => 'a => 'a) => 'a => 'a" ("(_ /++'__ _)" [65, 1000, 66] 65)
(*>*)
syntax (xsymbols)
  pluslussub :: "'a list => ('a => 'a => 'a) => 'a => 'a" ("(_ /\<Squnion>_ _)" [65, 0, 66] 65)
primrec
  "[] \<Squnion>f y = y"
  "(x#xs) \<Squnion>f y = xs \<Squnion>f (x \<squnion>f y)"

constdefs
  bounded :: "'s step_type => nat => bool"
  "bounded step n ≡ ∀p<n. ∀τ. ∀(q,τ') ∈ set (step p τ). q<n"  

  pres_type :: "'s step_type => nat => 's set => bool"
  "pres_type step n A ≡ ∀τ∈A. ∀p<n. ∀(q,τ') ∈ set (step p τ). τ' ∈ A"

  mono :: "'s ord => 's step_type => nat => 's set => bool"
  "mono r step n A ≡ 
  ∀τ p τ'. τ ∈ A ∧ p<n ∧ τ \<sqsubseteq>r τ' --> set (step p τ) {\<sqsubseteq>r} set (step p τ')"

lemma [iff]: "{} {\<sqsubseteq>r} B" 
  (*<*) by (simp add: lesubstep_type_def) (*>*)

lemma [iff]: "(A {\<sqsubseteq>r} {}) = (A = {})"
  (*<*) by (cases "A={}") (auto simp add: lesubstep_type_def) (*>*)

lemma lesubstep_union:
  "[| A1 {\<sqsubseteq>r} B1; A2 {\<sqsubseteq>r} B2 |] ==> A1 ∪ A2 {\<sqsubseteq>r} B1 ∪ B2"
  (*<*) by (auto simp add: lesubstep_type_def) (*>*)

lemma pres_typeD:
  "[| pres_type step n A; s∈A; p<n; (q,s')∈set (step p s) |] ==> s' ∈ A"
(*<*) by (unfold pres_type_def, blast) (*>*)

lemma monoD:
  "[| mono r step n A; p < n; s∈A; s \<sqsubseteq>r t |] ==> set (step p s) {\<sqsubseteq>r} set (step p t)"
(*<*) by (unfold mono_def, blast) (*>*)

lemma boundedD: 
  "[| bounded step n; p < n; (q,t) ∈ set (step p xs) |] ==> q < n" 
(*<*) by (unfold bounded_def, blast) (*>*)

lemma lesubstep_type_refl [simp, intro]:
  "(!!x. x \<sqsubseteq>r x) ==> A {\<sqsubseteq>r} A"
(*<*) by (unfold lesubstep_type_def) auto (*>*)

lemma lesub_step_typeD:
  "A {\<sqsubseteq>r} B ==> (x,y) ∈ A ==> ∃y'. (x, y') ∈ B ∧ y \<sqsubseteq>r y'"
(*<*) by (unfold lesubstep_type_def) blast (*>*)


lemma list_update_le_listI [rule_format]:
  "set xs ⊆ A --> set ys ⊆ A --> xs [\<sqsubseteq>r] ys --> p < size xs -->  
   x \<sqsubseteq>r ys!p --> semilat(A,r,f) --> x∈A --> 
   xs[p := x \<squnion>f xs!p] [\<sqsubseteq>r] ys"
(*<*)
  apply (unfold Listn.le_def lesub_def semilat_def)
  apply (simp add: list_all2_conv_all_nth nth_list_update)
  done
(*>*)


lemma plusplus_closed: includes semilat shows
  "!!y. [| set x ⊆ A; y ∈ A|] ==> x \<Squnion>f y ∈ A"
(*<*)
proof (induct x)
  show "!!y. y ∈ A ==> [] \<Squnion>f y ∈ A" by simp
  fix y x xs
  assume y: "y ∈ A" and xs: "set (x#xs) ⊆ A"
  assume IH: "!!y. [| set xs ⊆ A; y ∈ A|] ==> xs \<Squnion>f y ∈ A"
  from xs obtain x: "x ∈ A" and "set xs ⊆ A" by simp
  from x y have "x \<squnion>f y ∈ A" ..
  with xs have "xs \<Squnion>f (x \<squnion>f y) ∈ A" by - (rule IH)
  thus "x#xs \<Squnion>f y ∈ A" by simp
qed
(*>*)

lemma (in semilat) pp_ub2:
 "!!y. [| set x ⊆ A; y ∈ A|] ==> y \<sqsubseteq>r x \<Squnion>f y"
(*<*)
proof (induct x)
  from semilat show "!!y. y \<sqsubseteq>r [] \<Squnion>f y" by simp
  
  fix y a l assume y:  "y ∈ A" and "set (a#l) ⊆ A"
  then obtain a: "a ∈ A" and x: "set l ⊆ A" by simp
  assume "!!y. [|set l ⊆ A; y ∈ A|] ==> y \<sqsubseteq>r l \<Squnion>f y"
  hence IH: "!!y. y ∈ A ==> y \<sqsubseteq>r l \<Squnion>f y" .

  from a y have "y \<sqsubseteq>r a \<squnion>f y" ..
  also from a y have "a \<squnion>f y ∈ A" ..
  hence "(a \<squnion>f y) \<sqsubseteq>r l \<Squnion>f (a \<squnion>f y)" by (rule IH)
  finally have "y \<sqsubseteq>r l \<Squnion>f (a \<squnion>f y)" .
  thus "y \<sqsubseteq>r (a#l) \<Squnion>f y" by simp
qed
(*>*)


lemma (in semilat) pp_ub1:
shows "!!y. [|set ls ⊆ A; y ∈ A; x ∈ set ls|] ==> x \<sqsubseteq>r ls \<Squnion>f y"
(*<*)
proof (induct ls)
  show "!!y. x ∈ set [] ==> x \<sqsubseteq>r [] \<Squnion>f y" by simp

  fix y s ls
  assume "set (s#ls) ⊆ A"
  then obtain s: "s ∈ A" and ls: "set ls ⊆ A" by simp
  assume y: "y ∈ A" 

  assume "!!y. [|set ls ⊆ A; y ∈ A; x ∈ set ls|] ==> x \<sqsubseteq>r ls \<Squnion>f y"
  hence IH: "!!y. x ∈ set ls ==> y ∈ A ==> x \<sqsubseteq>r ls \<Squnion>f y" .

  assume "x ∈ set (s#ls)"
  then obtain xls: "x = s ∨ x ∈ set ls" by simp
  moreover {
    assume xs: "x = s"
    from s y have "s \<sqsubseteq>r s \<squnion>f y" ..
    also from s y have "s \<squnion>f y ∈ A" ..
    with ls have "(s \<squnion>f y) \<sqsubseteq>r ls \<Squnion>f (s \<squnion>f y)" by (rule pp_ub2)
    finally have "s \<sqsubseteq>r ls \<Squnion>f (s \<squnion>f y)" .
    with xs have "x \<sqsubseteq>r ls \<Squnion>f (s \<squnion>f y)" by simp
  } 
  moreover {
    assume "x ∈ set ls"
    hence "!!y. y ∈ A ==> x \<sqsubseteq>r ls \<Squnion>f y" by (rule IH)
    moreover from s y have "s \<squnion>f y ∈ A" ..
    ultimately have "x \<sqsubseteq>r ls \<Squnion>f (s \<squnion>f y)" .
  }
  ultimately 
  have "x \<sqsubseteq>r ls \<Squnion>f (s \<squnion>f y)" by blast
  thus "x \<sqsubseteq>r (s#ls) \<Squnion>f y" by simp
qed
(*>*)


lemma (in semilat) pp_lub:
  assumes "z ∈ A"
  shows 
  "!!y. y ∈ A ==> set xs ⊆ A ==> ∀x ∈ set xs. x \<sqsubseteq>r z ==> y \<sqsubseteq>r z ==> xs \<Squnion>f y \<sqsubseteq>r z"
(*<*)
proof (induct xs)
  fix y assume "y \<sqsubseteq>r z" thus "[] \<Squnion>f y \<sqsubseteq>r z" by simp
next
  fix y l ls assume y: "y ∈ A" and "set (l#ls) ⊆ A"
  then obtain l: "l ∈ A" and ls: "set ls ⊆ A" by auto
  assume "∀x ∈ set (l#ls). x \<sqsubseteq>r z"
  then obtain "l \<sqsubseteq>r z" and lsz: "∀x ∈ set ls. x \<sqsubseteq>r z" by auto
  assume "y \<sqsubseteq>r z" have "l \<squnion>f y \<sqsubseteq>r z" ..  
  moreover
  from l y have "l \<squnion>f y ∈ A" ..
  moreover
  assume "!!y. y ∈ A ==> set ls ⊆ A ==> ∀x ∈ set ls. x \<sqsubseteq>r z ==> y \<sqsubseteq>r z
          ==> ls \<Squnion>f y \<sqsubseteq>r z"
  ultimately
  have "ls \<Squnion>f (l \<squnion>f y) \<sqsubseteq>r z" using ls lsz by -
  thus "(l#ls) \<Squnion>f y \<sqsubseteq>r z" by simp
qed
(*>*)


lemma ub1': includes semilat
shows "[|∀(p,s) ∈ set S. s ∈ A; y ∈ A; (a,b) ∈ set S|] 
  ==> b \<sqsubseteq>r map snd [(p', t')∈S. p' = a] \<Squnion>f y" 
(*<*)
proof -
  let "b \<sqsubseteq>r ?map \<Squnion>f y" = ?thesis

  assume "y ∈ A"
  moreover
  assume "∀(p,s) ∈ set S. s ∈ A"
  hence "set ?map ⊆ A" by auto
  moreover
  assume "(a,b) ∈ set S"
  hence "b ∈ set ?map" by (induct S, auto)
  ultimately
  show ?thesis by - (rule pp_ub1)
qed
(*>*)
    
 
lemma plusplus_empty:  
  "∀s'. (q, s') ∈ set S --> s' \<squnion>f ss ! q = ss ! q ==>
   (map snd [(p', t')∈ S. p' = q] \<Squnion>f ss ! q) = ss ! q"
(*<*)
apply (induct S)
apply auto 
done
(*>*)


end

lemma

  {} {<=_r} B

lemma

  (A {<=_r} {}) = (A = {})

lemma lesubstep_union:

  [| A1 {<=_r} B1; A2 {<=_r} B2 |] ==> A1 Un A2 {<=_r} B1 Un B2

lemma pres_typeD:

  [| pres_type step n A; s : A; p < n; (q, s') : set (step p s) |] ==> s' : A

lemma monoD:

  [| SemilatAlg.mono r step n A; p < n; s : A; s <=_r t |]
  ==> set (step p s) {<=_r} set (step p t)

lemma boundedD:

  [| bounded step n; p < n; (q, t) : set (step p xs) |] ==> q < n

lemma lesubstep_type_refl:

  (!!x. x <=_r x) ==> A {<=_r} A

lemma lesub_step_typeD:

  [| A {<=_r} B; (x, y) : A |] ==> EX y'. (x, y') : B & y <=_r y'

lemma list_update_le_listI:

  [| set xs <= A; set ys <= A; xs [<=r] ys; p < length xs; x <=_r ys ! p;
     semilat (A, r, f); x : A |]
  ==> xs[p := x +_f xs ! p] [<=r] ys

lemma

  [| semilat (A, r, f); set x <= A; y : A |] ==> x ++_f y : A

lemma pp_ub2:

  [| semilat (A, r, f); set x <= A; y : A |] ==> y <=_r x ++_f y

lemma

  [| semilat (A, r, f); set ls <= A; y : A; x : set ls |] ==> x <=_r ls ++_f y

lemma

  [| semilat (A, r, f); z : A; y : A; set xs <= A; ALL x:set xs. x <=_r z;
     y <=_r z |]
  ==> xs ++_f y <=_r z

lemma

  [| semilat (A, r, f); ALL (p, s):set S. s : A; y : A; (a, b) : set S |]
  ==> b <=_r map snd [(p', t'):S. p' = a] ++_f y

lemma plusplus_empty:

  ALL s'. (q, s') : set S --> s' +_f ss ! q = ss ! q
  ==> map snd [(p', t'):S. p' = q] ++_f ss ! q = ss ! q