Theory Function_Relators

✐‹creator "Kevin Kappelmann"›
subsection ‹Relators›
theory Function_Relators
  imports
    Binary_Relation_Functions
    Functions_Base
    Predicates_Lattice
    ML_Unification.ML_Unification_HOL_Setup
    ML_Unification.Unify_Resolve_Tactics
begin

paragraph ‹Summary›
text ‹Introduces the concept of function relators. The slogan of function
relators is "related functions map related inputs to related outputs".›

consts Dep_Fun_Rel :: "'a  'b  'c  'd  bool"
consts Fun_Rel :: "'a  'b  'c  'd  bool"

open_bundle Dep_Fun_Rel_syntax
begin
notation "Fun_Rel" (infixr  50)
syntax
  "_Dep_Fun_Rel_rel" :: "idt  idt  'a  'b  'c  'd  bool"
    ('(_/ _/ / _')  (_) [51, 51, 50, 50] 50)
  "_Dep_Fun_Rel_rel_if" :: "idt  idt  'a  bool  'b  'c  'd  bool"
    ('(_/ _/ / _/ |/ _')  (_) [51, 51, 50, 50, 50] 50)
  "_Dep_Fun_Rel_pred" :: "idt  'a  'b  'c  'd  bool"
    ('(_/ :/ _')  (_) [51, 50, 50] 50)
  "_Dep_Fun_Rel_pred_if" :: "idt  'a  bool  'b  'c  'd  bool"
    ('(_/ :/ _/ |/ _')  (_) [51, 50, 50, 50] 50)
end
syntax_consts
  "_Dep_Fun_Rel_rel" "_Dep_Fun_Rel_rel_if" "_Dep_Fun_Rel_pred" "_Dep_Fun_Rel_pred_if"  Dep_Fun_Rel
translations
  "(x y  R)  S"  "CONST Dep_Fun_Rel R (λx y. S)"
  "(x y  R | B)  S"  "CONST Dep_Fun_Rel R (λx y. CONST rel_if B S)"
  "(x : P)  R"  "CONST Dep_Fun_Rel P (λx. R)"
  "(x : P | B)  R"  "CONST Dep_Fun_Rel P (λx. CONST rel_if B R)"

definition "Dep_Fun_Rel_rel R S f g  x y. R x y  S x y (f x) (g y)"
adhoc_overloading Dep_Fun_Rel Dep_Fun_Rel_rel

definition "Fun_Rel_rel (R :: 'a  'b  bool) (S :: 'c  'd  bool) 
  ((_ _  R)  S) :: ('a  'c)  ('b  'd)  bool"
adhoc_overloading Fun_Rel Fun_Rel_rel

definition "Dep_Fun_Rel_pred P R f g  x. P x  R x (f x) (g x)"
adhoc_overloading Dep_Fun_Rel Dep_Fun_Rel_pred

definition "Fun_Rel_pred (P :: 'a  bool) (R :: 'b  'c  bool) 
  ((_ : P)  R) :: ('a  'b)  ('a  'c)  bool"
adhoc_overloading Fun_Rel Fun_Rel_pred

lemma Fun_Rel_rel_eq_Dep_Fun_Rel_rel:
  "((R :: 'a  'b  bool)  (S :: 'c  'd  bool)) = ((_ _  R)  S)"
  unfolding Fun_Rel_rel_def by simp

lemma Fun_Rel_rel_eq_Dep_Fun_Rel_rel_uhint [uhint]:
  assumes "R  R'"
  and "S'  (λ(_ :: 'a) (_ :: 'b). S)"
  shows "((R :: 'a  'b  bool)  (S :: 'c  'd  bool)) = ((x y  R')  S' x y)"
  using assms by (simp add: Fun_Rel_rel_eq_Dep_Fun_Rel_rel)

lemma Fun_Rel_rel_iff_Dep_Fun_Rel_rel:
  "((R :: 'a  'b  bool)  (S :: 'c  'd  bool)) f g  ((_ _  R)  S) f g"
  by (simp add: Fun_Rel_rel_eq_Dep_Fun_Rel_rel)

