Theory BD_Security_TS
subsection ‹Instantiation for transition systems›
theory BD_Security_TS
imports Abstract_BD_Security Filtermap Transition_System
begin
declare Let_def[simp]
no_notation relcomp (infixr "O" 75)
locale BD_Security_TS = Transition_System istate validTrans srcOf tgtOf
for istate :: 'state and validTrans :: "'trans ⇒ bool"
and srcOf :: "'trans ⇒ 'state" and tgtOf :: "'trans ⇒ 'state"
+
fixes
φ :: "'trans => bool" and f :: "'trans ⇒ 'value"
and
γ :: "'trans => bool" and g :: "'trans ⇒ 'obs"
and
T :: "'trans ⇒ bool"
and
B :: "'value list ⇒ 'value list ⇒ bool"
begin
definition V :: "'trans list ⇒ 'value list" where "V ≡ filtermap φ f"
definition O :: "'trans trace ⇒ 'obs list" where "O ≡ filtermap γ g"
sublocale Abstract_BD_Security
where validSystemTrace = "validFrom istate" and V = V and O = O and B = B and TT = "never T" .
lemma O_map_filter: "O tr = map g (filter γ tr)" unfolding O_def filtermap_map_filter ..
lemma V_map_filter: "V tr = map f (filter φ tr)" unfolding V_def filtermap_map_filter ..
lemma V_simps[simp]:
"V [] = []" "¬ φ trn ⟹ V (trn # tr) = V tr" "φ trn ⟹ V (trn # tr) = f trn # V tr"
unfolding V_def by auto
lemma V_Cons_unfold: "V (trn # tr) = (if φ trn then f trn # V tr else V tr)"
by auto
lemma O_simps[simp]:
"O [] = []" "¬ γ trn ⟹ O (trn # tr) = O tr" "γ trn ⟹ O (trn # tr) = g trn # O tr"
unfolding O_def by auto
lemma O_Cons_unfold: "O (trn # tr) = (if γ trn then g trn # O tr else O tr)"
by auto
lemma V_append: "V (tr @ tr1) = V tr @ V tr1"
unfolding V_def using filtermap_append by auto
lemma V_snoc:
"¬ φ trn ⟹ V (tr ## trn) = V tr" "φ trn ⟹ V (tr ## trn) = V tr ## f trn"
unfolding V_def by auto
lemma O_snoc:
"¬ γ trn ⟹ O (tr ## trn) = O tr" "γ trn ⟹ O (tr ## trn) = O tr ## g trn"
unfolding O_def by auto
lemma V_Nil_list_ex: "V tr = [] ⟷ ¬ list_ex φ tr"
unfolding V_def using filtermap_Nil_list_ex by auto
lemma V_Nil_never: "V tr = [] ⟷ never φ tr"
unfolding V_def using filtermap_Nil_never by auto
lemma Nil_V_never: "[] = V tr ⟷ never φ tr"
unfolding V_def filtermap_map_filter by (induction tr) auto
lemma list_ex_iff_length_V:
"list_ex φ tr ⟷ length (V tr) > 0"
by (metis V_Nil_list_ex length_greater_0_conv)
lemma length_V: "length (V tr) ≤ length tr"
by (auto simp: V_def length_filtermap)
lemma V_list_all: "V tr = map f tr ⟷ list_all φ tr"
by (auto simp: V_def length_filtermap)
lemma V_eq_Cons:
assumes "V tr = v # vl1"
shows "∃ trn tr2 tr1. tr = tr2 @ [trn] @ tr1 ∧ never φ tr2 ∧ φ trn ∧ f trn = v ∧ V tr1 = vl1"
using assms filtermap_eq_Cons unfolding V_def by auto
lemma V_eq_append:
assumes "V tr = vl1 @ vl2"
shows "∃ tr1 tr2. tr = tr1 @ tr2 ∧ V tr1 = vl1 ∧ V tr2 = vl2"
using assms filtermap_eq_append[of φ f] unfolding V_def by auto
lemma V_eq_RCons:
assumes "V tr = vl1 ## v"
shows "∃ trn tr1 tr2. tr = tr1 @ [trn] @ tr2 ∧ φ trn ∧ f trn = v ∧ V tr1 = vl1 ∧ never φ tr2"
using assms filtermap_eq_RCons[of φ f] unfolding V_def by blast
lemma V_eq_Cons_RCons:
assumes "V tr = v # vl1 ## w"
shows "∃ trv trnv tr1 trnw trw.
tr = trv @ [trnv] @ tr1 @ [trnw] @ trw ∧
never φ trv ∧ φ trnv ∧ f trnv = v ∧ V tr1 = vl1 ∧ φ trnw ∧ f trnw = w ∧ never φ trw"
using assms filtermap_eq_Cons_RCons[of φ f] unfolding V_def by blast
lemma O_append: "O (tr @ tr1) = O tr @ O tr1"
unfolding O_def using filtermap_append by auto
lemma O_Nil_list_ex: "O tr = [] ⟷ ¬ list_ex γ tr"
unfolding O_def using filtermap_Nil_list_ex by auto
lemma O_Nil_never: "O tr = [] ⟷ never γ tr"
unfolding O_def using filtermap_Nil_never by auto
lemma Nil_O_never: "[] = O tr ⟷ never γ tr"
unfolding O_def filtermap_map_filter by (induction tr) auto
lemma length_O: "length (O tr) ≤ length tr"
by (auto simp: O_def length_filtermap)
lemma O_list_all: "O tr = map g tr ⟷ list_all γ tr"
by (auto simp: O_def length_filtermap)
lemma O_eq_Cons:
assumes "O tr = obs # obsl1"
shows "∃ trn tr2 tr1. tr = tr2 @ [trn] @ tr1 ∧ never γ tr2 ∧ γ trn ∧ g trn = obs ∧ O tr1 = obsl1"
using assms filtermap_eq_Cons unfolding O_def by auto
lemma O_eq_append:
assumes "O tr = obsl1 @ obsl2"
shows "∃ tr1 tr2. tr = tr1 @ tr2 ∧ O tr1 = obsl1 ∧ O tr2 = obsl2"
using assms filtermap_eq_append[of γ g] unfolding O_def by auto
lemma O_eq_RCons:
assumes "O tr = oul1 ## ou"
shows "∃ trn tr1 tr2. tr = tr1 @ [trn] @ tr2 ∧ γ trn ∧ g trn = ou ∧ O tr1 = oul1 ∧ never γ tr2"
using assms filtermap_eq_RCons[of γ g] unfolding O_def by blast
lemma O_eq_Cons_RCons:
assumes "O tr0 = ou # oul1 ## ouu"
shows "∃ tr trn tr1 trnn trr.
tr0 = tr @ [trn] @ tr1 @ [trnn] @ trr ∧
never γ tr ∧ γ trn ∧ g trn = ou ∧ O tr1 = oul1 ∧ γ trnn ∧ g trnn = ouu ∧ never γ trr"
using assms filtermap_eq_Cons_RCons[of γ g] unfolding O_def by blast
lemma O_eq_Cons_RCons_append:
assumes "O tr0 = ou # oul1 ## ouu @ oull"
shows "∃ tr trn tr1 trnn trr.
tr0 = tr @ [trn] @ tr1 @ [trnn] @ trr ∧
never γ tr ∧ γ trn ∧ g trn = ou ∧ O tr1 = oul1 ∧ γ trnn ∧ g trnn = ouu ∧ O trr = oull"
proof-
from O_eq_append[of tr0 "ou # oul1 ## ouu" oull] assms
obtain tr00 trrr where 1: "tr0 = tr00 @ trrr"
and 2: "O tr00 = ou # oul1 ## ouu" and 3: "O trrr = oull" by auto
from O_eq_Cons_RCons[OF 2] obtain tr trn tr1 trnn trr where
4:"tr00 = tr @ [trn] @ tr1 @ [trnn] @ trr ∧
never γ tr ∧
γ trn ∧ g trn = ou ∧ O tr1 = oul1 ∧ γ trnn ∧ g trnn = ouu ∧ never γ trr" by auto
show ?thesis apply(rule exI[of _ tr], rule exI[of _ trn], rule exI[of _ tr1],
rule exI[of _ trnn], rule exI[of _ "trr @ trrr"])
using 1 3 4 by (simp add: O_append O_Nil_never)
qed
lemma O_Nil_tr_Nil: "O tr ≠ [] ⟹ tr ≠ []"
by (induction tr) auto
lemma V_Cons_eq_append: "V (trn # tr) = V [trn] @ V tr"
by (cases "φ trn") auto
lemma set_V: "set (V tr) ⊆ {f trn | trn . trn ∈∈ tr ∧ φ trn}"
using set_filtermap unfolding V_def .
lemma set_O: "set (O tr) ⊆ {g trn | trn . trn ∈∈ tr ∧ γ trn}"
using set_filtermap unfolding O_def .
lemma list_ex_length_O:
assumes "list_ex γ tr" shows "length (O tr) > 0"
by (metis assms O_Nil_list_ex length_greater_0_conv)
lemma list_ex_iff_length_O:
"list_ex γ tr ⟷ length (O tr) > 0"
by (metis O_Nil_list_ex length_greater_0_conv)
lemma length1_O_list_ex_iff:
"length (O tr) > 1 ⟹ list_ex γ tr"
unfolding list_ex_iff_length_O by auto
lemma list_all_O_map: "list_all γ tr ⟹ O tr = map g tr"
using O_list_all by auto
lemma never_O_Nil: "never γ tr ⟹ O tr = []"
using O_Nil_never by auto
lemma list_all_V_map: "list_all φ tr ⟹ V tr = map f tr"
using V_list_all by auto
lemma never_V_Nil: "never φ tr ⟹ V tr = []"
using V_Nil_never by auto
inductive reachNT:: "'state ⇒ bool" where
Istate: "reachNT istate"
|
Step:
"⟦reachNT (srcOf trn); validTrans trn; ¬ T trn⟧
⟹ reachNT (tgtOf trn)"
lemma reachNT_reach: assumes "reachNT s" shows "reach s"
using assms apply induct by (auto intro: reach.intros)
lemma V_iff_non_φ[simp]: "V (trn # tr) = V tr ⟷ ¬ φ trn"
by (cases "φ trn") auto
lemma V_imp_φ: "V (trn # tr) = v # V tr ⟹ φ trn"
by (cases "φ trn") auto
lemma V_imp_Nil: "V (trn # tr) = [] ⟹ V tr = []"
by (cases "φ trn") auto
lemma V_iff_Nil[simp]: "V (trn # tr) = [] ⟷ ¬ φ trn ∧ V tr = []"
by (metis V_iff_non_φ V_imp_Nil)
end
end