Theory NU_Swap

(*<*)
theory NU_Swap
  imports Main
begin
(*>*)

section ‹Swappings of Pairs of Atoms›

fun swapa :: "(string × string)  string  string"
  where
  "swapa (b,c) a = (if b = a then c else (if c = a then b else a))"

fun swapas:: "(string × string) list  string  string"
  where
  "swapas []     a = a"
| "swapas (x#pi) a = swapa x (swapas pi a)"

lemma swapas_aa[simp]: 
  shows "swapas [(a,a)] b = b"
  by simp

lemma swapas_ab_ba:
  shows "swapas [(a,b)] = swapas [(b,a)]"
  by auto

lemma swapas_append: 
  shows "swapas (pi1@pi2) a = swapas pi1 (swapas pi2 a)"
  by (induct pi1) auto
 
lemma swapas_inv [simp]: 
  shows "swapas (rev pi) (swapas pi a) = a"
  by (induct_tac pi) (auto simp add: swapas_append)

lemma swapas_rev_pi_a: 
  assumes "swapas pi a = b"
  shows "swapas (rev pi) b = a"
using assms by auto

lemma swapas_rev_swapas_id [simp]: 
  shows "swapas pi (swapas (rev pi) a) = a"
  by (metis swapas_rev_pi_a)

lemma swapas_rev_pi_b: 
  assumes "swapas (rev pi) a = b"
  shows "swapas pi b = a"
using assms by auto

lemma swapas_comm: 
  shows "(swapas (pi@[(a,b)]) c) = (swapas ([(swapas pi a,swapas pi b)]@pi) c)"
  by (metis swapa.simps swapas.simps(1,2) swapas_append swapas_rev_pi_a)

(*<*)
end
(*>*)