lemma Fun_Rel_pred_eq_Dep_Fun_Rel_pred:
  "((P :: 'a  bool)  (R :: 'b  'c  bool)) = ((_ : P)  R)"
  unfolding Fun_Rel_pred_def by simp

lemma Fun_Rel_pred_eq_Dep_Fun_Rel_pred_uhint [uhint]:
  assumes "P  P'"
  and "R'  (λ(_ :: 'a). R)"
  shows "((P :: 'a  bool)  (R :: 'b  'c  bool)) = ((x : P')  R' x)"
  using assms by (simp add: Fun_Rel_pred_eq_Dep_Fun_Rel_pred)

lemma Fun_Rel_pred_iff_Dep_Fun_Rel_pred:
  "((P :: 'a  bool)  (R :: 'b  'c  bool)) f g  ((_ : P)  R) (f :: 'a  'b) (g :: 'a  'c)"
  by (simp add: Fun_Rel_pred_eq_Dep_Fun_Rel_pred)

lemma Dep_Fun_Rel_relI [intro]:
  assumes "x y. R x y  S x y (f x) (g y)"
  shows "((x y  R)  S x y) f g"
  unfolding Dep_Fun_Rel_rel_def using assms by blast

lemma Dep_Fun_Rel_relD [dest]:
  assumes "((x y  R)  S x y) f g"
  and "R x y"
  shows "S x y (f x) (g y)"
  using assms unfolding Dep_Fun_Rel_rel_def by blast

lemma Dep_Fun_Rel_relE:
  assumes "((x y  R)  S x y) f g"
  obtains "x y. R x y  S x y (f x) (g y)"
  using assms unfolding Dep_Fun_Rel_rel_def by blast

lemma Dep_Fun_Rel_rel_cong [cong]:
  assumes "R = R'"
  and "x y. R' x y  S x y = S' x y"
  shows "((x y  R)  S x y) = ((x y  R')  S' x y)"
  using assms by force

lemma Fun_Rel_relI [intro]:
  assumes "x y. R x y  S (f x) (g y)"
  shows "(R  S) f g"
  using assms by (urule Dep_Fun_Rel_relI)

lemma Fun_Rel_relD [dest]:
  assumes "(R  S) f g"
  and "R x y"
  shows "S (f x) (g y)"
  using assms by (urule Dep_Fun_Rel_relD)

lemma Fun_Rel_relE:
  assumes "((x y  R)  S x y) f g"
  obtains "x y. R x y  S x y (f x) (g y)"
  using assms by (urule (e) Dep_Fun_Rel_relE)

lemma Dep_Fun_Rel_predI [intro]:
  assumes "x. P x  R x (f x) (g x)"
  shows "((x : P)  R x) f g"
  unfolding Dep_Fun_Rel_pred_def using assms by blast

lemma Dep_Fun_Rel_predD [dest]:
  assumes "((x : P)  R x) f g"
  and "P x"
  shows "R x (f x) (g x)"
  using assms unfolding Dep_Fun_Rel_pred_def by blast

lemma Dep_Fun_Rel_predE:
  assumes "((x : P)  R x) f g"
  obtains "x. P x  R x (f x) (g x)"
  using assms unfolding Dep_Fun_Rel_pred_def by blast

lemma Dep_Fun_Rel_pred_cong [cong]:
  assumes "P = P'"
  and "x. P' x  R x = R' x"
  shows "((x : P)  R x) = ((x : P')  R' x)"
  using assms by force

lemma Fun_Rel_predI [intro]:
  assumes "x. P x  R (f x) (g x)"
  shows "(P  R) f g"
  using assms by (urule Dep_Fun_Rel_predI)

lemma Fun_Rel_predD [dest]:
  assumes "(P  R) f g"
  and "P x"
  shows "R (f x) (g x)"
  using assms by (urule Dep_Fun_Rel_predD)

lemma Fun_Rel_predE:
  assumes "(P  R) f g"
  obtains "x. P x  R (f x) (g x)"
  using assms by (urule (e) Dep_Fun_Rel_predE)

lemma rel_inv_Dep_Fun_Rel_rel_eq [simp]:
  fixes R :: "'a  'b  bool" and S :: "'a  'b  'c  'd  bool"
  shows "((x y  R)  S x y)¯ = ((y x  R¯)  (S x y)¯)"
  by (intro ext) auto

