definition merge :: "nat ==> (nat × nat) set" where "merge i = {(x, y) | x y n j. j < i ∧ (token_run x n ≠ token_run y n ∧ rank y n ≠ None ∨ y = Suc n) ∧ token_run x (Suc n) = token_run y (Suc n) ∧ token_run x (Suc n) ∉ F ∧ rank x n = Some j}"
definition succeed :: "nat ==> nat set" where "succeed i = {x. ∃n. rank x n = Some i ∧ token_run x n ∉ F - {q0} ∧ token_run x (Suc n) ∈ F}"
definition smallest_accepting_rank :: "nat option" where "smallest_accepting_rank ≡ (if accept then Some (LEAST i. finite fail ∧ finite (merge i) ∧ infinite (succeed i)) else None)"
definition fail_t :: "nat set" where "fail_t = {n. ∃q q'. state_rank q n ≠ None ∧ q' = δ q (w n) ∧ q' ∉ F ∧ sink q'}"
definition merge_t :: "nat ==> nat set" where "merge_t i = {n. ∃q q' j. state_rank q n = Some j ∧ j < i ∧ q' = δ q (w n) ∧ q' ∉F ∧ ((∃q''. q'' ≠ q ∧ q' = δ q'' (w n) ∧ state_rank q'' n ≠ None) ∨ q' = q0)}"
definition succeed_t :: "nat ==> nat set" where "succeed_t i = {n. ∃q. state_rank q n = Some i ∧ q ∉ F - {q0} ∧ δ q (w n) ∈ F}"
fun"S" where "S n = F ∪ {q. (∃j ≥ the smallest_accepting_rank. state_rank q n = Some j)}"
end
locale mojmir = semi_mojmir + mojmir_def + assumes ―‹All states reachable from final states are also final›
wellformed_F: "∧q ν. q ∈ F ==> δ q ν ∈ F" begin
lemma token_stays_in_final_states: "token_run x n ∈ F ==> token_run x (n + m) ∈ F" proof (induction m) case (Suc m) thus ?case proof (cases "n + m < x") case False hence"n + m ≥ x" by arith thenobtain j where"n + m = x + j" using le_Suc_ex by blast hence"δ (token_run x (n + m)) (suffix x w j) = token_run x (n + (Suc m))" unfolding suffix_def by fastforce thus ?thesis using wellformed_F Suc suffix_nth by (metis (no_types, opaque_lifting)) qed fastforce qed simp
lemma token_run_enter_final_states: assumes"token_run x n ∈ F" shows"∃m ≥ x. token_run x m ∉ F - {q0} ∧ token_run x (Suc m) ∈ F" proof (cases "x ≤ n") case True thenobtain n' where"token_run x (x + n') ∈ F" using assms by force hence"∃m. token_run x (x + m) ∉ F - {q0} ∧ token_run x (x + Suc m) ∈ F" by (induction n') ((metis (erased, opaque_lifting) token_stays_in_final_states token_run_intial_state Diff_iff Nat.add_0_right Suc_eq_plus1 insertCI ), blast) thus ?thesis by (metis add_Suc_right le_add1) next case False hence"token_run x x ∉ F - {q0}"and"token_run x (Suc x) ∈ F" using assms wellformed_F by simp_all thus ?thesis by blast qed
subsection‹Token Properties›
subsubsection‹Alternative Definitions›
lemma token_succeeds_alt_def: "token_succeeds x = (∀\<infinity>n. token_run x n ∈ F)" unfolding token_succeeds_def MOST_nat_le le_iff_add using token_stays_in_final_states by blast
lemma token_fails_alt_def: "token_fails x = (∀\<infinity>n. sink (token_run x n) ∧ token_run x n ∉ F)"
(is"?lhs = ?rhs") proof assume ?lhs thenobtain n where"sink (token_run x n)"and"token_run x n ∉ F" using token_fails_def by blast hence"∀m ≥ n. sink (token_run x m)"and"∀m ≥ n. token_run x m ∉ F" using token_stays_in_sink unfolding le_iff_add by auto thus ?rhs unfolding MOST_nat_le by blast qed (unfold MOST_nat_le token_fails_def, blast)
lemma token_fails_alt_def_2: "token_fails x ⟷¬token_succeeds x ∧¬token_squats x" by (metis add.commute token_fails_def token_squats_def token_stays_in_final_states token_stays_in_sink token_succeeds_def)
subsubsection‹Properties›
lemma token_succeeds_run_merge: "x ≤ n ==> y ≤ n ==> token_run x n = token_run y n ==> token_succeeds x ==> token_succeeds y" using token_run_merge token_stays_in_final_states add.commute unfolding token_succeeds_def by metis
lemma token_squats_run_merge: "x ≤ n ==> y ≤ n ==> token_run x n = token_run y n ==> token_squats x ==> token_squats y" using token_run_merge token_stays_in_sink add.commute unfolding token_squats_def by metis
subsubsection‹Pulled-Up Lemmas›
lemma configuration_token_succeeds: "[x ∈ configuration q n; y ∈ configuration q n]==> token_succeeds x = token_succeeds y" using token_succeeds_run_merge push_down_configuration_token_run by meson
lemma configuration_token_squats: "[x ∈ configuration q n; y ∈ configuration q n]==> token_squats x = token_squats y" using token_squats_run_merge push_down_configuration_token_run by meson
lemma mojmir_accept_alt_def: "accept ⟷ finite {x. ¬token_succeeds x}" using Inf_many_def Mojmir_reject by blast
lemma mojmir_accept_initial: "q0∈ F ==> accept" unfolding accept_def MOST_nat_le token_succeeds_def using token_run_intial_state by metis
subsection‹Equivalent Acceptance Conditions›
subsubsection‹Token-Based Definitions›
lemma merge_token_succeeds: assumes"(x, y) ∈ merge i" shows"token_succeeds x ⟷ token_succeeds y" proof - obtain n j j' where"token_run x (Suc n) = token_run y (Suc n)" and"rank x n = Some j"and"rank y n = Some j' ∨ y = Suc n" using assms unfolding merge_def by blast hence"x ≤ Suc n"and"y ≤ Suc n" using rank_Some_time le_Suc_eq by blast+ thenobtain q where"x ∈ configuration q (Suc n)"and"y ∈ configuration q (Suc n)" using‹token_run x (Suc n) = token_run y (Suc n)› pull_up_token_run_tokens by blast thus ?thesis using configuration_token_succeeds by blast qed
lemma merge_subset: "i ≤ j ==> merge i ⊆ merge j" proof assume"i ≤ j" fix p assume"p ∈ merge i" thenobtain x y n k where"p = (x, y)"and"k < i"and"token_run x n ≠ token_run y n ∧ rank y n ≠ None ∨ y = Suc n" and"token_run x (Suc n) = token_run y (Suc n)"and"token_run x (Suc n) ∉ F"and"rank x n = Some k" unfolding merge_def by blast moreover hence"k < j" using‹i ≤ j›by simp ultimately have"(x, y) ∈ merge j" unfolding merge_def by blast thus"p ∈ merge j" using‹p = (x, y)›by simp qed
lemma merge_finite: "i ≤ j ==> finite (merge j) ==> finite (merge i)" using merge_subset by (blast intro: rev_finite_subset)
lemma merge_finite': "i < j ==> finite (merge j) ==> finite (merge i)" using merge_finite[of i j] by force
lemma succeed_membership: "token_succeeds x ⟷ (∃i. x ∈ succeed i)"
(is"?lhs ⟷ ?rhs") proof assume ?lhs thenobtain m where"token_run x m ∈ F" unfolding token_succeeds_alt_def MOST_nat_le by blast thenobtain n where1: "token_run x n ∉ F - {q0}" and2: "token_run x (Suc n) ∈ F"and"x ≤ n" using token_run_enter_final_states by blast moreover hence"¬sink (token_run x n)" proof (cases "token_run x n ≠ q0") case True hence"token_run x n ∉ F" using‹token_run x n ∉ F - {q0}›by blast thus ?thesis using‹token_run x (Suc n) ∈ F› token_stays_in_sink unfolding Suc_eq_plus1 by metis qed (simp add: sink_def) thenobtain i where"rank x n = Some i" using‹x ≤ n›by fastforce ultimately show ?rhs unfolding succeed_def by blast qed (unfold token_succeeds_def succeed_def, blast)
lemma stable_rank_succeed: assumes"infinite (succeed i)" and"x ∈ succeed i" and"q0∉ F" shows"¬stable_rank x i" proof assume"stable_rank x i" thenobtain n where"∀n' ≥ n. rank x n' = Some i" unfolding stable_rank_def MOST_nat_le by rule
from assms(2) obtain m where"token_run x m ∉ F" and"token_run x (Suc m) ∈ F" and"rank x m = Some i" using assms(3) unfolding succeed_def by force
obtain y where"y > max n m"and"y ∈ succeed i" using assms(1) unfolding infinite_nat_iff_unbounded by blast
thenobtain m' where"token_run y m' ∉ F" and"token_run y (Suc m') ∈ F" and"rank y m' = Some i" using assms(3) unfolding succeed_def by force
moreover
―‹token has still rank i at m'› have"m' ≥ n" using rank_Some_time[OF ‹rank y m' = Some i›] ‹y > max n m›by force hence"rank x m' = Some i" using‹∀n' ≥ n. rank x n' = Some i›by blast
moreover
―‹but x and y are not in the same state› have"m' ≥ Suc m" using rank_Some_time[OF ‹rank y m' = Some i›] ‹y > max n m›by force hence"token_run x m' ∈ F" using token_stays_in_final_states[OF ‹token_run x (Suc m) ∈ F›] unfolding le_iff_add by fast with‹token_run y m' ∉ F ›have"token_run y m' ≠ token_run x m'" by metis
ultimately
show"False" using push_down_rank_tokens by force qed
lemma stable_rank_bounded: assumes stable: "stable_rank x j" assumes inf: "infinite (succeed i)" assumes"q0∉ F" shows"j < i" proof - from stable obtain m where"∀m' ≥ m. rank x m' = Some j" unfolding stable_rank_def MOST_nat_le by rule from inf obtain y where"y ≥ m"and"y ∈ succeed i" unfolding infinite_nat_iff_unbounded_le by meson thenobtain n where"rank y n = Some i" unfolding succeed_def MOST_nat_le by blast
moreover
hence"n ≥ y" by (rule rank_Some_time) hence"rank x n = Some j" using‹∀m' ≥ m. rank x m' = Some j›‹y ≥ m›by fastforce
ultimately
―‹In the case @{term "i ≤ j"}, the token y has also to stabilise with @{term i} at @{term n}.› have"i ≤ j ==> stable_rank y i" using stable by (blast intro: stable_rank_tower) thus"j < i" using stable_rank_succeed[OF inf ‹y ∈ succeed i›‹q0∉ F›] by linarith qed
from assms have"infinite {t. token_succeeds t}" unfolding mojmir_accept_alt_def by force
moreover
have"{x. token_succeeds x} = ∪{succeed i | i. i < max_rank}"
(is"?lhs = ?rhs") proof - have"?lhs = ∪{succeed i | i. True}" using succeed_membership by blast also have"… = ?rhs" proof show"…⊆ ?rhs" proof fix x assume"x ∈∪{succeed i |i. True}" thenobtain i where"x ∈ succeed i" by blast moreover ―‹Obtain upper bound for succeed ranks› have"∧u. u ≥ max_rank ==> succeed u = {}" unfolding succeed_def using rank_upper_bound by fastforce ultimately show"x ∈∪{succeed i |i. i < max_rank}" by (cases "i < max_rank") (blast, simp) qed qed blast finally show ?thesis . qed
ultimately
have"∃j. infinite (succeed j)" by force hence"infinite (succeed i)"and"∧j. j < i ==> finite (succeed j)" unfolding i_def by (metis LeastI_ex, metis not_less_Least) hence fin_succeed_ranks: "finite (∪{succeed j | j. j < i})" by auto
―‹@{term i} is bounded by @{term max_rank}›
{ obtain x where"x ∈ succeed i" using‹infinite (succeed i)›by fastforce thenobtain n where"rank x n = Some i" unfolding succeed_def by blast thus"i < max_rank" by (rule rank_upper_bound)
}
define S where"S = {(x, y). token_succeeds x ∧ token_succeeds y}"
have"finite (merge i ∩ S)" proof (rule finite_product)
{ fix x y assume"(x, y) ∈ (merge i ∩ S)"
thenobtain n k k'' where"k < i" and"rank x n = Some k" and"rank y n = Some k'' ∨ y = Suc n" and"token_run x (Suc n) ∉ F" and"token_run x (Suc n) = token_run y (Suc n)" and"token_succeeds x" unfolding merge_def S_def by fast
thenobtain m where"token_run x (Suc n + m) ∉ F" and"token_run x (Suc (Suc n + m)) ∈ F" by (metis Suc_eq_plus1 add.commute token_run_P[of "λq. q ∈ F"] token_stays_in_final_states token_succeeds_def)
moreover
have"x ≤ Suc n"and"y ≤ Suc n"and"x ≤ Suc n + m"and"y ≤ Suc n + m" using rank_Some_time ‹rank x n = Some k›‹rank y n = Some k'' ∨ y = Suc n›by fastforce+
hence"token_run y (Suc n + m) ∉ F"and"token_run y (Suc (Suc n + m)) ∈ F" using‹token_run x (Suc n + m) ∉ F›‹token_run x (Suc (Suc n + m)) ∈ F›‹token_run x (Suc n) = token_run y (Suc n)› using token_run_merge token_run_merge_Suc by metis+
moreover
have"¬sink (token_run x (Suc n + m))" using‹token_run x (Suc n + m) ∉ F›‹token_run x (Suc(Suc n + m)) ∈ F› using token_is_not_in_sink by blast
―‹Obtain rank used to enter final› obtain k' where"rank x (Suc n + m) = Some k'" using‹¬sink (token_run x (Suc n + m))›‹x ≤ Suc n + m›by fastforce
moreover
hence"rank y (Suc n + m) = Some k'" by (metis ‹x ≤ Suc n + m›‹y ≤ Suc n + m› token_run_merge ‹x ≤ Suc n›‹y ≤ Suc n› ‹token_run x (Suc n) = token_run y (Suc n)› pull_up_token_run_tokens
pull_up_configuration_rank[of x _ "Suc n + m" y])
moreover
―‹Rank used to enter final states is strictly bounded by i› have"k' < i" using‹rank x (Suc n + m) = Some k'› rank_monotonic[OF ‹rank x n = Some k›] ‹k < i› unfolding add_Suc_shift by fastforce
ultimately
have"x ∈∪{succeed j | j. j < i}"and"y ∈∪{succeed j | j. j < i}" unfolding succeed_def by blast+
} hence"fst ` (merge i ∩ S) ⊆∪{succeed j | j. j < i}"and"snd ` (merge i ∩ S) ⊆∪{succeed j | j. j < i}" by force+ thus"finite (fst ` (merge i ∩ S))"and"finite (snd ` (merge i ∩ S))" using finite_subset[OF _ fin_succeed_ranks] by meson+ qed
moreover
have"finite (merge i ∩ (UNIV - S))" proof - obtain l where l_def: "∀x ≥ l. token_succeeds x" using assms unfolding accept_def MOST_nat_le by blast
{ fix x y assume"(x, y) ∈ merge i ∩ (UNIV - S)" hence"¬token_succeeds x ∨¬token_succeeds y" unfolding S_def by simp hence"¬token_succeeds x ∧¬token_succeeds y" using merge_token_succeeds ‹(x, y) ∈ merge i ∩ (UNIV - S)›by blast hence"x < l"and"y < l" by (metis l_def le_eq_less_or_eq linear)+
} hence"merge i ∩ (UNIV - S) ⊆ {0..l} × {0..l}" by fastforce thus ?thesis using finite_subset by blast qed
ultimately
have"finite (merge i)" by (metis Int_Diff Un_Diff_Int finite_UnI inf_top_right) moreover have"finite fail" by (metis assms mojmir_accept_alt_def fail_def token_fails_alt_def_2 infinite_nat_iff_unbounded_le mem_Collect_eq) ultimately show"finite fail ∧ finite (merge i) ∧ infinite (succeed i) ∧ (∀j < i. finite (succeed j))" using‹infinite (succeed i)›‹∧j. j < i ==> finite (succeed j)›by blast qed
lemma mojmir_accept_token_set_def2: assumes"finite fail" and"finite (merge i)" and"infinite (succeed i)" shows"accept" proof (rule ccontr, cases "q0∉ F") case True assume"¬ accept" moreover have"finite {x. ¬token_succeeds x ∧¬token_squats x}" using‹finite fail›unfolding fail_def token_fails_alt_def_2[symmetric] . moreover have X: "{x. ¬ token_succeeds x} = {x. ¬ token_succeeds x ∧ token_squats x} ∪ {x. ¬ token_succeeds x ∧¬ token_squats x}" by blast ultimately have inf: "infinite {x. ¬token_succeeds x ∧ token_squats x}" unfolding mojmir_accept_alt_def X by blast
―‹Obtain j, where j is the rank used by infinitely many configuration stabilising and not succeeding› have"{x. ¬token_succeeds x ∧ token_squats x} = {x. ∃j < i. ¬token_succeeds x ∧ token_squats x ∧ stable_rank x j}" using stable_rank_bounded ‹infinite (succeed i)›‹q0∉ F› unfolding stable_rank_equiv_token_squats by metis also have"… = ∪{{x. ¬token_succeeds x ∧ token_squats x ∧ stable_rank x j} | j. j < i}" by blast finally obtain j where"j < i"and"infinite {t. ¬token_succeeds t ∧ token_squats t ∧ stable_rank t j}"
(is"infinite ?S") using inf by force
―‹Obtain such a token x› thenobtain x where"¬token_succeeds x"and"token_squats x"and"stable_rank x j" unfolding infinite_nat_iff_unbounded_le by blast thenobtain n where"∀m ≥ n. rank x m = Some j" unfolding stable_rank_def MOST_nat_le by blast
―‹All configuration with same stable rank are bought at some n with rank smaller i› have"{(x, y) | y. y > n ∧ stable_rank y j} ⊆ merge i"
(is"?lhs ⊆ ?rhs") proof fix p assume"p ∈ ?lhs" thenobtain y where"p = (x, y)"and"y > n"and"stable_rank y j" by blast hence"x < y"and"x ≠ y" using rank_Some_time ‹∀n'≥n. rank x n' = Some j›by fastforce+
moreover
―‹Obtain a time n'' where x and y have the same rank› obtain n'' where"rank x n'' = Some j"and"rank y n'' = Some j" using‹∀n'≥n. rank x n' = Some j›‹stable_rank y j› unfolding stable_rank_def MOST_nat_le by (metis add.commute le_add2) hence"token_run x n'' = token_run y n''"and"y ≤ n''" using push_down_rank_tokens rank_Some_time[OF ‹rank y n'' = Some j›] by simp_all
―‹Obtain the time n' where x merges y and proof all necessary properties› thenobtain n' where"token_run x n' ≠ token_run y n' ∨ y = Suc n'" and"token_run x (Suc n') = token_run y (Suc n')"and"y ≤ Suc n'" using token_run_mergepoint[OF ‹x < y›] le_add_diff_inverse by metis
moreover
hence"(∃j'. rank y n' = Some j') ∨ y = Suc n'" using‹stable_rank y j› stable_rank_equiv_token_squats rank_token_squats unfolding le_Suc_eq by blast
moreover
have"rank x n' = Some j" using‹∀n'≥n. rank x n' = Some j›‹y ≤ Suc n'›‹y > n›by fastforce
moreover
have"token_run x (Suc n') ∉ F" using‹¬ token_succeeds x› token_succeeds_def by blast
―‹However, x merges infinitely many configuration› hence"infinite {(x, y) | y. y > n ∧ stable_rank y j}"
(is"infinite ?S'") proof -
{
{ fix y assume"stable_rank y j"and"y > n" thenobtain n' where"rank y n' = Some j" unfolding stable_rank_def MOST_nat_le by blast moreover hence"y ≤ n'" by (rule rank_Some_time) hence"n' > n" using‹y > n›by arith hence"rank x n' = Some j" using‹∀n' ≥ n. rank x n' = Some j›by simp ultimately have"¬token_succeeds y" by (metis ‹¬token_succeeds x› configuration_token_succeeds push_down_rank_tokens)
} hence"{y | y. y > n ∧ stable_rank y j} = {y | y. token_squats y ∧¬token_succeeds y ∧ stable_rank y j ∧ y > n}"
(is"_ = ?S''") using stable_rank_equiv_token_squats by blast moreover have"finite {y | y. token_squats y ∧¬token_succeeds y ∧ stable_rank y j ∧ y ≤n}"
(is"finite ?S'''") by simp moreover have"?S = ?S'' ∪ ?S'''" by auto ultimately have"infinite {y | y. y > n ∧ stable_rank y j}" using‹infinite ?S›by simp
} moreover have"{x} × {y. y > n ∧ stable_rank y j} = ?S'" by auto ultimately show ?thesis by (metis empty_iff finite_cartesian_productD2 singletonI) qed
ultimately
have"infinite (merge i)" by (rule infinite_super) with‹finite (merge i)›show"False" by blast qed (blast intro: mojmir_accept_initial)
lemma finite_monotonic_image: fixes A B :: "nat set" assumes"∧i. i ∈ A ==> i ≤ f i" assumes"f ` A = B" shows"finite A ⟷ finite B" proof assume"finite B" thus"finite A" proof (cases "B ≠ {}") case True hence"∧i. i ∈ A ==> i ≤ Max B" by (metis assms Max_ge_iff ‹finite B› imageI) thus"finite A" unfolding finite_nat_set_iff_bounded_le by blast qed (metis assms(2) image_is_empty) qed (metis assms(2) finite_imageI)
lemma finite_monotonic_image_pairs: fixes A :: "(nat × nat) set" fixes B :: "nat set" assumes"∧i. i ∈ A ==> (fst i) ≤ f i + c" assumes"∧i. i ∈ A ==> (snd i) ≤ f i + d" assumes"f ` A = B" shows"finite A ⟷ finite B" proof assume"finite B" thus"finite A" proof (cases "B ≠ {}") case True hence"∧i. i ∈ A ==> fst i ≤ Max B + c ∧ snd i ≤ Max B + d" by (metis assms Max_ge_iff ‹finite B› imageI le_diff_conv) thus"finite A" using finite_product[of A] unfolding finite_nat_set_iff_bounded_le by blast qed (metis assms(3) finite.emptyI image_is_empty) qed (metis assms(3) finite_imageI)
lemma token_time_finite_rule: fixes A B :: "nat set" assumes unique: "∧x y z. P x y ==> P x z ==> y = z" and existsA: "∧x. x ∈ A ==> (∃y. P x y)" and existsB: "∧y. y ∈ B ==> (∃x. P x y)" and inA: "∧x y. P x y ==> x ∈ A" and inB: "∧x y. P x y ==> y ∈ B" and mono: "∧x y. P x y ==> x ≤ y" shows"finite A ⟷ finite B" proof (rule finite_monotonic_image) let ?f = "(λx. if x ∈ A then The (P x) else undefined)"
{ fix x assume"x ∈ A" thenobtain y where"P x y"and"y = ?f x" using existsA the_equality unique by metis thus"x ≤ ?f x" using mono by blast
}
{ fix y have"y ∈ ?f ` A ⟷ (∃x. x ∈ A ∧ y = The (P x))" unfolding image_def by force also have"…⟷ (∃x. P x y)" by (metis inA existsA unique the_equality) also have"…⟷ y ∈ B" using inB existsB by blast finally have"y ∈ ?f ` A ⟷ y ∈ B"
.
} thus"?f ` A = B" by blast qed
lemma token_time_finite_pair_rule: fixes A :: "(nat × nat) set" fixes B :: "nat set" assumes unique: "∧x y z. P x y ==> P x z ==> y = z" and existsA: "∧x. x ∈ A ==> (∃y. P x y)" and existsB: "∧y. y ∈ B ==> (∃x. P x y)" and inA: "∧x y. P x y ==> x ∈ A" and inB: "∧x y. P x y ==> y ∈ B" and mono: "∧x y. P x y ==> fst x ≤ y + c ∧ snd x ≤ y + d" shows"finite A ⟷ finite B" proof (rule finite_monotonic_image_pairs) let ?f = "(λx. if x ∈ A then The (P x) else undefined)"
{ fix x assume"x ∈ A" thenobtain y where"P x y"and"y = ?f x" using existsA the_equality unique by metis thus"fst x ≤ ?f x + c"and"snd x ≤ ?f x + d" using mono by blast+
}
{ fix y have"y ∈ ?f ` A ⟷ (∃x. x ∈ A ∧ y = The (P x))" unfolding image_def by force also have"…⟷ (∃x. P x y)" by (metis inA existsA unique the_equality) also have"…⟷ y ∈ B" using inB existsB by blast finally have"y ∈ ?f ` A ⟷ y ∈ B"
.
} thus"?f ` A = B" by blast qed
―‹Correspondence Between Token- and Time-Based Definitions›
lemma fail_t_inclusion: assumes"x ≤ n" assumes"¬sink (token_run x n)" assumes"sink (token_run x (Suc n))" assumes"token_run x (Suc n) ∉ F" shows"n ∈ fail_t" proof - define q q' where"q = token_run x n"and"q' = token_run x (Suc n)" hence *: "¬sink q""sink q'"and"q' ∉ F" using assms by blast+ moreover from * have **: "state_rank q n ≠ None" unfolding q_def by (metis oldest_token_always_def option.distinct(1) state_rank_None) moreover from ** have"q' = δ q (w n)" unfolding q_def q'_defusing assms(1) token_run_step' by blast ultimately show"n ∈ fail_t" unfolding fail_t_def by blast qed
lemma merge_t_inclusion: assumes"x ≤ n" assumes"(∃j'. token_run x n ≠ token_run y n ∧ y ≤ n ∧ state_rank (token_run y n) n = Some j') ∨ y = Suc n" assumes"token_run x (Suc n) = token_run y (Suc n)" assumes"token_run x (Suc n) ∉ F" assumes"state_rank (token_run x n) n = Some j" assumes"j < i" shows"n ∈ merge_t i" proof - define q q' q'' where"q = token_run x n" and"q' = token_run x (Suc n)" and"q'' = token_run y n" have"y ≤ Suc n" using assms(2) by linarith hence"(q' = δ q'' (w n) ∧ state_rank q'' n ≠ None ∧ q'' ≠ q) ∨ q' = q0" unfolding q_def q'_def q''_defusing assms(2-3) by (cases "y = Suc n") ((metis token_run_intial_state), (metis option.distinct(1) token_run_step)) moreover have"state_rank q n = Some j ∧ j < i ∧ q' = δ q (w n) ∧ q' ∉ F" unfolding q_def q'_defusing token_run_step[OF assms(1)] assms(4-6) by blast ultimately show"n ∈ merge_t i" unfolding merge_t_def by blast qed
lemma succeed_t_inclusion: assumes"rank x n = Some i" assumes"token_run x n ∉ F - {q0}" assumes"token_run x (Suc n) ∈ F" shows"n ∈ succeed_t i" proof - define q where"q = token_run x n" hence"state_rank q n = Some i"and"q ∉ F - {q0}"and"δ q (w n) ∈ F" using token_run_step' rank_Some_time[OF assms(1)] assms rank_eq_state_rank by auto thus"n ∈ succeed_t i" unfolding succeed_t_def by blast qed
lemma finite_fail_t: "finite fail = finite fail_t" proof (rule token_time_finite_rule) let ?P = "(λx n. x ≤ n ∧¬sink (token_run x n) ∧ sink (token_run x (Suc n)) ∧ token_run x (Suc n) ∉ F)"
{ fix x have"¬sink (token_run x x)" unfolding sink_def by simp
assume"x ∈ fail" hence"token_fails x" unfolding fail_def .. moreover thenobtain y'' where"sink (token_run x (Suc (x + y'')))" unfolding token_fails_alt_def MOST_nat using‹¬ sink (token_run x x)› less_add_Suc2 by blast thenobtain y' where"¬sink (token_run x (x + y'))"and"sink (token_run x (Suc (x + y')))" using token_run_P[of "λq. sink q", OF ‹¬sink (token_run x x)›] by blast ultimately show"∃y. ?P x y" using token_fails_alt_def_2 token_succeeds_def by (metis le_add1)
}
{ fix y assume"y ∈ fail_t" thenobtain q q' i where"state_rank q y = Some i"and"q' = δ q (w y)"and"q' ∉ F"and"sink q'" unfolding fail_t_def by blast moreover thenobtain x where"token_run x y = q"and"x ≤ y" by (blast dest: push_down_state_rank_token_run) moreover hence"token_run x (Suc y) = q'" using token_run_step[OF _ _ ‹q' = δ q (w y)›] by blast ultimately show"∃x. ?P x y" by (metis option.distinct(1) state_rank_sink)
}
{ fix x y assume"?P x y" thus"x ∈ fail"and"x ≤ y"and"y ∈ fail_t" unfolding fail_def using token_fails_def fail_t_inclusion by blast+
}
―‹Uniqueness›
{ fix x y z assume"?P x y"and"?P x z" from‹?P x y›have"¬sink (token_run x y)"and"sink (token_run x (Suc y))" by blast+ moreover from‹?P x z›have"¬sink (token_run x z)"and"sink (token_run x (Suc z))" by blast+ ultimately show"y = z" using token_stays_in_sink by (cases y z rule: linorder_cases, simp_all)
(metis (no_types, lifting) Suc_leI le_add_diff_inverse)+
} qed
lemma finite_succeed_t': assumes"q0∉ F" shows"finite (succeed i) = finite (succeed_t i)" proof (rule token_time_finite_rule) let ?P = "(λx n. x ≤ n ∧ state_rank (token_run x n) n = Some i ∧ (token_run x n) ∉ F - {q0} ∧ (token_run x (Suc n)) ∈ F)"
{ fix x assume"x ∈ succeed i" thenobtain y where"token_run x y ∉ F - {q0}"and"token_run x (Suc y) ∈ F"and"rank x y = Some i" unfolding succeed_def by force moreover hence"rank (senior x y) y = Some i" using rank_Some_time[THEN rank_senior_senior] by presburger hence"state_rank (token_run x y) y = Some i" unfolding state_rank_eq_rank senior.simps by (metis oldest_token_always_def option.sel option.simps(5)) ultimately show"∃y. ?P x y" using rank_Some_time by blast
}
{ fix y assume"y ∈ succeed_t i" thenobtain q where"state_rank q y = Some i"and"q ∉ F - {q0}"and"(δ q (w y)) ∈ F" unfolding succeed_t_def by blast moreover thenobtain x where"q = token_run x y"and"x ≤ y" by (metis oldest_token_bounded push_down_oldest_token_token_run push_down_state_rank_oldest_token) moreover hence"token_run x (Suc y) ∈ F" using token_run_step ‹(δ q (w y)) ∈ F›by simp ultimately show"∃x. ?P x y" by meson
}
{ fix x y assume"?P x y" thus"x ≤ y"and"x ∈ succeed i"and"y ∈ succeed_t i" unfolding succeed_def using rank_eq_state_rank[of x y] succeed_t_inclusion by (metis (mono_tags, lifting) mem_Collect_eq)+
}
―‹Uniqueness›
{ fix x y z assume"?P x y"and"?P x z" from‹?P x y›have"token_run x y ∉ F"and"token_run x (Suc y) ∈ F" using‹q0∉ F›by auto moreover from‹?P x z›have"token_run x z ∉ F"and"token_run x (Suc z) ∈ F" using‹q0∉ F›by auto ultimately show"y = z" using token_stays_in_final_states by (cases y z rule: linorder_cases, simp_all)
(metis le_Suc_ex less_Suc_eq_le not_le)+
} qed
lemma initial_in_F_token_run: assumes"q0∈ F" shows"token_run x y ∈ F" using assms token_stays_in_final_states[of _ 0] by fastforce
lemma finite_succeed_t'': assumes"q0∈ F" shows"finite (succeed i) = finite (succeed_t i)"
(is"?lhs = ?rhs") proof have"succeed_t i = {n. state_rank q0 n = Some i}" unfolding succeed_t_def using initial_in_F_token_run assms wellformed_F by auto also have"... = {n. rank n n = Some i}" unfolding rank_eq_state_rank[OF order_refl] token_run_intial_state .. finally have succeed_t_alt_def: "succeed_t i = {n. rank n n = Some i ∧ token_run n n = q0}" by simp
have succeed_alt_def: "succeed i = {x. ∃n. rank x n = Some i ∧ token_run x n = q0}" unfolding succeed_def using initial_in_F_token_run[OF assms] by auto
{ assume ?lhs moreover have"succeed_t i ⊆ succeed i" unfolding succeed_t_alt_def succeed_alt_def by blast ultimately show ?rhs by (rule rev_finite_subset)
}
{ assume ?rhs thenobtain U where U_def: "∧x. x ∈ succeed_t i ==> U ≥ x" unfolding finite_nat_set_iff_bounded_le by blast
{ fix x assume"x ∈ succeed i" thenobtain n where"rank x n = Some i"and"token_run x n = q0" unfolding succeed_alt_def by blast moreover hence"x ≤ n" by (blast dest: rank_Some_time) moreover hence"rank n n = Some i" using‹rank x n = Some i›‹token_run x n = q0› by (metis order_refl token_run_intial_state[of n] pull_up_token_run_tokens pull_up_configuration_rank) hence"n ∈ succeed_t i" unfolding succeed_t_alt_def by simp ultimately have"U ≥ x" using U_def by fastforce
} thus ?lhs unfolding finite_nat_set_iff_bounded_le by blast
} qed
lemma finite_succeed_t: "finite (succeed i) = finite (succeed_t i)" using finite_succeed_t' finite_succeed_t'' by blast
lemma finite_merge_t: "finite (merge i) = finite (merge_t i)" proof (rule token_time_finite_pair_rule) let ?P = "(λ(x, y) n. ∃j. x ≤ n ∧ ((∃j'. token_run x n ≠ token_run y n ∧ y ≤ n ∧ state_rank (token_run y n) n = Some j') ∨ y = Suc n) ∧ token_run x (Suc n) = token_run y (Suc n) ∧ token_run x (Suc n) ∉ F ∧ state_rank (token_run x n) n = Some j ∧ j < i)"
{ fix x assume"x ∈ merge i" thenobtain t t' n j where1: "x = (t, t')" and3: "(∃j'. token_run t n ≠ token_run t' n ∧ rank t' n = Some j') ∨ t' = Suc n" and4: "token_run t (Suc n) = token_run t' (Suc n)" and5: "token_run t (Suc n) ∉ F" and6: "rank t n = Some j" and7: "j < i" unfolding merge_def by blast moreover hence8: "t ≤ n"and9: "t' ≤ Suc n" using rank_Some_time le_Suc_eq by blast+ moreover hence10: "state_rank (token_run t n) n = Some j" using‹rank t n = Some j› rank_eq_state_rank by metis ultimately show"∃y. ?P x y" proof (cases "t' = Suc n") case False hence"t' ≤ n" using‹t' ≤ Suc n›by simp with13457810show ?thesis unfolding rank_eq_state_rank[OF ‹t' ≤ n›] by blast qed blast
}
{ fix y assume"y ∈ merge_t i" thenobtain q q' j where1: "state_rank q y = Some j" and2: "j < i" and3: "q' = δ q (w y)" and4: "q' ∉ F" and5: "(∃q''. q' = δ q'' (w y) ∧ state_rank q'' y ≠ None ∧ q'' ≠ q) ∨ q' = q0" unfolding merge_t_def by blast
thenobtain t where6: "q = token_run t y"and7: "t ≤ y" using push_down_state_rank_token_run by metis hence8: "q' = token_run t (Suc y)" unfolding‹q' = δ q (w y)›using token_run_step by simp
{ assume"q' = q0" hence"token_run t (Suc y) = token_run (Suc y) (Suc y)" unfolding8by simp moreover thenobtain x where"x = (t, Suc y)" by simp ultimately have"?P x y" using123457unfolding68by force hence"∃x. ?P x y" by blast
} moreover
{ assume"q' ≠ q0" thenobtain q'' j' where9: "q' = δ q'' (w y)" and"state_rank q'' y = Some j'" and"q'' ≠ q" using5by blast moreover thenobtain t' where12: "q'' = token_run t' y"and"t' ≤ y" by (blast dest: push_down_state_rank_token_run) moreover hence"token_run t (Suc y) = token_run t' (Suc y)" using89 token_run_step by presburger moreover have"token_run t y ≠ token_run t' y" using‹q'' ≠ q›unfolding612 .. moreover thenobtain x where"x = (t, t')" by simp ultimately have"?P x y" using1247unfolding68by fast hence"∃x. ?P x y" by blast
} ultimately show"∃x. ?P x y" by blast
}
{ fix x y assume"?P x y" thenobtain t t' j where1: "x = (t, t')" and3: "t ≤ y" and4: "(∃j'. token_run t y ≠ token_run t' y ∧ t' ≤ y ∧ state_rank (token_run t' y) y = Some j') ∨ t' = Suc y" and5: "token_run t (Suc y) = token_run t' (Suc y)" and6: "token_run t (Suc y) ∉ F" and7: "state_rank (token_run t y) y = Some j" and8: "j < i" by blast
show"y ∈ merge_t i"and"fst x ≤ y + 0 ∧ snd x ≤ y + 1" using merge_t_inclusion ‹?P x y›by force+
}
―‹Uniqueness›
{ fix x y z assume"?P x y"and"?P x z" thenobtain t t' where"x = (t, t')" by blast from‹?P x y›[unfolded ‹x = (t, t')›] have y1: "t ≤ y" and y2: "(token_run t y ≠ token_run t' y ∧ t' ≤ y) ∨ t' = Suc y" and y3: "token_run t (Suc y) = token_run t' (Suc y)"by blast+ moreover from‹?P x z›[unfolded ‹x = (t, t')›] have z1: "t ≤ z" and z2: "(token_run t z ≠ token_run t' z ∧ t' ≤ z) ∨ t' = Suc z" and z3: "token_run t (Suc z) = token_run t' (Suc z)"by blast+ moreover have y4: "t' ≤ Suc y"and z4: "t' ≤ Suc z" using y2 z2 by linarith+ ultimately show"y = z" proof (cases y z rule: linorder_cases) case less thenobtain d where"Suc y + d = z" by (metis add_Suc_right add_Suc_shift less_imp_Suc_add) thus ?thesis using y1 y2 z2 token_run_merge[OF _ y4 y3] by auto next case greater thenobtain d where"Suc z + d = y" by (metis add_Suc_right add_Suc_shift less_imp_Suc_add) thus ?thesis using z1 y2 z2 token_run_merge[OF _ z4 z3] by auto qed
} qed
definition stable_rank_at :: "nat ==> nat ==> bool" where "stable_rank_at x n ≡∃i. ∀m ≥ n. rank x m = Some i"
lemma stable_rank_at_ge: "n ≤ m ==> stable_rank_at x n ==> stable_rank_at x m" unfolding stable_rank_at_def by fastforce
lemma stable_rank_equiv: "(∃i. stable_rank x i) = (∃n. stable_rank_at x n)" unfolding stable_rank_def MOST_nat_le stable_rank_at_def by blast
lemma smallest_accepting_rank_properties: assumes"smallest_accepting_rank = Some i" shows"accept""finite fail""finite (merge i)""infinite (succeed i)""∀j < i. finite (succeed j)""i < max_rank" proof - from assms show"accept" unfolding smallest_accepting_rank_def using option.distinct(1) by metis thenobtain i' where"finite fail"and"finite (merge i')"and"infinite (succeed i')" and"∀j < i'. finite (succeed j)"and"i' < max_rank" unfolding mojmir_accept_iff_token_set_accept2 by blast moreover hence"∧y. finite fail ∧ finite (merge y) ∧ infinite (succeed y) ⟶ i' ≤ y" using not_le by blast ultimately have"(LEAST i. finite fail ∧ finite (merge i) ∧ infinite (succeed i)) = i'" using le_antisym unfolding Least_def by (blast dest: the_equality[of _ i']) hence"i' = i" using‹smallest_accepting_rank = Some i›‹accept›unfolding smallest_accepting_rank_def by simp thus"finite fail"and"finite (merge i)"and"infinite (succeed i)" and"∀j < i. finite (succeed j)"and"i < max_rank" using‹finite fail›‹finite (merge i')›‹infinite (succeed i')› using‹∀j < i'. finite (succeed j)›‹i' < max_rank›by simp+ qed
lemma token_smallest_accepting_rank: assumes"smallest_accepting_rank = Some i" shows"∀\<infinity>n. ∀x. token_succeeds x ⟷ (x > n ∨ (∃j ≥ i. rank x n = Some j) ∨ token_run x n ∈ F)" proof - from assms have"accept""finite fail""infinite (succeed i)""∀j < i. finite (succeed j)" using smallest_accepting_rank_properties by blast+
thenobtain n1where n1_def: "∀x ≥ n1. token_succeeds x" unfolding accept_def MOST_nat_le by blast define n2where"n2 = Suc (Max (fail_t ∪∪{succeed_t j | j. j < i}))" (is"_ = Suc (Max ?S)") define n3where"n3 = Max ({LEAST m. stable_rank_at x m | x. x < n1∧ token_squats x})" (is"_ = Max ?S'") define n where"n = Max {n1, n2, n3}"
have"finite ?S"and"finite ?S'" using‹finite fail›‹∀j < i. finite (succeed j)› unfolding finite_fail_t finite_succeed_t by fastforce+
{ fix x assume"x < n1""token_squats x" hence"(LEAST m. stable_rank_at x m) ∈ ?S'" (is"?m ∈ _") by blast hence"?m ≤ n3" using Max.coboundedI[OF ‹finite ?S'›] n3_defby simp moreover obtain k where"stable_rank x k" using‹x < n1›‹token_squats x› stable_rank_equiv_token_squats by blast hence"stable_rank_at x ?m" by (metis stable_rank_equiv LeastI) ultimately have"stable_rank_at x n3" by (rule stable_rank_at_ge) hence"∃i. ∀m' ≥ n. rank x m' = Some i" unfolding n_def stable_rank_at_def by fastforce
} note Stable = this
have"∧m j. j < i ==> m ∈ succeed_t j ==> m < n" using Max.coboundedI[OF ‹finite ?S›] unfolding n_def n2_defby fastforce hence Succeed: "∧m j x. n ≤ m ==> token_run x m ∉ F - {q0} ==> token_run x (Suc m)∈ F ==> rank x m = Some j ==> i ≤ j" by (metis not_le succeed_t_inclusion)
have"∧m. m ∈ fail_t ==> m < n" using Max.coboundedI[OF ‹finite ?S›] unfolding n_def n2_defby fastforce hence Fail: "∧m x. n ≤ m ==> x ≤ m ==> sink (token_run x m) ∨¬sink (token_run x (Suc m)) ∨¬token_run x (Suc m) ∉ F" using fail_t_inclusion by fastforce
{ fix m x assume"m ≥ n""m ≥ x" moreover
{ assume"token_succeeds x""token_run x m ∉ F" thenobtain m' where"x ≤ m'"and"token_run x m' ∉ F - {q0}"and"token_run x (Suc m') ∈ F" using token_run_enter_final_states unfolding token_succeeds_def by meson moreover hence"¬sink (token_run x m')" by (metis Diff_empty Diff_insert0 ‹token_run x m ∉ F› initial_in_F_token_run token_is_not_in_sink) ultimately obtain j' where"rank x m' = Some j'" by simp moreover have"m ≤ m'" by (metis ‹token_run x m ∉ F› token_stays_in_final_states[OF ‹token_run x (Suc m') ∈ F›] add_Suc_right add_Suc_shift less_imp_Suc_add not_le) moreover hence"m' ≥ n" using‹x ≤ m›‹m ≥ n›by simp hence"j' ≥ i" using Succeed[OF _ ‹token_run x m' ∉ F - {q0}›‹token_run x (Suc m') ∈ F›‹rank x m' = Some j'›] by blast moreover obtain k where"rank x x = Some k" using rank_initial[of x] by blast ultimately obtain j where"rank x m = Some j" by (metis rank_continuous[OF ‹rank x x = Some k›, of "m' - x"] ‹x ≤ m'›‹x ≤ m› diff_le_mono le_add_diff_inverse) hence"∃j ≥ i. rank x m = Some j" using rank_monotonic ‹rank x m' = Some j'›‹j' ≥ i›‹m ≤ m'›[THEN le_Suc_ex] by (blast dest: le_Suc_ex trans_le_add1)
} moreover
{ assume"¬token_succeeds x" hence"∧m. token_run x m ∉ F" unfolding token_succeeds_def by blast moreover have"¬(∃j ≥ i. rank x m = Some j)" proof (cases "token_squats x") case True ―‹The token already stabilised› have"x < n1" using‹¬token_succeeds x› n1_defby (metis not_le) thenobtain k where"∀m' ≥ n. rank x m' = Some k" using Stable[OF _ True] by blast moreover hence"stable_rank x k" unfolding stable_rank_def MOST_nat_le by blast moreover have"q0∉ F" by (metis ‹∧m. token_run x m ∉ F› initial_in_F_token_run) ultimately ―‹Hence the rank is smaller than i› have"k < i"and"rank x m = Some k" using stable_rank_bounded ‹infinite (succeed i)›‹n ≤ m›by blast+ thus ?thesis by simp next case False ―‹Then token is already in a sink› have"sink (token_run x m)" proof (rule ccontr) assume"¬sink (token_run x m)" moreover obtain m' where"m < m'"and"sink (token_run x m')" by (metis False token_squats_def le_add2 not_le not_less_eq_eq token_stays_in_sink) ultimately obtain m'' where"m ≤ m''"and"¬sink (token_run x m'')"and"sink (token_run x (Suc m''))" by (metis le_add1 less_imp_Suc_add token_run_P) thus False by (metis Fail ‹∧m. token_run x m ∉ F›‹n ≤ m›‹x ≤ m› le_trans) qed ―‹Hence there is no rank› thus ?thesis by simp qed ultimately have"¬(∃j ≥ i. rank x m = Some j) ∧ token_run x m ∉ F" by blast
} ultimately have"(∃j ≥ i. rank x m = Some j) ∨ token_run x m ∈ F ⟷ token_succeeds x" by (cases "token_succeeds x") (blast, simp)
} moreover ―‹By definition of n all tokens @{term "∧x. x ≥ n"} succeed› have"∧m x. m ≥ n ==>¬x ≤ m ==> token_succeeds x" using n_def n1_defby force ultimately show ?thesis unfolding MOST_nat_le not_le[symmetric] by blast qed
lemma succeeding_states: assumes"smallest_accepting_rank = Some i" shows"∀\<infinity>n. ∀q. ((∃x ∈ configuration q n. token_succeeds x) ⟶ q ∈S n) ∧ (q ∈S n ⟶ (∀x ∈ configuration q n. token_succeeds x))" proof - obtain n where n_def: "∧m x. m ≥ n ==> token_succeeds x = (x > m ∨ (∃j ≥ i. rank x m = Some j) ∨ token_run x m ∈ F)" using token_smallest_accepting_rank[OF assms] unfolding MOST_nat_le by auto
{ fix m q assume"m ≥ n""q ∉ F""∃x ∈ configuration q m. token_succeeds x" moreover thenobtain x where"token_run x m = q"and"x ≤ m"and"token_succeeds x" by auto ultimately have"∃j ≥ i. rank x m = Some j" using n_def by simp hence"∃j ≥ i. state_rank q m = Some j" using rank_eq_state_rank ‹x ≤ m›‹token_run x m = q›by metis
} moreover
{ fix m q x assume"m ≥ n""x ∈ configuration q m" hence"x ≤ m"and"token_run x m = q" by simp+ moreover assume"q ∈S m" hence"(∃j ≥ i. state_rank q m = Some j) ∨ q ∈ F" using assms by fastforce ultimately have"(∃j ≥ i. rank x m = Some j) ∨ q ∈ F" using rank_eq_state_rank by presburger hence"token_succeeds x" unfolding n_def[OF ‹m ≥ n›] ‹token_run x m = q›by presburger
} ultimately show ?thesis unfolding MOST_nat_le S.simps assms option.sel by blast qed
end
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.27 Sekunden
(vorverarbeitet am 2026-06-13)
¤
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.