Theory HOL_Alignment_Binary_Relations
subsection ‹Alignment With Binary Relation Definitions from HOL.Main›
theory HOL_Alignment_Binary_Relations
  imports
    Main
    HOL_Mem_Of
    LBinary_Relations
begin
unbundle no relcomp_syntax and no converse_syntax
named_theorems HOL_bin_rel_alignment
paragraph ‹Properties›
subparagraph ‹Antisymmetric›
overloading
  antisymmetric_on_set ≡ "antisymmetric_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "antisymmetric_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ _ ≡
    antisymmetric_on (mem_of S)"
end
lemma antisymmetric_on_set_eq_antisymmetric_on_pred [simp]:
  "(antisymmetric_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = antisymmetric_on (mem_of S)"
  unfolding antisymmetric_on_set_def by simp
lemma antisymmetric_on_set_eq_antisymmetric_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "antisymmetric_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ antisymmetric_on P"
  using assms by simp
lemma antisymmetric_on_set_iff_antisymmetric_on_pred [iff]:
  "antisymmetric_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ antisymmetric_on (mem_of S) R"
  by simp
lemma antisymp_on_eq_antisymmetric_on [HOL_bin_rel_alignment]:
  "antisymp_on = antisymmetric_on"
  by (intro ext) (auto intro: antisymp_onI dest: antisymmetric_onD antisymp_onD)
lemma antisymp_eq_antisymmetric [HOL_bin_rel_alignment]:
  "antisymp = antisymmetric"
  by (intro ext) (auto intro: antisympI dest: antisymmetricD antisympD)
subparagraph ‹Asymmetric›
overloading
  asymmetric_on_set ≡ "asymmetric_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "asymmetric_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ _ ≡ asymmetric_on (mem_of S)"
end
lemma asymmetric_on_set_eq_asymmetric_on_pred [simp]:
  "(asymmetric_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = asymmetric_on (mem_of S)"
  unfolding asymmetric_on_set_def by simp
lemma asymmetric_on_set_eq_asymmetric_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "asymmetric_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ asymmetric_on P"
  using assms by simp
lemma asymmetric_on_set_iff_asymmetric_on_pred [iff]:
  "asymmetric_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ asymmetric_on (mem_of S) R"
  by simp
lemma asymp_on_eq_asymmetric_on [HOL_bin_rel_alignment]: "asymp_on = asymmetric_on"
  by (intro ext) (auto dest: asymp_onD)
lemma asymp_eq_asymmetric [HOL_bin_rel_alignment]: "asymp = asymmetric"
  by (intro ext) (auto dest: asympD)