lemma rel_inv_rel_inv_Dep_Fun_Rel_rel_iff_Dep_Fun_Rel_rel [iff]:
  "((x y  R¯)  (S x y)¯) f g  ((x y  R)  (S y x)) g f"
  by (simp flip: rel_inv_Dep_Fun_Rel_rel_eq)

lemma rel_inv_Dep_Fun_Rel_pred_eq [simp]:
  fixes P :: "'a  bool" and R :: "'a  'b  'c  bool"
  shows "((x : P)  R x)¯ = ((x : P)  (R x)¯)"
  by (intro ext) auto

lemma rel_inv_Dep_Fun_Rel_pred_iff_Dep_Fun_Rel_pred [iff]:
  "((x : P)  (R x)¯) f g  ((x : P)  (R x)) g f"
  by (simp flip: rel_inv_Dep_Fun_Rel_pred_eq)

lemma Dep_Fun_Rel_pred_eq_Dep_Fun_Rel_rel:
  fixes P :: "'a  bool" and R :: "'a  'b  'c  bool"
  shows "((x : P)  R x) = ((x (_ :: 'a)  (((⊓) P)  (=)))  R x)"
  by (intro ext) (auto intro!: Dep_Fun_Rel_predI Dep_Fun_Rel_relI)

lemma Fun_Rel_eq_eq_eq [simp]: "((=)  (=)) = (=)"
  by (intro ext) auto


paragraph ‹Composition›

lemma Dep_Fun_Rel_rel_compI:
  assumes "((x y  R)  S x y) f g"
  and "x y. R x y  ((x' y'  T x y)  U x y x' y') f' g'"
  and "x y. R x y  S x y (f x) (g y)  T x y (f x) (g y)"
  shows "((x y  R)  U x y (f x) (g y)) (f'  f) (g'  g)"
  using assms by (intro Dep_Fun_Rel_relI) (auto 6 0)

corollary Dep_Fun_Rel_rel_compI':
  assumes "((x y  R)  S x y) f g"
  and "x y. R x y  ((x' y'  S x y)  T x y x' y') f' g'"
  shows "((x y  R)  T x y (f x) (g y)) (f'  f) (g'  g)"
  using assms by (intro Dep_Fun_Rel_rel_compI)

lemma Dep_Fun_Rel_pred_comp_Dep_Fun_Rel_rel_compI:
  assumes "((x : P)  R x) f g"
  and "x. P x  ((x' y'  S x)  T x x' y') f' g'"
  and "x. P x  R x (f x) (g x)  S x (f x) (g x)"
  shows "((x : P)  T x (f x) (g x)) (f'  f) (g'  g)"
  using assms by (intro Dep_Fun_Rel_predI) (auto 6 0)

corollary Dep_Fun_Rel_pred_comp_Dep_Fun_Rel_rel_compI':
  assumes "((x : P)  R x) f g"
  and "x. P x  ((x' y'  R x)  S x x' y') f' g'"
  shows "((x : P)  S x (f x) (g x)) (f'  f) (g'  g)"
  using assms by (intro Dep_Fun_Rel_pred_comp_Dep_Fun_Rel_rel_compI)


paragraph ‹Restrictions›

lemma Dep_Fun_Rel_restrict_left_restrict_left_eq:
  assumes "f x y. Q f  R x y  P x y (f x)"
  shows "((x y  R)  (S x y)P x y)Q= ((x y  R)  S x y)Q⇙"
  using assms by (intro ext iffI rel_restrict_leftI Dep_Fun_Rel_relI)
  (auto dest!: Dep_Fun_Rel_relD)

lemma Dep_Fun_Rel_restrict_right_restrict_right_eq:
  assumes "f x y. Q f  R x y  P x y (f y)"
  shows "((x y  R)  (S x y)P x y)Q= (((x y  R)  S x y)Q)"
  unfolding rel_restrict_right_eq
  using assms
    Dep_Fun_Rel_restrict_left_restrict_left_eq[where ?R="R¯" and ?S="λy x. (S x y)¯"]
  by simp


end