Theory Z

(*
 * Title:      Z  
 * Author:     Bertram Felgenhauer (2016)
 * Author:     Julian Nagele (2016)
 * Author:     Vincent van Oostrom (2016)
 * Author:     Christian Sternagel (2016)
 * Maintainer: Bertram Felgenhauer <bertram.felgenhauer@uibk.ac.at>
 * Maintainer: Juilan Nagele <julian.nagele@uibk.ac.at>
 * Maintainer: Christian Sternagel <c.sternagel@gmail.com>
 * License:    BSD
 *)

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 "Rd = {(a, b). (a, b) ∈ R* ∧ (b, a∙) ∈ R*}"

end

locale angle_property =
  fixes bullet :: "'a ⇒ 'a" (‹_∙› [1000] 1000)
  and R :: "'a rel"
  and Rd :: "'a rel"
  assumes intermediate: "R ⊆ Rd" "Rd ⊆ R*"
  and angle: "(a, b) ∈ Rd ⟹ (b, a∙) ∈ Rd"

sublocale angle_property ⊆ z_property
proof
  fix a b
  assume "(a, b) ∈ R"
  with angle intermediate have "(b, a∙) ∈ Rd" and "(a∙, b∙) ∈ Rd" by auto
  then show "(b, a∙) ∈ R* ∧ (a∙, b∙) ∈ R*" using intermediate by auto
qed

sublocale z_property ⊆ angle_property bullet R "z_property.Rd bullet R"
proof
  show "R ⊆ Rd" and "Rd ⊆ R*" unfolding Rd_def using Z by auto
  fix a b
  assume "(a, b) ∈ Rd"
  then show "(b, a∙) ∈ Rd" using monotonicity unfolding Rd_def by auto
qed

end