Theory NU_Equ

(*<*)
theory NU_Equ
imports NU_PreEqu
begin
(*>*)

section ‹Equality›

text ‹
  Proves various facts about the equivalence relation.
›

lemma equ_refl: 
  shows "nabla  t  t"
  by(induct t, auto simp add: ds_def)


lemma equ_dec_pi:
  assumes "nabla  swap pi t1  swap pi t2"
  shows "nabla  t1  t2"
proof-
  have i: "nabla  swap (rev pi) (swap pi t1)  t1"
    "nabla  swap (rev pi) (swap pi t2)  t2"
    using rev_pi_pi_equ by auto
  then have "nabla  swap (rev pi) (swap pi t1)  swap (rev pi) (swap pi t2)"
    using equ_equivariance assms by simp
  then show ?thesis using i equ_symm equ_trans by meson 
qed

lemma equ_involutive_left: 
  shows "nabla  swap (rev pi) (swap pi t1)  t2 = nabla  t1  t2"
proof(auto)
  have i: "nabla  t1  swap (rev pi) (swap pi t1)"
    using rev_pi_pi_equ equ_symm by blast
  show "nabla  swap (rev pi) (swap pi t1)  t2  nabla  t1  t2"
    using i equ_trans by blast
  show "nabla  t1  t2  nabla  swap (rev pi) (swap pi t1)  t2"
    using i equ_trans equ_symm by blast
qed

lemma equ_pi_to_left: 
  shows "nabla  swap (rev pi) t1  t2 = nabla  t1  swap pi t2"
proof

  {assume i: "nabla  swap (rev pi) t1  t2"
  have "nabla  swap pi (swap (rev pi) t1)  swap pi t2"
    using equ_equivariance[OF i, of pi] by simp
  then show "nabla  t1  swap pi t2"
    using equ_involutive_left[of nabla rev pi t1 swap pi t2] rev_rev_ident[of pi]
    by simp}

  {assume i: "nabla  t1  swap pi t2"
  have ii: "nabla  swap (rev pi) t1  swap (rev pi) (swap pi t2)"
    using equ_equivariance[OF i, of rev pi] by simp
  then have iii: "nabla  swap (rev pi) (swap pi t2)  swap (rev pi) t1"
    using equ_symm[OF ii] by simp
  then have iv: "nabla  t2  swap (rev pi) t1"
    using equ_involutive_left[of nabla pi t2 swap (rev pi) t1] by simp
  then show "nabla  swap (rev pi) t1  t2"
    using equ_symm[OF iv] by simp}

qed
    
lemma equ_pi_to_right: 
  shows "nablat1  swap (rev pi) t2 = nablaswap pi t1t2"
proof
  {assume i: "nabla  t1  swap (rev pi) t2"
    then show "nabla  swap pi t1   t2"
      using equ_involutive_left equ_dec_pi by blast}
  {assume ii: "nabla  swap pi t1  t2"
    then show "nabla  t1  swap (rev pi) t2"
      using equ_involutive_left equ_equivariance by blast}
qed

lemma equ_involutive_right: 
  shows "nabla  t1  swap (rev pi) (swap pi t2) = nabla  t1  t2"
  using equ_dec_pi[of nabla pi t1 t2] equ_equivariance[of nabla t1 t2 pi] 
    equ_pi_to_right[of nabla t1 pi swap pi t2]
  by auto

lemma equ_pi1_pi2_add: 
  assumes "a ds pi1 pi2. nablaat"
  shows "nablaswap pi1 t  swap pi2 t"
proof-
  have "nabla  t  swap (rev pi1 @ pi2) t" 
    using assms ds_rev equ_pi_right by simp
  hence "nabla  t  swap (rev pi1) (swap pi2 t)"
    using swap_append by auto
  then show "nablaswap pi1 t  swap pi2 t"
    using equ_pi_to_right by simp
qed

lemma pi_right_equ: 
  assumes "nabla  t  swap pi t"
  shows "a ds [] pi. nabla  a  t"
  using assms pi_right_equ_help by blast

lemma equ_pi1_pi2_dec:  
  assumes "nabla  swap pi1 t  swap pi2 t"
  shows " a  ds pi1 pi2. nablaa  t"
proof-
  have "nabla  t  swap ((rev pi1) @ pi2) t"
    using assms equ_pi_to_right swap_append by simp
  then show " a  ds pi1 pi2. nablaa  t"
    using pi_right_equ ds_rev[of pi1 pi2] by simp
qed

lemma equ_weak: 
  assumes "nabla1  t1  t2"
  shows "(nabla1  nabla2)  t1  t2"
  using assms by (erule_tac equ.induct) (auto simp add: fresh_weak)

text ‹
  No term can be equal to one of its proper subterm.
›

lemma psub_trm_not_equ: 
  shows " t2  psub_trms t1. (¬( pi. (nabla  t1  swap pi t2)))"
proof
  fix t2
  assume i: "t2  psub_trms t1"
  show "¬ (pi. nabla  t1  swap pi t2)"
  proof
    assume "pi. nabla  t1  swap pi t2"
    then obtain pi where H:
      "nabla  t1  swap pi t2" by blast

    from equ_depth[OF H]
    have "depth t1 = depth (swap pi t2)"
      by simp
    hence "depth t1 = depth t2" 
      by simp
    moreover have "depth t2 < depth t1"
      using i depth_psub_trms 
      by simp

    ultimately show False by auto
  qed
qed


(*<*)
end 
(*>*)