Theory NU_Atoms

(*<*)
theory NU_Atoms 
imports NU_Terms
begin
(*>*)

section ‹Facts about Atoms Occurring in Swappings›

fun atms :: "(string × string) list  string set" where
"atms [] = {}" | 
"atms (x#xs) = ((atms xs)   {fst(x),snd(x)})"

lemma atms_append[simp]: 
  shows "atms (xs@ys) = atms xs  atms ys"
  by (induct xs) auto

lemma atms_rev[simp]: 
  shows "atms (rev pi) = atms pi"
  by (induct pi) auto

lemma a_not_in_atms: 
  assumes "a  atms pi"
  shows "a = swapas pi a"
  using assms by (induct pi) auto

lemma swapas_pi_ineq_a: 
  assumes  "swapas pi a  a"
  shows "a  atms pi"
  using a_not_in_atms assms by force

lemma a_ineq_swapas_pi: 
  assumes "a  swapas pi a"
  shows "a  atms pi"
  using a_not_in_atms assms by blast

lemma swapas_pi_in_atms: 
  assumes "a  atms pi" 
  shows"swapas pi a  atms pi"
  using assms by (metis a_not_in_atms swapas_rev_pi_a)

(*<*)
end
(*>*)