Theory Support

Up to index of Isabelle/HOL/HOL-Nominal/Examples

theory Support
imports Nominal
begin

(* $Id: Support.thy,v 1.2 2007/10/21 17:32:19 urbanc Exp $ *)

theory Support 
imports "../Nominal" 
begin

text {* 
  An example showing that in general

  x\<sharp>(A ∪ B) does not imply  x\<sharp>A and  x\<sharp>B

  For this we set A to the set of even atoms 
  and B to the set of odd even atoms. Then A ∪ B, 
  that is the set of all atoms, has empty support. 
  The sets A, respectively B, have the set of all atoms 
  as support. 
*}

atom_decl atom

abbreviation
  EVEN :: "atom set"
where
  "EVEN ≡ {atom n | n. ∃i. n=2*i}"

abbreviation  
  ODD :: "atom set"
where
  "ODD ≡ {atom n | n. ∃i. n=2*i+1}"

lemma even_or_odd:
  fixes n::"nat"
  shows "∃i. (n = 2*i) ∨ (n=2*i+1)"
  by (induct n) (presburger)+

lemma EVEN_union_ODD:
  shows "EVEN ∪ ODD = UNIV"
  using even_or_odd
proof -
  have "EVEN ∪ ODD = (λn. atom n) ` {n. ∃i. n = 2*i} ∪ (λn. atom n) ` {n. ∃i. n = 2*i+1}" by auto
  also have "… = (λn. atom n) ` ({n. ∃i. n = 2*i} ∪ {n. ∃i. n = 2*i+1})" by auto
  also have "… = (λn. atom n) ` ({n. ∃i. n = 2*i ∨ n = 2*i+1})" by auto
  also have "… = (λn. atom n) ` (UNIV::nat set)" using even_or_odd by auto
  also have "… = (UNIV::atom set)" using atom.exhaust
    by (rule_tac  surj_range) (auto simp add: surj_def)
  finally show "EVEN ∪ ODD = UNIV" by simp
qed

lemma EVEN_intersect_ODD:
  shows "EVEN ∩ ODD = {}"
  using even_or_odd
  by (auto) (presburger)

lemma UNIV_subtract:
  shows "UNIV - EVEN = ODD"
  and   "UNIV - ODD  = EVEN"
  using EVEN_union_ODD EVEN_intersect_ODD
  by (blast)+

lemma EVEN_ODD_infinite:
  shows "infinite EVEN"
  and   "infinite ODD"
apply(simp add: infinite_iff_countable_subset)
apply(rule_tac x="λn. atom (2*n)" in exI)
apply(auto simp add: inj_on_def)[1]
apply(simp add: infinite_iff_countable_subset)
apply(rule_tac x="λn. atom (2*n+1)" in exI)
apply(auto simp add: inj_on_def)
done

text {* 
  A set S that is infinite and coinfinite 
  has all atoms as its support. *}
lemma supp_infinite_coinfinite:
  fixes S::"atom set"
  assumes a: "infinite S"
  and     b: "infinite (UNIV-S)"
  shows "(supp S) = (UNIV::atom set)"
proof -
  have "∀(x::atom). x∈(supp S)"
  proof
    fix x::"atom"
    show "x∈(supp S)"
    proof (cases "x∈S")
      case True
      have "x∈S" by fact
      hence "∀b∈(UNIV-S). [(x,b)]•S≠S" by (auto simp add: perm_set_def calc_atm)
      with b have "infinite {b∈(UNIV-S). [(x,b)]•S≠S}" by (rule infinite_Collection)
      hence "infinite {b. [(x,b)]•S≠S}" by (rule_tac infinite_super, auto)
      then show "x∈(supp S)" by (simp add: supp_def)
    next
      case False
      have "x∉S" by fact
      hence "∀b∈S. [(x,b)]•S≠S" by (auto simp add: perm_set_def calc_atm)
      with a have "infinite {b∈S. [(x,b)]•S≠S}" by (rule infinite_Collection)
      hence "infinite {b. [(x,b)]•S≠S}" by (rule_tac infinite_super, auto)
      then show "x∈(supp S)" by (simp add: supp_def)
    qed
  qed
  then show "(supp S) = (UNIV::atom set)" by auto
qed

lemma EVEN_ODD_supp:
  shows "supp EVEN = (UNIV::atom set)"
  and   "supp ODD  = (UNIV::atom set)"
  using supp_infinite_coinfinite UNIV_subtract EVEN_ODD_infinite
  by simp_all

lemma UNIV_supp:
  shows "supp (UNIV::atom set) = ({}::atom set)"
proof -
  have "∀(x::atom) (y::atom). [(x,y)]•UNIV = (UNIV::atom set)"
    by (auto simp add: perm_set_def calc_atm)
  then show "supp (UNIV::atom set) = ({}::atom set)"
    by (simp add: supp_def)
qed

theorem EVEN_ODD_freshness:
  fixes x::"atom"
  shows "x\<sharp>(EVEN ∪ ODD)"
  and   "¬x\<sharp>EVEN"
  and   "¬x\<sharp>ODD"
  by (auto simp only: fresh_def EVEN_union_ODD EVEN_ODD_supp UNIV_supp)

end

lemma even_or_odd:

  i. n = 2 * in = 2 * i + 1

lemma EVEN_union_ODD:

  EVENODD = UNIV

lemma EVEN_intersect_ODD:

  EVENODD = {}

lemma UNIV_subtract(1):

  UNIV - EVEN = ODD

and UNIV_subtract(2):

  UNIV - ODD = EVEN

lemma EVEN_ODD_infinite(1):

  infinite EVEN

and EVEN_ODD_infinite(2):

  infinite ODD

lemma supp_infinite_coinfinite:

  [| infinite S; infinite (UNIV - S) |] ==> supp S = UNIV

lemma EVEN_ODD_supp(1):

  supp EVEN = UNIV

and EVEN_ODD_supp(2):

  supp ODD = UNIV

lemma UNIV_supp:

  supp UNIV = {}

theorem EVEN_ODD_freshness(1):

  x \<sharp> (EVENODD)

and EVEN_ODD_freshness(2):

  ¬ x \<sharp> EVEN

and EVEN_ODD_freshness(3):

  ¬ x \<sharp> ODD