Theory Binary_Relations_Bi_Unique
subsubsection ‹Bi-Unique›
theory Binary_Relations_Bi_Unique
  imports
    Binary_Relations_Injective
    Binary_Relations_Right_Unique
begin
definition "bi_unique_on ≡ right_unique_on ⊓ rel_injective_on"
lemma bi_unique_onI [intro]:
  assumes "right_unique_on P R"
  and "rel_injective_on P R"
  shows "bi_unique_on P R"
  unfolding bi_unique_on_def using assms by auto
lemma bi_unique_onE [elim]:
  assumes "bi_unique_on P R"
  obtains "right_unique_on P R" "rel_injective_on P R"
  using assms unfolding bi_unique_on_def by auto
lemma bi_unique_on_rel_inv_if_Fun_Rel_iff_if_bi_unique_on:
  assumes "bi_unique_on P R"
  and "(R ⇛ (⟷)) P Q"
  shows "bi_unique_on Q R¯"
  using assms by (intro bi_unique_onI
    rel_injective_on_if_Fun_Rel_imp_if_rel_injective_at
    right_unique_on_if_Fun_Rel_imp_if_right_unique_at)
  (auto 0 3)
definition "bi_unique ≡ bi_unique_on (⊤ :: 'a ⇒ bool) :: ('a ⇒ 'b ⇒ bool) ⇒ bool"
lemma bi_unique_eq_bi_unique_on:
  "bi_unique = (bi_unique_on (⊤ :: 'a ⇒ bool) :: ('a ⇒ 'b ⇒ bool) ⇒ bool)"
  unfolding bi_unique_def ..
lemma bi_unique_eq_bi_unique_on_uhint [uhint]:
  assumes "P ≡ (⊤ :: 'a ⇒ bool)"
  shows "bi_unique ≡ (bi_unique_on P :: ('a ⇒ 'b ⇒ bool) ⇒ bool)"
  using assms by (simp add: bi_unique_eq_bi_unique_on)
lemma bi_uniqueI [intro]:
  assumes "right_unique R"
  and "rel_injective R"
  shows "bi_unique R"
  using assms by (urule bi_unique_onI)
lemma bi_uniqueE [elim]:
  assumes "bi_unique R"
  obtains "right_unique R" "rel_injective R"
  using assms by (urule (e) bi_unique_onE)
end