theory Pair_Automaton
imports TR.Tree_Automata_Complement UL.Basic_Utils GTT_Compose
begin
definition pair_at_lang :: "('q, 'f) gtt โ ('q ร 'q) fset โ 'f gterm rel" where
"pair_at_lang ๐ข Q = {(s, t) | s t p q. q |โ| gta_der (fst ๐ข) s โง p |โ| gta_der (snd ๐ข) t โง (q, p) |โ| Q}"
lemma pair_at_lang_restr_states:
"pair_at_lang ๐ข Q = pair_at_lang ๐ข (Q |โฉ| (๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)))"
by (auto simp: pair_at_lang_def gta_der_def) (meson gterm_ta_der_states)
lemma pair_at_langE:
assumes "(s, t) โ pair_at_lang ๐ข Q"
obtains q p where "(q, p) |โ| Q" and "q |โ| gta_der (fst ๐ข) s" and "p |โ| gta_der (snd ๐ข) t"
using assms by (auto simp: pair_at_lang_def)
lemma pair_at_langI:
assumes "q |โ| gta_der (fst ๐ข) s" "p |โ| gta_der (snd ๐ข) t" "(q, p) |โ| Q"
shows "(s, t) โ pair_at_lang ๐ข Q"
using assms by (auto simp: pair_at_lang_def)
lemma pair_at_lang_fun_states:
assumes "finj_on f (๐ฌ (fst ๐ข))" and "finj_on g (๐ฌ (snd ๐ข))"
and "Q |โ| ๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)"
shows "pair_at_lang ๐ข Q = pair_at_lang (map_prod (fmap_states_ta f) (fmap_states_ta g) ๐ข) (map_prod f g |`| Q)"
(is "?LS = ?RS")
proof
{fix s t assume "(s, t) โ ?LS"
then have "(s, t) โ ?RS" using ta_der_fmap_states_ta_mono[of f "fst ๐ข" s]
using ta_der_fmap_states_ta_mono[of g "snd ๐ข" t]
by (force simp: gta_der_def map_prod_def image_iff elim!: pair_at_langE split: prod.split intro!: pair_at_langI)}
then show "?LS โ ?RS" by auto
next
{fix s t assume "(s, t) โ ?RS"
then obtain p q where rs: "p |โ| ta_der (fst ๐ข) (term_of_gterm s)" "f p |โ| ta_der (fmap_states_ta f (fst ๐ข)) (term_of_gterm s)" and
ts: "q |โ| ta_der (snd ๐ข) (term_of_gterm t)" "g q |โ| ta_der (fmap_states_ta g (snd ๐ข)) (term_of_gterm t)" and
st: "(f p, g q) |โ| (map_prod f g |`| Q)" using assms ta_der_fmap_states_inv[of f "fst ๐ข" _ s]
using ta_der_fmap_states_inv[of g "snd ๐ข" _ t]
by (auto simp: gta_der_def adapt_vars_term_of_gterm elim!: pair_at_langE)
(metis (no_types, hide_lams) fimageE fmap_prod_fimageI ta_der_fmap_states_conv)
then have "p |โ| ๐ฌ (fst ๐ข)" "q |โ| ๐ฌ (snd ๐ข)" by auto
then have "(p, q) |โ| Q" using assms st unfolding fimage_iff fBex_def
by (auto dest!: fsubsetD simp: finj_on_eq_iff)
then have "(s, t) โ ?LS" using st rs(1) ts(1) by (auto simp: gta_der_def intro!: pair_at_langI)}
then show "?RS โ ?LS" by auto
qed
lemma converse_pair_at_lang:
"(pair_at_lang ๐ข Q)ยฏ = pair_at_lang (prod.swap ๐ข) (Q|ยฏ|)"
by (auto simp: pair_at_lang_def)
lemma pair_at_agtt:
"agtt_lang ๐ข = pair_at_lang ๐ข (fId_on (gtt_interface ๐ข))"
by (auto simp: agtt_lang_def gtt_interface_def pair_at_lang_def gtt_states_def gta_der_def fId_on_iff)
definition ฮ_eps_pair where
"ฮ_eps_pair ๐ขโฉ1 Qโฉ1 ๐ขโฉ2 Qโฉ2 โก Qโฉ1 |O| ฮโฉฮต (snd ๐ขโฉ1) (fst ๐ขโฉ2) |O| Qโฉ2"
lemma pair_comp_sound1:
assumes "(s, t) โ pair_at_lang ๐ขโฉ1 Qโฉ1"
and "(t, u) โ pair_at_lang ๐ขโฉ2 Qโฉ2"
shows "(s, u) โ pair_at_lang (fst ๐ขโฉ1, snd ๐ขโฉ2) (ฮ_eps_pair ๐ขโฉ1 Qโฉ1 ๐ขโฉ2 Qโฉ2)"
proof -
from pair_at_langE assms obtain p q q' r where
wit: "(p, q) |โ| Qโฉ1" "p |โ| gta_der (fst ๐ขโฉ1) s" "q |โ| gta_der (snd ๐ขโฉ1) t"
"(q', r) |โ| Qโฉ2" "q' |โ| gta_der (fst ๐ขโฉ2) t" "r |โ| gta_der (snd ๐ขโฉ2) u"
by metis
from wit(3, 5) have "(q, q') |โ| ฮโฉฮต (snd ๐ขโฉ1) (fst ๐ขโฉ2)"
by (auto simp: ฮโฉฮต_def' gta_der_def intro!: exI[of _ "term_of_gterm t"])
then have "(p, r) |โ| ฮ_eps_pair ๐ขโฉ1 Qโฉ1 ๐ขโฉ2 Qโฉ2" using wit(1, 4)
by (auto simp: ฮ_eps_pair_def)
then show ?thesis using wit(2, 6) unfolding pair_at_lang_def
by auto
qed
lemma pair_comp_sound2:
assumes "(s, u) โ pair_at_lang (fst ๐ขโฉ1, snd ๐ขโฉ2) (ฮ_eps_pair ๐ขโฉ1 Qโฉ1 ๐ขโฉ2 Qโฉ2)"
shows "โ t. (s, t) โ pair_at_lang ๐ขโฉ1 Qโฉ1 โง (t, u) โ pair_at_lang ๐ขโฉ2 Qโฉ2"
using assms unfolding pair_at_lang_def ฮ_eps_pair_def
by (auto simp: ฮโฉฮต_def' gta_der_def) (metis gterm_of_term_inv)
lemma pair_comp_sound:
"pair_at_lang ๐ขโฉ1 Qโฉ1 O pair_at_lang ๐ขโฉ2 Qโฉ2 = pair_at_lang (fst ๐ขโฉ1, snd ๐ขโฉ2) (ฮ_eps_pair ๐ขโฉ1 Qโฉ1 ๐ขโฉ2 Qโฉ2)"
by (auto simp: pair_comp_sound1 pair_comp_sound2 relcomp.simps)
inductive_set ฮ_Atrans_set :: "('q ร 'q) fset โ ('q, 'f) ta โ ('q, 'f) ta โ ('q ร 'q) set" for Q ๐ โฌ where
base [simp]: "(p, q) |โ| Q โน (p, q) โ ฮ_Atrans_set Q ๐ โฌ"
| step [intro]: "(p, q) โ ฮ_Atrans_set Q ๐ โฌ โน (q, r) |โ| ฮโฉฮต โฌ ๐ โน
(r, v) โ ฮ_Atrans_set Q ๐ โฌ โน (p, v) โ ฮ_Atrans_set Q ๐ โฌ"
lemma ฮ_Atrans_set_states:
"(p, q) โ ฮ_Atrans_set Q ๐ โฌ โน (p, q) โ fset ((fst |`| Q |โช| ๐ฌ ๐) |ร| (snd |`| Q |โช| ๐ฌ โฌ))"
by (induct rule: ฮ_Atrans_set.induct) (auto simp: fimage_iff fBex_def simp flip: fmember.rep_eq)
lemma finite_ฮ_Atrans_set: "finite (ฮ_Atrans_set Q ๐ โฌ)"
proof -
have "ฮ_Atrans_set Q ๐ โฌ โ fset ((fst |`| Q |โช| ๐ฌ ๐) |ร| (snd |`| Q |โช| ๐ฌ โฌ))"
using ฮ_Atrans_set_states by auto
from finite_subset[OF this] show ?thesis by simp
qed
context
includes fset.lifting
begin
lift_definition ฮ_Atrans :: "('q ร 'q) fset โ ('q, 'f) ta โ ('q, 'f) ta โ ('q ร 'q) fset" is ฮ_Atrans_set
by (simp add: finite_ฮ_Atrans_set)
lemmas ฮ_Atrans_base [simp] = ฮ_Atrans_set.base [Transfer.transferred]
lemmas ฮ_Atrans_step [intro] = ฮ_Atrans_set.step [Transfer.transferred]
lemmas ฮ_Atrans_cases = ฮ_Atrans_set.cases[Transfer.transferred]
lemmas ฮ_Atrans_induct [consumes 1, case_names base step] = ฮ_Atrans_set.induct[Transfer.transferred]
end
"ฮ_Atrans_gtt ๐ข Q โก ฮ_Atrans Q (fst ๐ข) (snd ๐ข)"">abbreviation "ฮ_Atrans_gtt ๐ข Q โก ฮ_Atrans Q (fst ๐ข) (snd ๐ข)"
lemma pair_trancl_sound1:
assumes "(s, t) โ (pair_at_lang ๐ข Q)โง+"
shows "โ q p. p |โ| gta_der (fst ๐ข) s โง q |โ| gta_der (snd ๐ข) t โง (p, q) |โ| ฮ_Atrans_gtt ๐ข Q"
using assms
proof (induct)
case (step t v)
obtain p q r r' where reach_t: "r |โ| gta_der (fst ๐ข) t" "q |โ| gta_der (snd ๐ข) t" and
reach: "p |โ| gta_der (fst ๐ข) s" "r' |โ| gta_der (snd ๐ข) v" and
st: "(p, q) |โ| ฮ_Atrans_gtt ๐ข Q" "(r, r') |โ| Q" using step(2, 3)
by (auto simp: pair_at_lang_def)
from reach_t have "(q, r) |โ| ฮโฉฮต (snd ๐ข) (fst ๐ข)"
by (auto simp: ฮโฉฮต_def' gta_der_def intro: ground_term_of_gterm)
then have "(p, r') |โ| ฮ_Atrans_gtt ๐ข Q" using st by auto
then show ?case using reach reach_t
by (auto simp: pair_at_lang_def gta_der_def ฮโฉฮต_def' intro: ground_term_of_gterm)
qed (auto simp: pair_at_lang_def intro: ฮ_Atrans_base)
lemma pair_trancl_sound2:
assumes "(p, q) |โ| ฮ_Atrans_gtt ๐ข Q"
and "p |โ| gta_der (fst ๐ข) s" "q |โ| gta_der (snd ๐ข) t"
shows "(s, t) โ (pair_at_lang ๐ข Q)โง+" using assms
proof (induct arbitrary: s t rule:ฮ_Atrans_induct)
case (step p q r v)
from step(2)[OF step(6)] step(5)[OF _ step(7)] step(3)
show ?case by (auto simp: gta_der_def ฮโฉฮต_def' intro!: ground_term_of_gterm)
(metis gterm_of_term_inv trancl_trans)
qed (auto simp: pair_at_lang_def)
lemma pair_trancl_sound:
"(pair_at_lang ๐ข Q)โง+ = pair_at_lang ๐ข (ฮ_Atrans_gtt ๐ข Q)"
by (auto simp: pair_trancl_sound2 dest: pair_trancl_sound1 elim: pair_at_langE intro: pair_at_langI)
"fst_pair_cl ๐ Q โก TA (rules ๐) (eps ๐ |โช| (fId_on (๐ฌ ๐) |O| Q))"">abbreviation "fst_pair_cl ๐ Q โก TA (rules ๐) (eps ๐ |โช| (fId_on (๐ฌ ๐) |O| Q))"
definition pair_at_to_agtt :: "('q, 'f) gtt โ ('q ร 'q) fset โ ('q, 'f) gtt" where
"pair_at_to_agtt ๐ข Q = (fst_pair_cl (fst ๐ข) Q , TA (rules (snd ๐ข)) (eps (snd ๐ข)))"
lemma fst_pair_cl_eps:
assumes "(p, q) |โ| (eps (fst_pair_cl ๐ Q))|โง+|"
and "๐ฌ ๐ |โฉ| snd |`| Q = {||}"
shows "(p, q) |โ| (eps ๐)|โง+| โจ (โ r. (p = r โจ (p, r) |โ| (eps ๐)|โง+|) โง (r, q) |โ| Q)" using assms
proof (induct rule: ftrancl_induct)
case (Step p q r)
then have y: "q |โ| ๐ฌ ๐" by (auto simp add: eps_trancl_statesD eps_statesD)
have [simp]: "(p, q) |โ| Q โน q |โ| snd |`| Q" for p q by (auto simp: fimage_iff) force
then show ?case using Step y
by auto (simp add: ftrancl_into_trancl)
qed auto
lemma fst_pair_cl_res_aux:
assumes "๐ฌ ๐ |โฉ| snd |`| Q = {||}"
and "q |โ| ta_der (fst_pair_cl ๐ Q) (term_of_gterm t)"
shows "โ p. p |โ| ta_der ๐ (term_of_gterm t) โง (q |โ| ๐ฌ ๐ โถ (p, q) |โ| Q) โง (q |โ| ๐ฌ ๐ โถ p = q)" using assms
proof (induct t arbitrary: q)
case (GFun f ts)
then obtain qs q' where rule: "TA_rule f qs q' |โ| rules ๐" "length qs = length ts" and
eps: "q' = q โจ (q', q) |โ| (eps (fst_pair_cl ๐ Q))|โง+|" and
reach: "โ i < length ts. qs ! i |โ| ta_der (fst_pair_cl ๐ Q) (term_of_gterm (ts ! i))"
by auto
{fix i assume ass: "i < length ts" then have st: "qs ! i |โ| ๐ฌ ๐" using rule
by (auto simp: rule_statesD)
then have "qs ! i |โ| snd |`| Q" using GFun(2) by auto
then have "qs ! i |โ| ta_der ๐ (term_of_gterm (ts ! i))" using reach st ass
using fst_pair_cl_eps[OF _ GFun(2)] GFun(1)[OF nth_mem[OF ass] GFun(2), of "qs ! i"]
by blast} note IH = this
show ?case
proof (cases "q' = q")
case True
then show ?thesis using rule reach IH
by (auto dest: rule_statesD intro!: exI[of _ q'] exI[of _ qs])
next
case False note nt_eq = this
then have eps: "(q', q) |โ| (eps (fst_pair_cl ๐ Q))|โง+|" using eps by simp
from fst_pair_cl_eps[OF this assms(1)] show ?thesis
using False rule IH
proof (cases "q |โ| ๐ฌ ๐")
case True
from fst_pair_cl_eps[OF eps assms(1)] obtain r where
"q' = r โจ (q', r) |โ| (eps ๐)|โง+|" "(r, q) |โ| Q" using True
by (auto simp: eps_trancl_statesD)
then show ?thesis using nt_eq rule IH True
by (auto simp: fimage_iff eps_trancl_statesD)
next
case False
from fst_pair_cl_eps[OF eps assms(1)] False assms(1)
have "(q', q) |โ| (eps ๐)|โง+|"
by (auto simp: fimage_iff) (metis fempty_iff fimage_eqI finterI snd_conv)+
then show ?thesis using IH rule
by (intro exI[of _ q]) (auto simp: eps_trancl_statesD)
qed
qed
qed
lemma restr_distjoing:
assumes "Q |โ| ๐ฌ ๐ |ร| ๐ฌ ๐
"
and "๐ฌ ๐ |โฉ| ๐ฌ ๐
= {||}"
shows "๐ฌ ๐ |โฉ| snd |`| Q = {||}"
using assms by auto
lemma pair_at_agtt_conv:
assumes "Q |โ| ๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)" and "๐ฌ (fst ๐ข) |โฉ| ๐ฌ (snd ๐ข) = {||}"
shows "pair_at_lang ๐ข Q = agtt_lang (pair_at_to_agtt ๐ข Q)" (is "?LS = ?RS")
proof
let ?TA = "fst_pair_cl (fst ๐ข) Q"
{fix s t assume ls: "(s, t) โ ?LS"
then obtain q p where w: "(q, p) |โ| Q" "q |โ| gta_der (fst ๐ข) s" "p |โ| gta_der (snd ๐ข) t"
by (auto elim: pair_at_langE)
from w(2) have "q |โ| gta_der ?TA s" "q |โ| ๐ฌ (fst ๐ข)"
using ta_der_mono'[of "fst ๐ข" ?TA "term_of_gterm s"]
by (auto simp add: fin_mono ta_subset_def gta_der_def in_mono)
then have "(s, t) โ ?RS" using w(1, 3)
by (auto simp: pair_at_to_agtt_def agtt_lang_def gta_der_def ta_der_eps intro!: exI[of _ p])
(metis fId_onI frelcompI funionI2 ta.sel(2) ta_der_eps)}
then show "?LS โ ?RS" by auto
next
{fix s t assume ls: "(s, t) โ ?RS"
then obtain q where w: "q |โ| ta_der (fst_pair_cl (fst ๐ข) Q) (term_of_gterm s)"
"q |โ| ta_der (snd ๐ข) (term_of_gterm t)"
by (auto simp: agtt_lang_def pair_at_to_agtt_def gta_der_def)
from w(2) have "q |โ| ๐ฌ (snd ๐ข)" "q |โ| ๐ฌ (fst ๐ข)" using assms(2)
by auto
from fst_pair_cl_res_aux[OF restr_distjoing[OF assms] w(1)] this w(2)
have "(s, t) โ ?LS" by (auto simp: agtt_lang_def pair_at_to_agtt_def gta_der_def intro: pair_at_langI)}
then show "?RS โ ?LS" by auto
qed
definition pair_at_to_agtt' where
"pair_at_to_agtt' ๐ข Q = (let ๐ = fmap_states_ta Inl (fst ๐ข) in
let โฌ = fmap_states_ta Inr (snd ๐ข) in
let Q' = Q |โฉ| (๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)) in
pair_at_to_agtt (๐, โฌ) (map_prod Inl Inr |`| Q'))"
lemma pair_at_agtt_cost:
"pair_at_lang ๐ข Q = agtt_lang (pair_at_to_agtt' ๐ข Q)"
proof -
let ?G = "(fmap_states_ta CInl (fst ๐ข), fmap_states_ta CInr (snd ๐ข))"
let ?Q = "(Q |โฉ| (๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)))"
let ?Q' = "map_prod CInl CInr |`| ?Q"
have *: "pair_at_lang ๐ข Q = pair_at_lang ๐ข ?Q"
using pair_at_lang_restr_states by blast
have "pair_at_lang ๐ข ?Q = pair_at_lang (map_prod (fmap_states_ta CInl) (fmap_states_ta CInr) ๐ข) (map_prod CInl CInr |`| ?Q)"
by (intro pair_at_lang_fun_states[where ?๐ข = ๐ข and ?Q = ?Q and ?f = CInl and ?g = CInr])
(auto simp: finj_CInl_CInr)
then have **:"pair_at_lang ๐ข ?Q = pair_at_lang ?G ?Q'" by (simp add: map_prod_simp')
have "pair_at_lang ?G ?Q' = agtt_lang (pair_at_to_agtt ?G ?Q')"
by (intro pair_at_agtt_conv[where ?๐ข = ?G]) auto
then show ?thesis unfolding * ** pair_at_to_agtt'_def Let_def
by simp
qed
lemma ฮ_Atrans_states_stable:
assumes "Q |โ| ๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)"
shows "ฮ_Atrans_gtt ๐ข Q |โ| ๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)"
proof
fix s assume ass: "s |โ| ฮ_Atrans_gtt ๐ข Q"
then obtain t u where s: "s = (t, u)" by (cases s) blast
show "s |โ| ๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)" using ass assms unfolding s
by (induct rule: ฮ_Atrans_induct) auto
qed
lemma ฮ_Atrans_map_prod:
assumes "finj_on f (๐ฌ (fst ๐ข))" and "finj_on g (๐ฌ (snd ๐ข))"
and "Q |โ| ๐ฌ (fst ๐ข) |ร| ๐ฌ (snd ๐ข)"
shows "map_prod f g |`| (ฮ_Atrans_gtt ๐ข Q) = ฮ_Atrans_gtt (map_prod (fmap_states_ta f) (fmap_states_ta g) ๐ข) (map_prod f g |`| Q)"
(is "?LS = ?RS")
proof -
{fix p q assume "(p, q) |โ| ฮ_Atrans_gtt ๐ข Q"
then have "(f p, g q) |โ| ?RS" using assms
proof (induct rule: ฮ_Atrans_induct)
case (step p q r v)
from step(3, 6, 7) have "(g q, f r) |โ| ฮโฉฮต (fmap_states_ta g (snd ๐ข)) (fmap_states_ta f (fst ๐ข))"
by (auto simp: ฮโฉฮต_def' intro!: ground_term_of_gterm)
(metis ground_term_of_gterm ground_term_to_gtermD ta_der_to_fmap_states_der)
then show ?case using step by auto
qed (auto simp add: fmap_prod_fimageI)}
moreover
{fix p q assume "(p, q) |โ| ?RS"
then have "(p, q) |โ| ?LS" using assms
proof (induct rule: ฮ_Atrans_induct)
case (step p q r v)
let ?f = "the_finv_into (๐ฌ (fst ๐ข)) f" let ?g = "the_finv_into (๐ฌ (snd ๐ข)) g"
have sub: "ฮโฉฮต (snd ๐ข) (fst ๐ข) |โ| ๐ฌ (snd ๐ข) |ร| ๐ฌ (fst ๐ข)"
using ฮโฉฮต_statesD(1, 2) by fastforce
have s_e: "(?f p, ?g q) |โ| ฮ_Atrans_gtt ๐ข Q" "(?f r, ?g v) |โ| ฮ_Atrans_gtt ๐ข Q"
using step assms(1, 2) fsubsetD[OF ฮ_Atrans_states_stable[OF assms(3)]]
using finj_on_eq_iff[OF assms(1)] finj_on_eq_iff
using the_finv_into_f_f[OF assms(1)] the_finv_into_f_f[OF assms(2)]
by auto
from step(3) have "(?g q, ?f r) |โ| ฮโฉฮต (snd ๐ข) (fst ๐ข)"
using step(6-) sub
using ta_der_fmap_states_conv[OF assms(1)] ta_der_fmap_states_conv[OF assms(2)]
using the_finv_into_f_f[OF assms(1)] the_finv_into_f_f[OF assms(2)]
by (auto simp: ฮโฉฮต_fmember fimage_iff fBex_def)
(metis ground_term_of_gterm ground_term_to_gtermD ta_der_fmap_states_inv)
then have "(q, r) |โ| map_prod g f |`| ฮโฉฮต (snd ๐ข) (fst ๐ข)" using step
using the_finv_into_f_f[OF assms(1)] the_finv_into_f_f[OF assms(2)] sub
by auto (smt ฮโฉฮต_statesD(1, 2) f_the_finv_into_f fmap_prod_fimageI fmap_states)
then show ?case using s_e assms(1, 2) s_e
using fsubsetD[OF sub]
using fsubsetD[OF ฮ_Atrans_states_stable[OF assms(3)]]
using ฮ_Atrans_step[of "?f p" "?g q" Q "fst ๐ข" "snd ๐ข" "?f r" "?g v"]
using the_finv_into_f_f[OF assms(1)] the_finv_into_f_f[OF assms(2)]
by (auto simp: fimage_iff fBex_def)
(smt Pair_inject prod_fun_fimageE step.hyps(2) step.hyps(5) step.prems(3))
qed auto}
ultimately show ?thesis by auto
qed
"Q_pow Q ๐ฎ_1 ๐ฎ_2 =">definition "Q_pow Q ๐ฎโฉ1 ๐ฎโฉ2 =
{|(X, Y) | X Y p q. X |โ| fPow ๐ฎโฉ1 โง Y |โ| fPow ๐ฎโฉ2 โง p |โ| X โง q |โ| Y โง (p, q) |โ| Q|}"
lemma Q_pow_fmember:
"(X, Y) |โ| Q_pow Q ๐ฎโฉ1 ๐ฎโฉ2 โท (โ p q. X |โ| fPow ๐ฎโฉ1 โง Y |โ| fPow ๐ฎโฉ2 โง p |โ| X โง q |โ| Y โง (p, q) |โ| Q)"
proof -
have "{(X, Y) | X Y p q. X |โ| fPow ๐ฎโฉ1 โง Y |โ| fPow ๐ฎโฉ2 โง p |โ| X โง q |โ| Y โง (p, q) |โ| Q} โ fset (fPow ๐ฎโฉ1 |ร| fPow ๐ฎโฉ2)"
by (auto simp flip: fmember.rep_eq)
from finite_subset[OF this] show ?thesis unfolding Q_pow_def
by auto
qed
lemma pair_automaton_det_lang_sound_complete:
"pair_at_lang ๐ข Q = pair_at_lang (map_both ps_ta ๐ข) (Q_pow Q (๐ฌ (fst ๐ข)) (๐ฌ (snd ๐ข)))" (is "?LS = ?RS")
proof -
{fix s t assume "(s, t) โ ?LS"
then obtain p q where
res : "p |โ| ta_der (fst ๐ข) (term_of_gterm s)"
"q |โ| ta_der (snd ๐ข) (term_of_gterm t)" "(p, q) |โ| Q"
by (auto simp: pair_at_lang_def gta_der_def)
from ps_rules_complete[OF this(1)] ps_rules_complete[OF this(2)] this(3)
have "(s, t) โ ?RS" using fPow_iff ps_ta_states
by (auto simp: pair_at_lang_def gta_der_def Q_pow_fmember)
force}
moreover
{fix s t assume "(s, t) โ ?RS" then have "(s, t) โ ?LS"
using ps_rules_sound
by (auto simp: pair_at_lang_def gta_der_def ps_ta_def Let_def Q_pow_def) blast}
ultimately show ?thesis by auto
qed
lemma pair_automaton_complement_sound_complete:
assumes "completely_defined_on ๐ โฑ" and "completely_defined_on โฌ โฑ"
and "ta_det ๐" and "ta_det โฌ"
shows "pair_at_lang (๐, โฌ) (๐ฌ ๐ |ร| ๐ฌ โฌ |-| Q) = gterms (fset โฑ) ร gterms (fset โฑ) - pair_at_lang (๐, โฌ) Q"
using assms unfolding completely_defined_on_def pair_at_lang_def
apply (auto simp: gta_der_def)
apply (metis ta_detE)
apply fastforce
done
end