Theory Stream_Op_Input4

theory Stream_Op_Input4
imports Stream_FreeAlg4
theory Stream_Op_Input4
imports Stream_FreeAlg4
begin

abbreviation "PLS4 ≡ \<oo>\<pp>4 o Abs_Σ4 o Inl o Abs_Σ3 o Inl o Abs_Σ2 o Inl o Abs_Σ1 o Inr :: 'a ΣΣ4 K1 => 'a ΣΣ4"
abbreviation "PRD4 ≡ \<oo>\<pp>4 o Abs_Σ4 o Inl o Abs_Σ3 o Inl o Abs_Σ2 o Inr :: 'a ΣΣ4 K2 => 'a ΣΣ4"
abbreviation "EXP4 ≡ \<oo>\<pp>4 o Abs_Σ4 o Inl o Abs_Σ3 o Inr :: 'a ΣΣ4 K3 => 'a ΣΣ4"
abbreviation "SUP4 ≡ \<oo>\<pp>4 o Abs_Σ4 o Inr :: 'a ΣΣ4 K4 => 'a ΣΣ4"

lemma PLS4_transfer[transfer_rule]:
  "(K1_rel (ΣΣ4_rel R) ===> ΣΣ4_rel R) PLS4 PLS4"
  by transfer_prover

lemma PRD4_transfer[transfer_rule]:
  "(K2_rel (ΣΣ4_rel R) ===> ΣΣ4_rel R) PRD4 PRD4"
  by transfer_prover

lemma EXP4_transfer[transfer_rule]:
  "(K3_rel (ΣΣ4_rel R) ===> ΣΣ4_rel R) EXP4 EXP4"
  by transfer_prover

lemma SUP4_transfer[transfer_rule]:
  "(K4_rel (ΣΣ4_rel R) ===> ΣΣ4_rel R) SUP4 SUP4"
  by transfer_prover

definition fMax where
  "fMax F = (if F = {||} then 0 :: nat else Max (fset F))"

definition ρ4 :: "('a × 'a F) K4 => 'a ΣΣ4 F" where
  "ρ4 F = (fMax ((fst o snd) |`| F), K4_as_ΣΣ4 ((snd o snd) |`| F))"
 
lemma ρ4_transfer[transfer_rule]:
  "(K4_rel (rel_prod R (F_rel R)) ===> F_rel (ΣΣ4_rel R)) ρ4 ρ4"
  unfolding rel_pre_J_def id_apply vimage2p_def BNF_Comp.id_bnf_comp_def ρ4_def[abs_def]
  by transfer_prover

end