Theory Focus_ex
theory Focus_ex
imports "HOLCF-Library.Stream"
begin
typedecl ('a, 'b) tc
axiomatization where tc_arity: "OFCLASS(('a::pcpo, 'b::pcpo) tc, pcop_class)"
instance tc :: (pcpo, pcpo) pcpo by (rule tc_arity)
axiomatization
Rf :: "('b stream * ('b,'c) tc stream * 'c stream * ('b,'c) tc stream) ⇒ bool"
definition
is_f :: "('b stream * ('b,'c) tc stream → 'c stream * ('b,'c) tc stream) ⇒ bool" where
"is_f f ⟷ (∀i1 i2 o1 o2. f⋅(i1, i2) = (o1, o2) ⟶ Rf (i1, i2, o1, o2))"
definition
is_net_g :: "('b stream * ('b,'c) tc stream → 'c stream * ('b,'c) tc stream) ⇒
'b stream ⇒ 'c stream ⇒ bool" where
"is_net_g f x y ≡ (∃z.
(y, z) = f⋅(x,z) ∧
(∀oy hz. (oy, hz) = f⋅(x, hz) ⟶ z << hz))"
definition
is_g :: "('b stream → 'c stream) ⇒ bool" where
"is_g g ≡ (∃f. is_f f ∧ (∀x y. g⋅x = y ⟶ is_net_g f x y))"
definition
def_g :: "('b stream → 'c stream) => bool" where
"def_g g ≡ (∃f. is_f f ∧ g = (LAM x. fst (f⋅(x, fix⋅(LAM k. snd (f⋅(x, k)))))))"
lemma lemma1:
"is_g g ⟷
(∃f. is_f(f) ∧ (∀x.(∃z. (g⋅x,z) = f⋅(x,z) ∧ (∀w y. (y, w) = f⋅(x, w) ⟶ z << w))))"
apply (simp add: is_g_def is_net_g_def)
apply fast
done
lemma lemma2:
"(∃f. is_f f ∧ (∀x. (∃z. (g⋅x, z) = f⋅(x, z) ∧ (∀w y. (y, w) = f⋅(x,w) ⟶ z << w)))) ⟷
(∃f. is_f f ∧ (∀x. ∃z.
g⋅x = fst (f⋅(x, z)) ∧
z = snd (f⋅(x, z)) ∧
(∀w y. (y, w) = f⋅(x, w) ⟶ z << w)))"
apply (rule iffI)
apply (erule exE)
apply (rule_tac x = "f" in exI)
apply (erule conjE)+
apply (erule conjI)
apply (intro strip)
apply (erule allE)
apply (erule exE)
apply (rule_tac x = "z" in exI)
apply (erule conjE)+
apply (rule conjI)
apply (rule_tac [2] conjI)
prefer 3 apply (assumption)
apply (drule sym)
apply (simp)
apply (drule sym)
apply (simp)
apply (erule exE)
apply (rule_tac x = "f" in exI)
apply (erule conjE)+
apply (erule conjI)
apply (intro strip)
apply (erule allE)
apply (erule exE)
apply (rule_tac x = "z" in exI)
apply (erule conjE)+
apply (rule conjI)
prefer 2 apply (assumption)
apply (rule prod_eqI)
apply simp
apply simp
done
lemma lemma3: "def_g g ⟶ is_g g"
apply (tactic ‹simp_tac (put_simpset HOL_ss \<^context>
addsimps [@{thm def_g_def}, @{thm lemma1}, @{thm lemma2}]) 1›)
apply (rule impI)
apply (erule exE)
apply (rule_tac x = "f" in exI)
apply (erule conjE)+
apply (erule conjI)
apply (intro strip)
apply (rule_tac x = "fix⋅(LAM k. snd (f⋅(x, k)))" in exI)
apply (rule conjI)
apply (simp)
apply (rule prod_eqI, simp, simp)
apply (rule trans)
apply (rule fix_eq)
apply (simp (no_asm))
apply (intro strip)
apply (rule fix_least)
apply (simp (no_asm))
apply (erule exE)
apply (drule sym)
back
apply simp
done
lemma lemma4: "is_g g ⟶ def_g g"
apply (tactic ‹simp_tac (put_simpset HOL_ss \<^context>
delsimps (@{thms HOL.ex_simps} @ @{thms HOL.all_simps})
addsimps [@{thm lemma1}, @{thm lemma2}, @{thm def_g_def}]) 1›)
apply (rule impI)
apply (erule exE)
apply (rule_tac x = "f" in exI)
apply (erule conjE)+
apply (erule conjI)
apply (rule cfun_eqI)
apply (erule_tac x = "x" in allE)
apply (erule exE)
apply (erule conjE)+
apply (subgoal_tac "fix⋅(LAM k. snd (f⋅(x, k))) = z")
apply simp
apply (subgoal_tac "∀w y. f⋅(x, w) = (y, w) ⟶ z << w")
apply (rule fix_eqI)
apply simp
apply (subgoal_tac "f⋅(x, za) = (fst (f⋅(x, za)), za)")
apply fast
apply (rule prod_eqI, simp, simp)
apply (intro strip)
apply (erule allE)+
apply (erule mp)
apply (erule sym)
done
lemma loopback_eq: "def_g = is_g"
apply (rule ext)
apply (rule iffI)
apply (erule lemma3 [THEN mp])
apply (erule lemma4 [THEN mp])
done
lemma L2:
"(∃f. is_f (f::'b stream * ('b,'c) tc stream → 'c stream * ('b,'c) tc stream)) ⟶
(∃g. def_g (g::'b stream → 'c stream))"
apply (simp add: def_g_def)
done
theorem conservative_loopback:
"(∃f. is_f (f::'b stream * ('b,'c) tc stream → 'c stream * ('b,'c) tc stream)) ⟶
(∃g. is_g (g::'b stream → 'c stream))"
apply (rule loopback_eq [THEN subst])
apply (rule L2)
done
end