Theory Z
section ‹The Z property›
theory Z
imports "Abstract-Rewriting.Abstract_Rewriting"
begin
locale z_property =
  fixes bullet :: "'a ⇒ 'a" (‹_⇧∙› [1000] 1000)
  and R :: "'a rel"
  assumes Z: "(a, b) ∈ R ⟹ (b, a⇧∙) ∈ R⇧* ∧ (a⇧∙, b⇧∙) ∈ R⇧*"
begin
lemma monotonicity:
  assumes "(a, b) ∈ R⇧*"
  shows "(a⇧∙, b⇧∙) ∈ R⇧*"
using assms
by (induct) (auto dest: Z)
lemma semi_confluence:
  shows "(R¯ O R⇧*) ⊆ R⇧↓"
proof (intro subrelI, elim relcompEpair, drule converseD)
  fix d a c
  assume "(a, c) ∈ R⇧*" and "(a, d) ∈ R"
  then show "(d, c) ∈ R⇧↓"
  proof (cases)
    case (step b)
    then have "(a⇧∙, b⇧∙) ∈ R⇧*" by (auto simp: monotonicity)
    then have "(d, b⇧∙) ∈ R⇧*" using ‹(a, d) ∈ R› by (auto dest: Z)
    then show ?thesis using ‹(b, c) ∈ R› by (auto dest: Z)
  qed auto
qed
lemma CR: "CR R"
by (intro semi_confluence_imp_CR semi_confluence)
definition "R⇩d = {(a, b). (a, b) ∈ R⇧* ∧ (b, a⇧∙) ∈ R⇧*}"
end
locale angle_property =
  fixes bullet :: "'a ⇒ 'a" (‹_⇧∙› [1000] 1000)
  and R :: "'a rel"
  and R⇩d :: "'a rel"
  assumes intermediate: "R ⊆ R⇩d" "R⇩d ⊆ R⇧*"
  and angle: "(a, b) ∈ R⇩d ⟹ (b, a⇧∙) ∈ R⇩d"
sublocale angle_property ⊆ z_property
proof
  fix a b
  assume "(a, b) ∈ R"
  with angle intermediate have "(b, a⇧∙) ∈ R⇩d" and "(a⇧∙, b⇧∙) ∈ R⇩d" by auto
  then show "(b, a⇧∙) ∈ R⇧* ∧ (a⇧∙, b⇧∙) ∈ R⇧*" using intermediate by auto
qed
sublocale z_property ⊆ angle_property bullet R "z_property.R⇩d bullet R"
proof
  show "R ⊆ R⇩d" and "R⇩d ⊆ R⇧*" unfolding R⇩d_def using Z by auto
  fix a b
  assume "(a, b) ∈ R⇩d"
  then show "(b, a⇧∙) ∈ R⇩d" using monotonicity unfolding R⇩d_def by auto
qed
end