fun run :: "('q,'a) DTS ==> 'q ==> 'a word ==> 'q word" where "run δ q0 w 0 = q0"
| "run δ q0 w (Suc i) = δ (run δ q0 w i) (w i)"
fun runt :: "('q,'a) DTS ==> 'q ==> 'a word ==> ('q * 'a * 'q) word" where "runt δ q0 w i = (run δ q0 w i, w i, run δ q0 w (Suc i))"
lemma run_foldl: "run Δ q0 w i = foldl Δ q0 (map w [0..<i])" by (induction i; simp)
lemma runt_foldl: "runt Δ q0 w i = (foldl Δ q0 (map w [0..<i]), w i, foldl Δ q0 (map w [0..<Suc i]))" unfolding runt.simps run_foldl ..
subsection‹Reachable States and Transitions›
definition reach :: "'a set ==> ('b, 'a) DTS ==> 'b ==> 'b set" where "reach Σ δ q0 = {run δ q0 w n | w n. range w ⊆ Σ}"
definition reacht :: "'a set ==> ('b, 'a) DTS ==> 'b ==> ('b, 'a) transition set" where "reacht Σ δ q0 = {runt δ q0 w n | w n. range w ⊆ Σ}"
lemma reach_foldl_def: assumes"Σ ≠ {}" shows"reach Σ δ q0 = {foldl δ q0 w | w. set w ⊆ Σ}" proof -
{ fix w assume"set w ⊆ Σ" moreover obtain a where"a ∈ Σ" using‹Σ ≠ {}›by blast ultimately have"foldl δ q0 w = foldl δ q0 (prefix (length w) (w ⌢ (iter [a])))" and"range (w ⌢ (iter [a])) ⊆ Σ" by (unfold prefix_conc_length, auto simp add: iter_def conc_def) hence"∃w' n. foldl δ q0 w = run δ q0 w' n ∧ range w' ⊆ Σ" unfolding run_foldl subsequence_def by blast
} thus ?thesis by (fastforce simp add: reach_def run_foldl) qed
lemma reacht_foldl_def: "reacht Σ δ q0 = {(foldl δ q0 w, ν, foldl δ q0 (w@[ν])) | w ν. set w ⊆ Σ ∧ ν ∈ Σ}" (is"?lhs = ?rhs") proof (cases "Σ ≠ {}") case True show ?thesis proof
{ fix w ν assume"set w ⊆ Σ""ν ∈ Σ" moreover obtain a where"a ∈ Σ" using‹Σ ≠ {}›by blast moreover have"w = map (λn. if n < length w then w ! n else if n - length w = 0 then [ν] ! (n - length w) else a) [0..<length w]" by (simp add: nth_equalityI) ultimately have"foldl δ q0 w = foldl δ q0 (prefix (length w) ((w @ [ν]) ⌢ (iter [a])))" and"foldl δ q0 (w @ [ν]) = foldl δ q0 (prefix (length (w @ [ν])) ((w @ [ν]) ⌢ (iter [a])))" and"range ((w @ [ν]) ⌢ (iter [a])) ⊆ Σ" by (simp_all only: prefix_conc_length conc_conc[symmetric] iter_def)
(auto simp add: subsequence_def conc_def upt_Suc_append[OF le0]) moreover have"((w @ [ν]) ⌢ (iter [a])) (length w) = ν" by (simp add: conc_def) ultimately have"∃w' n. (foldl δ q0 w, ν, foldl δ q0 (w @ [ν])) = runt δ q0 w' n ∧ range w' ⊆ Σ" by (metis runt_foldl length_append_singleton subsequence_def)
} thus"?lhs 🪙 ?rhs" unfolding reacht_def runt.simps by blast qed (unfold reacht_def runt_foldl, fastforce simp add: upt_Suc_append) qed (simp add: reacht_def)
lemma reach_card_0: assumes"Σ ≠ {}" shows"infinite (reach Σ δ q0) ⟷ card (reach Σ δ q0) = 0" proof - have"{run δ q0 w n | w n. range w ⊆ Σ} ≠ {}" using assms by fast thus ?thesis unfolding reach_def card_eq_0_iff by auto qed
lemma reacht_card_0: assumes"Σ ≠ {}" shows"infinite (reacht Σ δ q0) ⟷ card (reacht Σ δ q0) = 0" proof - have"{runt δ q0 w n | w n. range w ⊆ Σ} ≠ {}" using assms by fast thus ?thesis unfolding reacht_def card_eq_0_iff by blast qed
lemma QL_reach: assumes"finite (reach (set Σ) δ q0)" shows"QL Σ δ q0 = reach (set Σ) δ q0" proof (cases "Σ ≠ []") case True hence reach_redef: "reach (set Σ) δ q0 = {foldl δ q0 w | w. set w ⊆ set Σ}" using reach_foldl_def[of "set Σ"] unfolding set_empty[of Σ, symmetric] by force
{ fix x w y assume"set w ⊆ set Σ""x = foldl δ q0 w""y ∈ set (map (δ x) Σ)" moreover thenobtain ν where"y = δ x ν"and"ν ∈ set Σ" by auto ultimately have"y = foldl δ q0 (w@[ν])"and"set (w@[ν]) ⊆ set Σ" by simp+ hence"∃w'. set w' ⊆ set Σ ∧ y = foldl δ q0 w'" by blast
} note extend_run = this
fun product :: "('a ==> ('b, 'c) DTS) ==> ('a ⇀ 'b, 'c) DTS" (‹Δ\×›) where "Δ\<times> δm = (λq ν. (λx. case q x of None ==> None | Some y ==> Some (δm x y ν)))"
lemma product_run_None: fixes ιm δm w defines"ρ ≡ run (Δ\<times> δm) ιm w" assumes"ιm k = None" shows"ρ i k = None" by (induction i) (insert assms, auto)
lemma product_run_Some: fixes ιm δm w q0 k defines"ρ ≡ run (Δ\<times> δm) ιm w" defines"ρ' ≡ run (δm k) q0 w" assumes"ιm k = Some q0" shows"ρ i k = Some (ρ' i)" by (induction i) (insert assms, auto)
theorem finite_reach_product: assumes"finite (dom ιm)" assumes"∧x. x ∈ dom ιm==> finite (reach Σ (δm x) (the (ιm x)))" shows"finite (reach Σ (Δ\<times> δm) ιm)" using assms(1,2) proof (induction"dom ιm" arbitrary: ιm) case empty hence"ιm = Map.empty" by auto hence"∧w i. run (Δ\<times> δm) ιm w i = (λx. None)" using product_run_None by fast thus ?case unfolding reach_def by simp next case (insert k K)
define f where"f = (λ(q :: 'b, m :: 'a ⇀ 'b). m(k := Some q))"
define Reach where"Reach = (reach Σ (δm k) (the (ιm k))) × ((reach Σ (Δ\<times> δm) (ιm(k := None))))"
have"(reach Σ (Δ\<times> δm) ιm) ⊆ f ` Reach" proof fix x assume"x ∈ reach Σ (Δ\<times> δm) ιm" thenobtain w n where x_def: "x = run (Δ\<times> δm) ιm w n"and"range w ⊆ Σ" unfolding reach_def by blast
{ fix k' have"k' ∉ dom ιm==> x k' = run (Δ\<times> δm) (ιm(k := None)) w n k'" unfolding x_def dom_def using product_run_None[of _ _ δm] by simp moreover have"k' ∈ dom ιm - {k} ==> x k' = run (Δ\<times> δm) (ιm(k := None)) w n k'" unfolding x_def dom_def using product_run_Some[of _ _ _ δm] by auto ultimately have"k' ≠ k ==> x k' = run (Δ\<times> δm) (ιm(k := None)) w n k'" by blast
} hence"x(k := None) = run (Δ\<times> δm) (ιm(k := None)) w n" using product_run_None[of _ _ δm] by auto moreover have"x k = Some (run (δm k) (the (ιm k)) w n)" unfolding x_def using product_run_Some[of ιm k _ δm] insert.hyps(4) by force ultimately have"(the (x k), x(k := None)) ∈ Reach" unfolding Reach_def reach_def using‹range w ⊆ Σ›by auto moreover have"x = f (the (x k), x(k := None))" unfolding f_def using‹x k = Some (run (δm k) (the (ιm k)) w n)›by auto ultimately show"x ∈ f ` Reach" by simp qed moreover have"finite (reach Σ (Δ\<times> δm) (ιm (k := None)))" using insert insert(3)[of "ιm (k:=None)"] by auto hence"finite Reach" using insert Reach_def by blast hence"finite (f ` Reach)"
.. ultimately show ?case by (rule finite_subset) qed
subsection‹Simple Product Construction Helper Functions and Lemmas›
fun embed_transition_fst :: "('a, 'c) transition ==> ('a × 'b, 'c) transition set" where "embed_transition_fst (q, ν, q') = {((q, x), ν, (q', y)) | x y. True}"
fun embed_transition_snd :: "('b, 'c) transition ==> ('a × 'b, 'c) transition set" where "embed_transition_snd (q, ν, q') = {((x, q), ν, (y, q')) | x y. True}"
lemma embed_transition_snd_unfold: "embed_transition_snd t = {((x, fst t), fst (snd t), (y, snd (snd t))) | x y. True}" unfolding embed_transition_snd.simps[symmetric] by simp
lemma fixes δ1 δ2 w q1 q2 defines"ρ ≡ runt (δ1× δ2) (q1, q2) w" defines"ρ1≡ runt δ1 q1 w" defines"ρ2≡ runt δ2 q2 w" shows product_run_project_fst: "project_transition_fst (ρ i) = ρ1 i" and product_run_project_snd: "project_transition_snd (ρ i) = ρ2 i" and product_run_embed_fst: "ρ i ∈ embed_transition_fst (ρ1 i)" and product_run_embed_snd: "ρ i ∈ embed_transition_snd (ρ2 i)" unfolding assms runt.simps simple_product_run by simp_all
lemma fixes δ1 δ2 w q1 q2 defines"ρ ≡ runt (δ1× δ2) (q1, q2) w" defines"ρ1≡ runt δ1 q1 w" defines"ρ2≡ runt δ2 q2 w" assumes"finite (range ρ)" shows product_run_finite_fst: "finite (range ρ1)" and product_run_finite_snd: "finite (range ρ2)" proof - have"∧k. project_transition_fst (ρ k) = ρ1 k" and"∧k. project_transition_snd (ρ k) = ρ2 k" unfolding assms product_run_project_fst product_run_project_snd by simp+ hence"project_transition_fst ` range ρ = range ρ1" and"project_transition_snd ` range ρ = range ρ2" using range_composition[symmetric, of project_transition_fst ρ] using range_composition[symmetric, of project_transition_snd ρ] by presburger+ thus"finite (range ρ1)"and"finite (range ρ2)" using assms finite_imageI by metis+ qed
lemma fixes δ1 δ2 w q1 q2 defines"ρ ≡ runt (δ1× δ2) (q1, q2) w" defines"ρ1≡ runt δ1 q1 w" assumes"finite (range ρ)" shows product_run_project_limit_fst: "project_transition_fst ` limit ρ = limit ρ1" and product_run_embed_limit_fst: "limit ρ ⊆∪ (embed_transition_fst ` (limit ρ1))" proof - have"finite (range ρ1)" using assms product_run_finite_fst by metis
thenobtain i where"limit ρ = range (suffix i ρ)"and"limit ρ1 = range (suffix i ρ1)" using common_range_limit assms by metis moreover have"∧k. project_transition_fst (suffix i ρ k) = (suffix i ρ1 k)" by (simp only: assms runt.simps) (metis ρ1_def product_run_project_fst suffix_nth) hence"project_transition_fst ` range (suffix i ρ) = (range (suffix i ρ1))" using range_composition[symmetric, of "project_transition_fst""suffix i ρ"] by presburger moreover have"∧k. (suffix i ρ k) ∈ embed_transition_fst (suffix i ρ1 k)" using assms product_run_embed_fst by simp ultimately show"project_transition_fst ` limit ρ = limit ρ1" and"limit ρ ⊆∪ (embed_transition_fst ` (limit ρ1))" by auto qed
lemma fixes δ1 δ2 w q1 q2 defines"ρ ≡ runt (δ1× δ2) (q1, q2) w" defines"ρ2≡ runt δ2 q2 w" assumes"finite (range ρ)" shows product_run_project_limit_snd: "project_transition_snd ` limit ρ = limit ρ2" and product_run_embed_limit_snd: "limit ρ ⊆∪ (embed_transition_snd ` (limit ρ2))" proof - have"finite (range ρ2)" using assms product_run_finite_snd by metis
thenobtain i where"limit ρ = range (suffix i ρ)"and"limit ρ2 = range (suffix i ρ2)" using common_range_limit assms by metis moreover have"∧k. project_transition_snd (suffix i ρ k) = (suffix i ρ2 k)" by (simp only: assms runt.simps) (metis ρ2_def product_run_project_snd suffix_nth) hence"project_transition_snd ` range ((suffix i ρ)) = (range (suffix i ρ2))" using range_composition[symmetric, of "project_transition_snd""(suffix i ρ)"] by presburger moreover have"∧k. (suffix i ρ k) ∈ embed_transition_snd (suffix i ρ2 k)" using assms product_run_embed_snd by simp ultimately show"project_transition_snd ` limit ρ = limit ρ2" and"limit ρ ⊆∪ (embed_transition_snd ` (limit ρ2))" by auto qed
lemma fixes δ1 δ2 w q1 q2 defines"ρ ≡ runt (δ1× δ2) (q1, q2) w" defines"ρ1≡ runt δ1 q1 w" defines"ρ2≡ runt δ2 q2 w" assumes"finite (range ρ)" shows product_run_embed_limit_finiteness_fst: "limit ρ ∩ (∪ (embed_transition_fst ` S)) = {} ⟷ limit ρ1∩ S = {}" (is"?thesis1") and product_run_embed_limit_finiteness_snd: "limit ρ ∩ (∪ (embed_transition_snd ` S')) = {} ⟷ limit ρ2∩ S' = {}" (is"?thesis2") proof - show ?thesis1 using assms product_run_project_limit_fst by fastforce show ?thesis2 using assms product_run_project_limit_snd by fastforce qed
subsection‹Product Construction Helper Functions and Lemmas›
fun embed_transition :: "'a ==> ('b, 'c) transition ==> ('a ⇀ 'b, 'c) transition set" (‹↿_›) where "↿x (q, ν, q') = {(m, ν, m') | m m'. m x = Some q ∧ m' x = Some q'}"
fun project_transition :: "'a ==> ('a ⇀ 'b, 'c) transition ==> ('b, 'c) transition" (‹⇃_›) where "⇃x (m, ν, m') = (the (m x), ν, the (m' x))"
fun embed_pair :: "'a ==> (('b, 'c) transition set × ('b, 'c) transition set) ==> (('a ⇀ 'b, 'c) transition set × ('a ⇀ 'b, 'c) transition set)" (‹\↿_›) where "\<upharpoonleft>x (S, S') = (∪(↿x ` S), ∪(↿x ` S'))"
fun project_pair :: "'a ==> (('a ⇀ 'b, 'c) transition set × ('a ⇀ 'b, 'c) transition set) ==> (('b, 'c) transition set × ('b, 'c) transition set)" (‹\⇃_›) where "\<downharpoonleft>x (S, S') = (⇃x ` S, ⇃x ` S')"
lemma embed_transition_unfold: "embed_transition x t = {(m, fst (snd t), m') | m m'. m x = Some (fst t) ∧ m' x = Some (snd (snd t))}" unfolding embed_transition.simps[symmetric] by simp
lemma fixes ιm δm w q0 fixes x :: "'a" defines"ρ ≡ runt (Δ\<times> δm) ιm w" defines"ρ' ≡ runt (δm x) q0 w" assumes"ιm x = Some q0" shows product_run_project: "⇃x (ρ i) = ρ' i" and product_run_embed: "ρ i ∈↿x (ρ' i)" using assms product_run_Some[of _ _ _ δm] by simp+
lemma fixes ιm δm w q0 x defines"ρ ≡ runt (Δ\<times> δm) ιm w" defines"ρ' ≡ runt (δm x) q0 w" assumes"ιm x = Some q0" assumes"finite (range ρ)" shows product_run_project_limit: "⇃x ` limit ρ = limit ρ'" and product_run_embed_limit: "limit ρ ⊆∪ (↿x ` (limit ρ'))" proof - have"∧k. ⇃x (ρ k) = ρ' k" using assms product_run_embed[of _ _ _ δm] by simp hence"⇃x ` range ρ = range ρ'" using range_composition[symmetric, of "⇃x" ρ] by presburger hence"finite (range ρ')" using assms finite_imageI by metis
thenobtain i where"limit ρ = range (suffix i ρ)"and"limit ρ' = range (suffix i ρ')" using common_range_limit assms by metis moreover have"∧k. ⇃x (suffix i ρ k) = (suffix i ρ' k)" using assms product_run_embed[of _ _ _ δm] by simp hence"⇃x ` range ((suffix i ρ)) = (range (suffix i ρ'))" using range_composition[symmetric, of "⇃x""(suffix i ρ)"] by presburger moreover have"∧k. (suffix i ρ k) ∈↿x (suffix i ρ' k)" using assms product_run_embed[of _ _ _ δm] by simp ultimately show"⇃x ` limit ρ = limit ρ'"and"limit ρ ⊆∪ (↿x ` (limit ρ'))" by auto qed
lemma product_run_embed_limit_finiteness: fixes ιm δm w q0 k defines"ρ ≡ runt (Δ\<times> δm) ιm w" defines"ρ' ≡ runt (δm k) q0 w" assumes"ιm k = Some q0" assumes"finite (range ρ)" shows"limit ρ ∩ (∪ (↿k ` S)) = {} ⟷ limit ρ' ∩ S = {}"
(is"?lhs ⟷ ?rhs") proof - have"⇃k ` limit ρ ∩ S ≠ {} ⟶ limit ρ ∩ (∪ (↿k ` S)) ≠ {}" proof assume"⇃k ` limit ρ ∩ S ≠ {}" thenobtain q ν q' where"(q, ν, q') ∈⇃k ` limit ρ"and"(q, ν, q') ∈ S" by auto moreover have"∧m ν m' i. (m, ν, m') = ρ i ==>∃p p'. m k = Some p ∧ m' k = Some p'" using assms product_run_Some[of ιm , OF assms(3)] by auto hence"∧m ν m'. (m, ν, m') ∈ limit ρ ==>∃p p'. m k = Some p ∧ m' k = Some p'" using limit_in_range by fast ultimately obtain m m' where"m k = Some q"and"m' k = Some q'"and"(m, ν, m') ∈ limit ρ" by auto moreover hence"(m, ν, m') ∈∪ (↿k ` S)" using‹(q, ν, q') ∈ S›by force ultimately show"limit ρ ∩ (∪ (↿k ` S)) ≠ {}" by blast qed hence"?lhs ⟷⇃k ` limit ρ ∩ S = {}" by auto also have"…⟷ ?rhs" using assms product_run_project_limit[of _ _ _ δm] by simp finally show ?thesis by simp qed
subsection‹Transfer Rules›
contextincludes lifting_syntax begin
lemma product_parametric [transfer_rule]: "((A ===> B ===> C ===> B) ===> (A ===> rel_option B) ===> C ===> A ===> rel_option B) product product" by (auto simp add: rel_fun_def rel_option_iff split: option.split)
lemma run_parametric [transfer_rule]: "((A ===> B ===> A) ===> A ===> ((=) ===> B) ===> (=) ===> A) run run" proof -
{ fix δ δ' q q' n w fix w' :: "nat ==> 'd" assume"(A ===> B ===> A) δ δ'""A q q'""((=) ===> B) w w'" hence"A (run δ q w n) (run δ' q' w' n)" by (induction n) (simp_all add: rel_fun_def)
} thus ?thesis by blast qed
lemma reach_parametric [transfer_rule]: assumes"bi_total B" assumes"bi_unique B" shows"(rel_set B ===> (A ===> B ===> A) ===> A ===> rel_set A) reach reach" proof standard+ fix Σ Σ' δ δ' q q' assume"rel_set B Σ Σ'""(A ===> B ===> A) δ δ'""A q q'"
{ fix z assume"z ∈ reach Σ δ q" thenobtain w n where"z = run δ q w n"and"range w ⊆ Σ" unfolding reach_def by auto
define w' where"w' n = (SOME x. B (w n) x)"for n
have"∧n. w n ∈ Σ" using‹range w ⊆ Σ›by blast hence"∧n. w' n ∈ Σ'" using assms ‹rel_set B Σ Σ'›by (simp add: w'_def bi_unique_def rel_set_def; metis someI) hence"run δ' q' w' n ∈ reach Σ' δ' q'" unfolding reach_def by auto
moreover
have"A z (run δ' q' w' n)" apply (unfold ‹z = run δ q w n›) apply (insert ‹A q q'›‹(A ===> B ===> A) δ δ'› assms(1)) apply (induction n) apply (simp_all add: rel_fun_def bi_total_def w'_def) by (metis tfl_some)
ultimately
have"∃z' ∈ reach Σ' δ' q'. A z z'" by blast
}
moreover
{ fix z assume"z ∈ reach Σ' δ' q'" thenobtain w n where"z = run δ' q' w n"and"range w ⊆ Σ'" unfolding reach_def by auto
define w' where"w' n = (SOME x. B x (w n))"for n
have"∧n. w n ∈ Σ'" using‹range w ⊆ Σ'›by blast hence"∧n. w' n ∈ Σ" using assms ‹rel_set B Σ Σ'›by (simp add: w'_def bi_unique_def rel_set_def; metis someI) hence"run δ q w' n ∈ reach Σ δ q" unfolding reach_def by auto
moreover
have"A (run δ q w' n) z" apply (unfold ‹z = run δ' q' w n›) apply (insert ‹A q q'›‹(A ===> B ===> A) δ δ'› assms(1)) apply (induction n) apply (simp_all add: rel_fun_def bi_total_def w'_def) by (metis tfl_some)
ultimately
have"∃z' ∈ reach Σ δ q. A z' z" by blast
} ultimately show"rel_set A (reach Σ δ q) (reach Σ' δ' q')" unfolding rel_set_def by blast qed
lemma product_abs_run_None: "Mapping.lookup ιm k = None ==> Mapping.lookup (run (↑Δ\<times> δm) ιm w i) k = None" by (transfer; insert product_run_None)
lemma product_abs_run_Some: "Mapping.lookup ιm k = Some q0==> Mapping.lookup (run (↑Δ\<times> δm) ιm w i) k = Some (run (δm k) q0 w i)" by (transfer; insert product_run_Some)
theorem finite_reach_product_abs: assumes"finite (Mapping.keys ιm)" assumes"∧x. x ∈ (Mapping.keys ιm) ==> finite (reach Σ (δm x) (the (Mapping.lookup ιm x)))" shows"finite (reach Σ (↑Δ\<times> δm) ιm)" using assms by (transfer; blast intro: finite_reach_product)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.