subparagraph ‹Injective›
overloading
  rel_injective_on_set ≡ "rel_injective_on :: 'a set ⇒ ('a ⇒ 'b ⇒ bool) ⇒ bool"
  rel_injective_at_set ≡ "rel_injective_at :: 'a set ⇒ ('b ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "rel_injective_on_set (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ _ ≡
    rel_injective_on (mem_of S)"
  definition "rel_injective_at_set (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ _ ≡
    rel_injective_at (mem_of S)"
end
lemma rel_injective_on_set_eq_rel_injective_on_pred [simp]:
  "(rel_injective_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool) =
    rel_injective_on (mem_of S)"
  unfolding rel_injective_on_set_def by simp
lemma rel_injective_on_set_eq_rel_injective_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "rel_injective_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool ≡ rel_injective_on P"
  using assms by simp
lemma rel_injective_on_set_iff_rel_injective_on_pred [iff]:
  "rel_injective_on (S :: 'a set) (R :: 'a ⇒ 'b ⇒ bool) ⟷ rel_injective_on (mem_of S) R"
  by simp
lemma rel_injective_at_set_eq_rel_injective_at_pred [simp]:
  "(rel_injective_at (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ bool) =
    rel_injective_at (mem_of S)"
  unfolding rel_injective_at_set_def by simp
lemma rel_injective_at_set_eq_rel_injective_at_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "rel_injective_at (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ bool ≡ rel_injective_at P"
  using assms by simp
lemma rel_injective_at_set_iff_rel_injective_at_pred [iff]:
  "rel_injective_at (S :: 'a set) (R :: 'b ⇒ 'a ⇒ bool) ⟷ rel_injective_at (mem_of S) R"
  by simp
lemma left_unique_eq_rel_injective [HOL_bin_rel_alignment]:
  "left_unique = rel_injective"
  by (intro ext) (blast intro: left_uniqueI dest: rel_injectiveD left_uniqueD)
subparagraph ‹Irreflexive›
overloading
  irreflexive_on_set ≡ "irreflexive_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "irreflexive_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡
    irreflexive_on (mem_of S)"
end
lemma irreflexive_on_set_eq_irreflexive_on_pred [simp]:
  "(irreflexive_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) =
    irreflexive_on (mem_of S)"
  unfolding irreflexive_on_set_def by simp
lemma irreflexive_on_set_eq_irreflexive_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "irreflexive_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ irreflexive_on P"
  using assms by simp
lemma irreflexive_on_set_iff_irreflexive_on_pred [iff]:
  "irreflexive_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ irreflexive_on (mem_of S) R"
  by simp
lemma irreflp_on_eq_irreflexive_on [HOL_bin_rel_alignment]: "irreflp_on = irreflexive_on"
  by (intro ext) (blast intro: irreflp_onI dest: irreflp_onD)
lemma irreflp_eq_irreflexive [HOL_bin_rel_alignment]: "irreflp = irreflexive"
  by (intro ext) (blast intro: irreflpI dest: irreflexiveD irreflpD)
subparagraph ‹Left-Total›
overloading
  left_total_on_set ≡ "left_total_on :: 'a set ⇒ ('a ⇒ 'b ⇒ bool) ⇒ bool"
begin
  definition "left_total_on_set (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ _ ≡
    left_total_on (mem_of S)"
end
lemma left_total_on_set_eq_left_total_on_pred [simp]:
  "(left_total_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool) =
    left_total_on (mem_of S)"
  unfolding left_total_on_set_def by simp
lemma left_total_on_set_eq_left_total_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "left_total_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool ≡ left_total_on P"
  using assms by simp
lemma left_total_on_set_iff_left_total_on_pred [iff]:
  "left_total_on (S :: 'a set) (R :: 'a ⇒ 'b ⇒ bool) ⟷ left_total_on (mem_of S) R"
  by simp
lemma Transfer_left_total_eq_left_total [HOL_bin_rel_alignment]:
  "Transfer.left_total = Binary_Relations_Left_Total.left_total"
  by (intro ext) (fast intro: Transfer.left_totalI
    elim: Transfer.left_totalE Binary_Relations_Left_Total.left_totalE)
subparagraph ‹Reflexive›
overloading
  reflexive_on_set ≡ "reflexive_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "reflexive_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ _ ≡
    reflexive_on (mem_of S)"
end
lemma reflexive_on_set_eq_reflexive_on_pred [simp]:
  "(reflexive_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = reflexive_on (mem_of S)"
  unfolding reflexive_on_set_def by simp
lemma reflexive_on_set_eq_reflexive_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "reflexive_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ reflexive_on P"
  using assms by simp
lemma reflexive_on_set_iff_reflexive_on_pred [iff]:
  "reflexive_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ reflexive_on (mem_of S) R"
  by simp
lemma reflp_on_eq_reflexive_on [HOL_bin_rel_alignment]:
  "reflp_on = reflexive_on"
  by (intro ext) (blast intro: reflp_onI dest: reflp_onD)
lemma reflp_eq_reflexive [HOL_bin_rel_alignment]: "reflp = reflexive"
  by (intro ext) (blast intro: reflpI dest: reflexiveD reflpD)
subparagraph ‹Right-Unique›
overloading
  right_unique_on_set ≡ "right_unique_on :: 'a set ⇒ ('a ⇒ 'b ⇒ bool) ⇒ bool"
  right_unique_at_set ≡ "right_unique_at :: 'a set ⇒ ('b ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "right_unique_on_set (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ _ ≡
    right_unique_on (mem_of S)"
  definition "right_unique_at_set (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ _ ≡
    right_unique_at (mem_of S)"
end
lemma right_unique_on_set_eq_right_unique_on_pred [simp]:
  "(right_unique_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool) = right_unique_on (mem_of S)"
  unfolding right_unique_on_set_def by simp
lemma right_unique_on_set_eq_right_unique_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "right_unique_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool ≡ right_unique_on P"
  using assms by simp
lemma right_unique_on_set_iff_right_unique_on_pred [iff]:
  "right_unique_on (S :: 'a set) (R :: 'a ⇒ 'b ⇒ bool) ⟷ right_unique_on (mem_of S) R"
  by simp
lemma right_unique_at_set_eq_right_unique_at_pred [simp]:
  "(right_unique_at (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ bool) =
    right_unique_at (mem_of S)"
  unfolding right_unique_at_set_def by simp
lemma right_unique_at_set_iff_right_unique_at_pred [iff]:
  "right_unique_at (S :: 'a set) (R :: 'b ⇒ 'a ⇒ bool) ⟷ right_unique_at (mem_of S) R"
  by simp
lemma Transfer_right_unique_eq_right_unique [HOL_bin_rel_alignment]:
  "Transfer.right_unique = Binary_Relations_Right_Unique.right_unique"
  by (intro ext) (blast intro: Transfer.right_uniqueI
    dest: Transfer.right_uniqueD Binary_Relations_Right_Unique.right_uniqueD)
subparagraph ‹Surjective›
overloading
  rel_surjective_at_set ≡ "rel_surjective_at :: 'a set ⇒ ('b ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "rel_surjective_at_set (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ _ ≡
    rel_surjective_at (mem_of S)"
end
lemma rel_surjective_at_set_eq_rel_surjective_at_pred [simp]:
  "(rel_surjective_at (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ bool) = rel_surjective_at (mem_of S)"
  unfolding rel_surjective_at_set_def by simp
lemma rel_surjective_at_set_eq_rel_surjective_at_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "rel_surjective_at (S :: 'a set) :: ('b ⇒ 'a ⇒ bool) ⇒ bool ≡ rel_surjective_at P"
  using assms by simp
lemma rel_surjective_at_set_iff_rel_surjective_at_pred [iff]:
  "rel_surjective_at (S :: 'a set) (R :: 'b ⇒ 'a ⇒ bool) ⟷ rel_surjective_at (mem_of S) R"
  by simp
lemma Transfer_right_total_eq_rel_surjective [HOL_bin_rel_alignment]:
  "Transfer.right_total = rel_surjective"
  by (intro ext) (fast intro: Transfer.right_totalI rel_surjectiveI
    elim: Transfer.right_totalE rel_surjectiveE)
subparagraph ‹Symmetric›
overloading
  symmetric_on_set ≡ "symmetric_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "symmetric_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ _ ≡
    symmetric_on (mem_of S)"
end
lemma symmetric_on_set_eq_symmetric_on_pred [simp]:
  "(symmetric_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = symmetric_on (mem_of S)"
  unfolding symmetric_on_set_def by simp
lemma symmetric_on_set_eq_symmetric_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "symmetric_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ symmetric_on P"
  using assms by simp
lemma symmetric_on_set_iff_symmetric_on_pred [iff]:
  "symmetric_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ symmetric_on (mem_of S) R"
  by simp
lemma symp_on_eq_symmetric_on [HOL_bin_rel_alignment]: "symp_on = symmetric_on"
  by (intro ext) (blast intro: symp_onI dest: symmetric_onD symp_onD)
lemma symp_eq_symmetric [HOL_bin_rel_alignment]: "symp = symmetric"
  by (intro ext) (blast intro: sympI dest: symmetricD sympD)
subparagraph ‹Transitive›
overloading
  transitive_on_set ≡ "transitive_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "transitive_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ _ ≡
    transitive_on (mem_of S)"
end
lemma transitive_on_set_eq_transitive_on_pred [simp]:
  "(transitive_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = transitive_on (mem_of S)"
  unfolding transitive_on_set_def by simp
lemma transitive_on_set_eq_transitive_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "transitive_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ transitive_on P"
  using assms by simp
lemma transitive_on_set_iff_transitive_on_pred [iff]:
  "transitive_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ transitive_on (mem_of S) R"
  by simp
lemma transp_on_eq_transitive_on [HOL_bin_rel_alignment]: "transp_on = transitive_on"
  by (intro ext) (blast intro: transp_onI dest: transp_onD transitive_onD)
lemma transp_eq_transitive [HOL_bin_rel_alignment]: "transp = transitive"
  by (intro ext) (blast intro: transpI dest: transpD)
subparagraph ‹Well-Founded›
overloading
  wellfounded_on_set ≡ "wellfounded_on :: 'a set ⇒ ('a ⇒ 'a ⇒ bool) ⇒ bool"
begin
  definition "wellfounded_on_set (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ _ ≡ wellfounded_on (mem_of S)"
end
lemma wellfounded_on_set_eq_wellfounded_on_pred [simp]:
  "(wellfounded_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool) = wellfounded_on (mem_of S)"
  unfolding wellfounded_on_set_def by simp
lemma wellfounded_on_set_eq_wellfounded_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "wellfounded_on (S :: 'a set) :: ('a ⇒ 'a ⇒ bool) ⇒ bool ≡ wellfounded_on P"
  using assms by simp
lemma wellfounded_on_set_iff_wellfounded_on_pred [iff]:
  "wellfounded_on (S :: 'a set) (R :: 'a ⇒ 'a ⇒ bool) ⟷ wellfounded_on (mem_of S) R"
  by simp
lemma wfp_on_eq_wellfounded_on [HOL_bin_rel_alignment]: "wfp_on = wellfounded_on"
proof (urule (rr) ext iffI wellfounded_onI)
  fix A R Q x assume "wfp_on A R" and hyps: "mem_of A x" "Q x"
  then show "∃m : mem_of A. Q m ∧ (∀y : mem_of A. R y m ⟶ ¬ Q y)"
  by (induction rule: wfp_on_induct) (use hyps in auto)
next
  fix A :: "'a set" and R :: "'a ⇒ 'a ⇒ bool" assume wf: "wellfounded_on A R"
  {
    fix P x assume hyps: "x ∈ A" "∀x ∈ A. (∀y ∈ A. R y x ⟶ P y) ⟶ P x"
    with wf have "P x"
    unfolding wellfounded_on_set_iff_wellfounded_on_pred
    by (induction rule: wellfounded_on_induct) (use hyps in blast)+
  }
  then show "wfp_on A R" unfolding wfp_on_def by blast
qed
lemma wfp_eq_wellfounded [HOL_bin_rel_alignment]: "wfp = wellfounded"
  by (urule fun_cong[OF wfp_on_eq_wellfounded_on])
subparagraph ‹Bi-Total›
lemma bi_total_on_set_eq_bi_total_on_pred [simp]:
  "(bi_total_on (S :: 'a set) (T :: 'b set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool) =
    bi_total_on (mem_of S) (mem_of T)"
  by auto
lemma bi_total_on_set_eq_bi_total_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  and "Q ≡ mem_of T"
  shows "bi_total_on (S :: 'a set) (T :: 'b set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool ≡ bi_total_on P Q"
  using assms by simp
lemma bi_total_on_set_iff_bi_total_on_pred [iff]:
  "bi_total_on (S :: 'a set) (T :: 'b set) (R :: 'a ⇒ 'b ⇒ bool) ⟷
    bi_total_on (mem_of S) (mem_of T) R"
  by simp
lemma Transfer_bi_total_eq_bi_total [HOL_bin_rel_alignment]:
  "Transfer.bi_total = Binary_Relations_Bi_Total.bi_total"
  unfolding bi_total_alt_def by (auto simp add: HOL_bin_rel_alignment)
subparagraph ‹Bi-Unique›
lemma bi_unique_on_set_eq_bi_unique_on_pred [simp]:
  "(bi_unique_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool) = bi_unique_on (mem_of S)"
  by auto
lemma bi_unique_on_set_eq_bi_unique_on_pred_uhint [uhint]:
  assumes "P ≡ mem_of S"
  shows "bi_unique_on (S :: 'a set) :: ('a ⇒ 'b ⇒ bool) ⇒ bool ≡ bi_unique_on P"
  using assms by simp
lemma bi_unique_on_set_iff_bi_unique_on_pred [iff]:
  "bi_unique_on (S :: 'a set) (R :: 'a ⇒ 'b ⇒ bool) ⟷ bi_unique_on (mem_of S) R"
  by simp
lemma Transfer_bi_unique_eq_bi_unique [HOL_bin_rel_alignment]:
  "Transfer.bi_unique = Binary_Relations_Bi_Unique.bi_unique"
  unfolding bi_unique_alt_def by (auto simp add: HOL_bin_rel_alignment)
paragraph ‹Functions›
lemma Domainp_eq_in_dom [HOL_bin_rel_alignment]: "Domainp = in_dom"
  by (intro ext) auto
lemma Rangep_eq_in_codom [HOL_bin_rel_alignment]: "Rangep = in_codom"
   by (intro ext) auto
lemma relcompp_eq_rel_comp [HOL_bin_rel_alignment]: "relcompp = rel_comp"
  by (intro ext) auto
lemma conversep_eq_rel_inv [HOL_bin_rel_alignment]: "conversep = rel_inv"
  by (intro ext) auto
lemma eq_onp_eq_eq_restrict [HOL_bin_rel_alignment]: "eq_onp = rel_restrict_left (=)"
  unfolding eq_onp_def by (intro ext) auto
definition "rel_restrict_left_set (R :: 'a ⇒ 'b ⇒ bool) (S :: 'a set) ≡ R↾⇘mem_of S⇙"
adhoc_overloading rel_restrict_left ⇌ rel_restrict_left_set
definition "rel_restrict_right_set (R :: 'a ⇒ 'b ⇒ bool) (S :: 'b set) ≡ R↿⇘mem_of S⇙"
adhoc_overloading rel_restrict_right ⇌ rel_restrict_right_set
definition "rel_restrict_set (R :: 'a ⇒ 'a ⇒ bool) (S :: 'a set) ≡ R↑⇘mem_of S⇙"
adhoc_overloading rel_restrict ⇌ rel_restrict_set
lemma rel_restrict_left_set_eq_restrict_left_pred [simp]:
  "R↾⇘S⇙ = R↾⇘mem_of S⇙"
  unfolding rel_restrict_left_set_def by simp
lemma rel_restrict_left_set_eq_restrict_left_pred_uhint [uhint]:
  assumes "R ≡ R'"
  and "P ≡ mem_of S"
  shows "R↾⇘S⇙ ≡ R'↾⇘P⇙"
  using assms by simp
lemma rel_restrict_left_set_iff_restrict_left_pred [iff]: "R↾⇘S⇙ x y ⟷ R↾⇘mem_of S⇙ x y"
  by simp
lemma rel_restrict_right_set_eq_restrict_right_pred [simp]:
  "R↿⇘S⇙ = R↿⇘mem_of S⇙"
  unfolding rel_restrict_right_set_def by simp
lemma rel_restrict_right_set_eq_restrict_right_pred_uhint [uhint]:
  assumes "R ≡ R'"
  and "P ≡ mem_of S"
  shows "R↿⇘S⇙ ≡ R'↿⇘P⇙"
  using assms by simp
lemma rel_restrict_right_set_iff_restrict_right_pred [iff]: "R↿⇘S⇙ x y ⟷ R↿⇘mem_of S⇙ x y"
  by simp
lemma rel_restrict_set_eq_restrict_pred [simp]:
  "R↑⇘S⇙ = R↑⇘mem_of S⇙"
  unfolding rel_restrict_set_def by simp
lemma rel_restrict_set_eq_restrict_pred_uhint [uhint]:
  assumes "R ≡ R'"
  and "P ≡ mem_of S"
  shows "R↑⇘S⇙ ≡ R'↑⇘P⇙"
  using assms by simp
lemma rel_restrict_set_iff_restrict_pred [iff]: "R↑⇘S⇙ x y ⟷ R↑⇘mem_of S⇙ x y"
  by simp
end