Theory Phi_BI.Unital_Homo

theory Unital_Homo
  imports Algebras
begin

section ‹Unital Homomorphism›

typedef (overloaded) ('a::one,'b::one) unital_homo
    = Collect (homo_one :: ('a  'b)  bool)
  morphisms apply_unital_homo Unital_Homo
  by (rule exI[where x = λ_. 1]) (simp add:sep_mult_commute homo_one_def)

setup_lifting type_definition_unital_homo

lemmas unital_homo_inverse[simp] = Unital_Homo_inverse[simplified]

lemma apply_unital_homo_1[simp]: "apply_unital_homo I 1 = 1"
  using homo_one_def apply_unital_homo by blast

lemma unital_homo_eq_I[intro!]:
  apply_unital_homo x = apply_unital_homo y  x = y
  by (simp add: apply_unital_homo_inject)

lemma apply_unital_homo__homo_one:
  homo_one (apply_unital_homo x)
  by (simp add: homo_one_def)

lift_definition unital_homo_composition
    :: ('a::one,'b::one) unital_homo  ('c::one,'a) unital_homo  ('c,'b) unital_homo
    (infixl "UH" 55)
  is (o) :: ('a  'b)  ('c  'a)  ('c  'b)
  by (clarsimp simp add: homo_one_def)

notation unital_homo_composition (infixl "oUH" 55)

lemma apply_unital_homo_comp[simp]:
  apply_unital_homo (f UH g) = apply_unital_homo f o apply_unital_homo g
  by (transfer; clarsimp)


end