diff --git a/thys/Transition_Systems_and_Automata/Automata/NBA/NBA_Translate.thy b/thys/Transition_Systems_and_Automata/Automata/NBA/NBA_Translate.thy --- a/thys/Transition_Systems_and_Automata/Automata/NBA/NBA_Translate.thy +++ b/thys/Transition_Systems_and_Automata/Automata/NBA/NBA_Translate.thy @@ -1,253 +1,253 @@ section \Explore and Enumerate Nodes of Nondeterministic Büchi Automata\ theory NBA_Translate imports NBA_Explicit begin subsection \Syntax\ (* TODO: this syntax has unnecessarily high inner binding strength, requiring extra parentheses the regular let syntax correctly uses inner binding strength 0: ("(2_ =/ _)" 10) *) no_syntax "_do_let" :: "[pttrn, 'a] \ do_bind" ("(2let _ =/ _)" [1000, 13] 13) syntax "_do_let" :: "[pttrn, 'a] \ do_bind" ("(2let _ =/ _)" 13) section \Image on Explicit Automata\ definition nbae_image where "nbae_image f A \ nbae (alphabete A) (f ` initiale A) ((\ (p, a, q). (f p, a, f q)) ` transitione A) (f ` acceptinge A)" lemma nbae_image_param[param]: "(nbae_image, nbae_image) \ (S \ T) \ \L, S\ nbae_rel \ \L, T\ nbae_rel" unfolding nbae_image_def by parametricity lemma nbae_image_id[simp]: "nbae_image id = id" unfolding nbae_image_def by auto lemma nbae_image_nba_nbae: "nbae_image f (nba_nbae A) = nbae (alphabet A) (f ` initial A) (\ p \ nodes A. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) (f ` {p \ nodes A. accepting A p})" unfolding nba_nbae_def nbae_image_def nbae.simps Set.filter_def by force section \Exploration and Translation\ definition trans_spec where "trans_spec A f \ \ p \ nodes A. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p" definition trans_algo where "trans_algo N L S f \ FOREACH N (\ p T. do { ASSERT (p \ N); FOREACH L (\ a T. do { ASSERT (a \ L); FOREACH (S a p) (\ q T. do { ASSERT (q \ S a p); ASSERT ((f p, a, f q) \ T); RETURN (insert (f p, a, f q) T) } ) T } ) T } ) {}" lemma trans_algo_refine: assumes "finite (nodes A)" "finite (alphabet A)" "inj_on f (nodes A)" assumes "N = nodes A" "L = alphabet A" "S = transition A" shows "(trans_algo N L S f, SPEC (HOL.eq (trans_spec A f))) \ \Id\ nres_rel" unfolding trans_algo_def trans_spec_def assms(4-6) proof (refine_vcg FOREACH_rule_insert_eq) show "finite (nodes A)" using assms(1) by this show "(\ p \ nodes A. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = (\ p \ nodes A. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p)" by rule show "(\ p \ {}. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = {}" by simp fix T x assume 1: "T \ nodes A" "x \ nodes A" "x \ T" show "finite (alphabet A)" using assms(2) by this show "(\ a \ {}. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p)" "(\ a \ alphabet A. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = (\ p \ insert x T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p)" by auto fix Ta xa assume 2: "Ta \ alphabet A" "xa \ alphabet A" "xa \ Ta" - show "finite (transition A xa x)" using 1 2 assms(1) by (meson infinite_subset nodes_succ subsetI) + show "finite (transition A xa x)" using 1 2 assms(1) by (meson infinite_subset nodes_step subsetI) show "(f ` {x} \ {xa} \ f ` transition A xa x) \ (\ a \ Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = (\ a \ insert xa Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p)" by auto show "(f ` {x} \ {xa} \ f ` {}) \ (\ a \ Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = (\ a \ Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p)" by auto fix Tb xb assume 3: "Tb \ transition A xa x" "xb \ transition A xa x" "xb \ Tb" show "(f x, xa, f xb) \ f ` {x} \ {xa} \ f ` Tb \ (\ a \ Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p)" using 1 2 3 assms(3) by (blast dest: inj_onD) show "f ` {x} \ {xa} \ f ` insert xb Tb \ (\ a \ Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p) = insert (f x, xa, f xb) (f ` {x} \ {xa} \ f ` Tb \ (\ a \ Ta. f ` {x} \ {a} \ f ` transition A a x) \ (\ p \ T. \ a \ alphabet A. f ` {p} \ {a} \ f ` transition A a p))" by auto qed definition to_nbaei :: "('state, 'label) nba \ ('state, 'label) nba" where "to_nbaei \ id" (* TODO: make separate implementations for "nba_nbae" and "op_set_enumerate \ nbae_image" *) schematic_goal to_nbaei_impl: fixes S :: "('statei \ 'state) set" assumes [simp]: "finite (nodes A)" assumes [autoref_ga_rules]: "is_bounded_hashcode S seq bhc" assumes [autoref_ga_rules]: "is_valid_def_hm_size TYPE('statei) hms" assumes [autoref_rules]: "(seq, HOL.eq) \ S \ S \ bool_rel" assumes [autoref_rules]: "(Ai, A) \ \L, S\ nbai_nba_rel" shows "(?f :: ?'a, do { let N = nodes A; f \ op_set_enumerate N; ASSERT (dom f = N); ASSERT (\ p \ initial A. f p \ None); ASSERT (\ a \ alphabet A. \ p \ dom f. \ q \ transition A a p. f q \ None); T \ trans_algo N (alphabet A) (transition A) (\ x. the (f x)); RETURN (nbae (alphabet A) ((\ x. the (f x)) ` initial A) T ((\ x. the (f x)) ` {p \ N. accepting A p})) }) \ ?R" unfolding trans_algo_def by (autoref_monadic (plain)) concrete_definition to_nbaei_impl uses to_nbaei_impl lemma to_nbaei_impl_refine'': fixes S :: "('statei \ 'state) set" assumes "finite (nodes A)" assumes "is_bounded_hashcode S seq bhc" assumes "is_valid_def_hm_size TYPE('statei) hms" assumes "(seq, HOL.eq) \ S \ S \ bool_rel" assumes "(Ai, A) \ \L, S\ nbai_nba_rel" shows "(RETURN (to_nbaei_impl seq bhc hms Ai), do { f \ op_set_enumerate (nodes A); RETURN (nbae_image (the \ f) (nba_nbae A)) }) \ \\L, nat_rel\ nbaei_nbae_rel\ nres_rel" proof - have 1: "finite (alphabet A)" using nbai_nba_param(2)[param_fo, OF assms(5)] list_set_rel_finite unfolding finite_set_rel_def by auto note to_nbaei_impl.refine[OF assms] also have "(do { let N = nodes A; f \ op_set_enumerate N; ASSERT (dom f = N); ASSERT (\ p \ initial A. f p \ None); ASSERT (\ a \ alphabet A. \ p \ dom f. \ q \ transition A a p. f q \ None); T \ trans_algo N (alphabet A) (transition A) (\ x. the (f x)); RETURN (nbae (alphabet A) ((\ x. the (f x)) ` initial A) T ((\ x. the (f x)) ` {p \ N. accepting A p})) }, do { f \ op_set_enumerate (nodes A); T \ SPEC (HOL.eq (trans_spec A (\ x. the (f x)))); RETURN (nbae (alphabet A) ((\ x. the (f x)) ` initial A) T ((\ x. the (f x)) ` {p \ nodes A. accepting A p})) }) \ \Id\ nres_rel" unfolding Let_def comp_apply op_set_enumerate_def using assms(1) 1 by (refine_vcg vcg0[OF trans_algo_refine]) (auto intro!: inj_on_map_the[unfolded comp_apply]) also have "(do { f \ op_set_enumerate (nodes A); T \ SPEC (HOL.eq (trans_spec A (\ x. the (f x)))); RETURN (nbae (alphabet A) ((\ x. the (f x)) ` initial A) T ((\ x. the (f x)) ` {p \ nodes A. accepting A p})) }, do { f \ op_set_enumerate (nodes A); RETURN (nbae_image (the \ f) (nba_nbae A)) }) \ \Id\ nres_rel" unfolding trans_spec_def nbae_image_nba_nbae by refine_vcg force finally show ?thesis unfolding nres_rel_comp by simp qed (* TODO: generalize L *) context fixes Ai A fixes seq bhc hms fixes S :: "('statei \ 'state) set" assumes a: "finite (nodes A)" assumes b: "is_bounded_hashcode S seq bhc" assumes c: "is_valid_def_hm_size TYPE('statei) hms" assumes d: "(seq, HOL.eq) \ S \ S \ bool_rel" assumes e: "(Ai, A) \ \Id, S\ nbai_nba_rel" begin definition f' where "f' \ SOME f'. (to_nbaei_impl seq bhc hms Ai, nbae_image (the \ f') (nba_nbae A)) \ \Id, nat_rel\ nbaei_nbae_rel \ dom f' = nodes A \ inj_on f' (nodes A)" lemma 1: "\ f'. (to_nbaei_impl seq bhc hms Ai, nbae_image (the \ f') (nba_nbae A)) \ \Id, nat_rel\ nbaei_nbae_rel \ dom f' = nodes A \ inj_on f' (nodes A)" using to_nbaei_impl_refine''[ OF a b c d e, unfolded op_set_enumerate_def bind_RES_RETURN_eq, THEN nres_relD, THEN RETURN_ref_SPECD] by force lemma f'_refine: "(to_nbaei_impl seq bhc hms Ai, nbae_image (the \ f') (nba_nbae A)) \ \Id, nat_rel\ nbaei_nbae_rel" using someI_ex[OF 1, folded f'_def] by auto lemma f'_dom: "dom f' = nodes A" using someI_ex[OF 1, folded f'_def] by auto lemma f'_inj: "inj_on f' (nodes A)" using someI_ex[OF 1, folded f'_def] by auto definition f where "f \ the \ f'" definition g where "g = inv_into (nodes A) f" lemma inj_f[intro!, simp]: "inj_on f (nodes A)" using f'_inj f'_dom unfolding f_def by (simp add: inj_on_map_the) lemma inj_g[intro!, simp]: "inj_on g (f ` nodes A)" unfolding g_def by (simp add: inj_on_inv_into) definition rel where "rel \ {(f p, p) |p. p \ nodes A}" lemma rel_alt_def: "rel = (br f (\ p. p \ nodes A))\" unfolding rel_def by (auto simp: in_br_conv) lemma rel_inv_def: "rel = br g (\ k. k \ f ` nodes A)" unfolding rel_alt_def g_def by (auto simp: in_br_conv) lemma rel_domain[simp]: "Domain rel = f ` nodes A" unfolding rel_def by force lemma rel_range[simp]: "Range rel = nodes A" unfolding rel_def by auto lemma [intro!, simp]: "bijective rel" unfolding rel_inv_def by (simp add: bijective_alt) lemma [simp]: "Id_on (f ` nodes A) O rel = rel" unfolding rel_def by auto lemma [simp]: "rel O Id_on (nodes A) = rel" unfolding rel_def by auto lemma [param]: "(f, f) \ Id_on (Range rel) \ Id_on (Domain rel)" unfolding rel_alt_def by auto lemma [param]: "(g, g) \ Id_on (Domain rel) \ Id_on (Range rel)" unfolding rel_inv_def by auto lemma [param]: "(id, f) \ rel \ Id_on (Domain rel)" unfolding rel_alt_def by (auto simp: in_br_conv) lemma [param]: "(f, id) \ Id_on (Range rel) \ rel" unfolding rel_alt_def by (auto simp: in_br_conv) lemma [param]: "(id, g) \ Id_on (Domain rel) \ rel" unfolding rel_inv_def by (auto simp: in_br_conv) lemma [param]: "(g, id) \ rel \ Id_on (Range rel)" unfolding rel_inv_def by (auto simp: in_br_conv) lemma to_nbaei_impl_refine': "(to_nbaei_impl seq bhc hms Ai, to_nbaei A) \ \Id_on (alphabet A), rel\ nbaei_nba_rel" proof - have "(nbae_nba (nbaei_nbae (to_nbaei_impl seq bhc hms Ai)), nbae_nba (id (nbae_image f (nba_nbae A)))) \ \Id, nat_rel\ nba_rel" using f'_refine[folded f_def] by parametricity auto also have "(nbae_nba (id (nbae_image f (nba_nbae A))), nbae_nba (id (nbae_image id (nba_nbae A)))) \ \Id_on (alphabet A), rel\ nba_rel" using nba_rel_eq by parametricity auto also have "nbae_nba (id (nbae_image id (nba_nbae A))) = (nbae_nba \ nba_nbae) A" by simp also have "(\, id A) \ \Id_on (alphabet A), Id_on (nodes A)\ nba_rel" by parametricity also have "id A = to_nbaei A" unfolding to_nbaei_def by simp finally show ?thesis unfolding nbaei_nba_rel_def by simp qed end context begin interpretation autoref_syn by this lemma to_nbaei_impl_refine[autoref_rules]: fixes S :: "('statei \ 'state) set" assumes "SIDE_PRECOND (finite (nodes A))" assumes "SIDE_GEN_ALGO (is_bounded_hashcode S seq bhc)" assumes "SIDE_GEN_ALGO (is_valid_def_hm_size TYPE('statei) hms)" assumes "GEN_OP seq HOL.eq (S \ S \ bool_rel)" assumes "(Ai, A) \ \Id, S\ nbai_nba_rel" shows "(to_nbaei_impl seq bhc hms Ai, (OP to_nbaei ::: \Id, S\ nbai_nba_rel \ \Id_on (alphabet A), rel Ai A seq bhc hms\ nbaei_nba_rel) $ A) \ \Id_on (alphabet A), rel Ai A seq bhc hms\ nbaei_nba_rel" using to_nbaei_impl_refine' assms unfolding autoref_tag_defs by this end end \ No newline at end of file