Theory Stream_Op_Input5

theory Stream_Op_Input5
imports Stream_FreeAlg5
theory Stream_Op_Input5
imports Stream_FreeAlg5
begin

abbreviation "PLS5 ≡ \<oo>\<pp>5 o Abs_Σ5 o Inl o Abs_Σ4 o Inl o Abs_Σ3 o Inl o Abs_Σ2 o Inl o Abs_Σ1 o Inr :: 'a ΣΣ5 K1 => 'a ΣΣ5"
abbreviation "PRD5 ≡ \<oo>\<pp>5 o Abs_Σ5 o Inr :: 'a ΣΣ5 K5 => 'a ΣΣ5"

lemma PLS5_transfer[transfer_rule]:
  "(K1_rel (ΣΣ5_rel R) ===> ΣΣ5_rel R) PLS5 PLS5"
  by transfer_prover

lemma PRD5_transfer[transfer_rule]:
  "(K5_rel (ΣΣ5_rel R) ===> ΣΣ5_rel R) PRD5 PRD5"
  by transfer_prover

definition ρ5 :: "('a × 'a F) K5 => 'a ΣΣ5 F" where
  "ρ5 a_m_a'_b_n_b' =
    (let a_m_a' = fst a_m_a'_b_n_b' ; b_n_b' = snd a_m_a'_b_n_b' ;
      a = fst a_m_a' ; m = fst (snd a_m_a') ; a' = snd (snd a_m_a') ;
      b = fst b_n_b' ; n = fst (snd b_n_b') ; b' = snd (snd b_n_b')
    in (m * n, PRD5 (K5_as_ΣΣ5 (a,b'), PLS5 (leaf5 a', leaf5 b))))"

lemma ρ5_transfer[transfer_rule]:
  "(K5_rel (rel_prod R (F_rel R)) ===> F_rel (ΣΣ5_rel R)) ρ5 ρ5"
  unfolding Let_def ρ5_def[abs_def] rel_pre_J_def id_apply vimage2p_def BNF_Comp.id_bnf_comp_def
  by transfer_prover



end