src/HOL/Nominal/Examples/Support.thy
author wenzelm
Sun, 16 Jan 2011 15:53:03 +0100
changeset 41589 bbd861837ebc
parent 40702 cf26dd7395e4
child 46181 49c3e0ef9d70
permissions -rw-r--r--
tuned headers;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     1
theory Support 
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
     2
  imports "../Nominal" 
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     3
begin
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     4
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     5
text {* 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     6
  An example showing that in general
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     7
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     8
  x\<sharp>(A \<union> B) does not imply  x\<sharp>A and  x\<sharp>B
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     9
26262
urbanc
parents: 26055
diff changeset
    10
  For this we set A to the set of even atoms and B to 
urbanc
parents: 26055
diff changeset
    11
  the set of odd atoms. Then A \<union> B, that is the set of 
urbanc
parents: 26055
diff changeset
    12
  all atoms, has empty support. The sets A, respectively B, 
urbanc
parents: 26055
diff changeset
    13
  however have the set of all atoms as their support. 
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    14
*}
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    15
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    16
atom_decl atom
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    17
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    18
text {* The set of even atoms. *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    19
abbreviation
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    20
  EVEN :: "atom set"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    21
where
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    22
  "EVEN \<equiv> {atom n | n. \<exists>i. n=2*i}"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    23
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    24
text {* The set of odd atoms: *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    25
abbreviation  
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    26
  ODD :: "atom set"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    27
where
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    28
  "ODD \<equiv> {atom n | n. \<exists>i. n=2*i+1}"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    29
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    30
text {* An atom is either even or odd. *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    31
lemma even_or_odd:
37388
793618618f78 tuned quotes, antiquotations and whitespace
haftmann
parents: 27360
diff changeset
    32
  fixes n :: nat
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    33
  shows "\<exists>i. (n = 2*i) \<or> (n=2*i+1)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    34
  by (induct n) (presburger)+
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    35
26055
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
    36
text {* 
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
    37
  The union of even and odd atoms is the set of all atoms. 
26262
urbanc
parents: 26055
diff changeset
    38
  (Unfortunately I do not know a simpler proof of this fact.) *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    39
lemma EVEN_union_ODD:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    40
  shows "EVEN \<union> ODD = UNIV"
25139
urbanc
parents: 24895
diff changeset
    41
  using even_or_odd
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    42
proof -
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    43
  have "EVEN \<union> ODD = (\<lambda>n. atom n) ` {n. \<exists>i. n = 2*i} \<union> (\<lambda>n. atom n) ` {n. \<exists>i. n = 2*i+1}" by auto
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    44
  also have "\<dots> = (\<lambda>n. atom n) ` ({n. \<exists>i. n = 2*i} \<union> {n. \<exists>i. n = 2*i+1})" by auto
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    45
  also have "\<dots> = (\<lambda>n. atom n) ` ({n. \<exists>i. n = 2*i \<or> n = 2*i+1})" by auto
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    46
  also have "\<dots> = (\<lambda>n. atom n) ` (UNIV::nat set)" using even_or_odd by auto
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    47
  also have "\<dots> = (UNIV::atom set)" using atom.exhaust
40702
cf26dd7395e4 Replace surj by abbreviation; remove surj_on.
hoelzl
parents: 37388
diff changeset
    48
    by (auto simp add: surj_def)
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    49
  finally show "EVEN \<union> ODD = UNIV" by simp
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    50
qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    51
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    52
text {* The sets of even and odd atoms are disjunct. *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    53
lemma EVEN_intersect_ODD:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    54
  shows "EVEN \<inter> ODD = {}"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    55
  using even_or_odd
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    56
  by (auto) (presburger)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    57
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    58
text {* 
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    59
  The preceeding two lemmas help us to prove 
26055
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
    60
  the following two useful equalities: *}
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
    61
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    62
lemma UNIV_subtract:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    63
  shows "UNIV - EVEN = ODD"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    64
  and   "UNIV - ODD  = EVEN"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    65
  using EVEN_union_ODD EVEN_intersect_ODD
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    66
  by (blast)+
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    67
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    68
text {* The sets EVEN and ODD are infinite. *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    69
lemma EVEN_ODD_infinite:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    70
  shows "infinite EVEN"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    71
  and   "infinite ODD"
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    72
unfolding infinite_iff_countable_subset
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    73
proof -
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    74
  let ?f = "\<lambda>n. atom (2*n)"
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    75
  have "inj ?f \<and> range ?f \<subseteq> EVEN" by (auto simp add: inj_on_def)
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    76
  then show "\<exists>f::nat\<Rightarrow>atom. inj f \<and> range f \<subseteq> EVEN" by (rule_tac exI)
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    77
next
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    78
  let ?f = "\<lambda>n. atom (2*n+1)"
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    79
  have "inj ?f \<and> range ?f \<subseteq> ODD" by (auto simp add: inj_on_def)
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    80
  then show "\<exists>f::nat\<Rightarrow>atom. inj f \<and> range f \<subseteq> ODD" by (rule_tac exI)
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
    81
qed
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    82
25139
urbanc
parents: 24895
diff changeset
    83
text {* 
26262
urbanc
parents: 26055
diff changeset
    84
  A general fact about a set S of atoms that is both infinite and 
27360
urbanc
parents: 26806
diff changeset
    85
  coinfinite. Then S has all atoms as its support. Steve Zdancewic 
26055
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
    86
  helped with proving this fact. *}
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
    87
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    88
lemma supp_infinite_coinfinite:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    89
  fixes S::"atom set"
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25751
diff changeset
    90
  assumes asm1: "infinite S"
c24395ea4e71 tuned proofs
urbanc
parents: 25751
diff changeset
    91
  and     asm2: "infinite (UNIV-S)"
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    92
  shows "(supp S) = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    93
proof -
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    94
  have "\<forall>(x::atom). x\<in>(supp S)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    95
  proof
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    96
    fix x::"atom"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    97
    show "x\<in>(supp S)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    98
    proof (cases "x\<in>S")
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    99
      case True
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   100
      have "x\<in>S" by fact
26806
40b411ec05aa Adapted to encoding of sets as predicates
berghofe
parents: 26262
diff changeset
   101
      hence "\<forall>b\<in>(UNIV-S). [(x,b)]\<bullet>S\<noteq>S" by (auto simp add: perm_set_eq calc_atm)
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25751
diff changeset
   102
      with asm2 have "infinite {b\<in>(UNIV-S). [(x,b)]\<bullet>S\<noteq>S}" by (rule infinite_Collection)
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   103
      hence "infinite {b. [(x,b)]\<bullet>S\<noteq>S}" by (rule_tac infinite_super, auto)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   104
      then show "x\<in>(supp S)" by (simp add: supp_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   105
    next
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   106
      case False
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   107
      have "x\<notin>S" by fact
26806
40b411ec05aa Adapted to encoding of sets as predicates
berghofe
parents: 26262
diff changeset
   108
      hence "\<forall>b\<in>S. [(x,b)]\<bullet>S\<noteq>S" by (auto simp add: perm_set_eq calc_atm)
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25751
diff changeset
   109
      with asm1 have "infinite {b\<in>S. [(x,b)]\<bullet>S\<noteq>S}" by (rule infinite_Collection)
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   110
      hence "infinite {b. [(x,b)]\<bullet>S\<noteq>S}" by (rule_tac infinite_super, auto)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   111
      then show "x\<in>(supp S)" by (simp add: supp_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   112
    qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   113
  qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   114
  then show "(supp S) = (UNIV::atom set)" by auto
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   115
qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   116
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
   117
text {* As a corollary we get that EVEN and ODD have infinite support. *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   118
lemma EVEN_ODD_supp:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   119
  shows "supp EVEN = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   120
  and   "supp ODD  = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   121
  using supp_infinite_coinfinite UNIV_subtract EVEN_ODD_infinite
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   122
  by simp_all
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   123
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
   124
text {* 
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
   125
  The set of all atoms has empty support, since any swappings leaves 
26055
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
   126
  this set unchanged. *}
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
   127
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   128
lemma UNIV_supp:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   129
  shows "supp (UNIV::atom set) = ({}::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   130
proof -
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   131
  have "\<forall>(x::atom) (y::atom). [(x,y)]\<bullet>UNIV = (UNIV::atom set)"
26806
40b411ec05aa Adapted to encoding of sets as predicates
berghofe
parents: 26262
diff changeset
   132
    by (auto simp add: perm_set_eq calc_atm)
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
   133
  then show "supp (UNIV::atom set) = ({}::atom set)" by (simp add: supp_def)
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   134
qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   135
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25139
diff changeset
   136
text {* Putting everything together. *}
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   137
theorem EVEN_ODD_freshness:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   138
  fixes x::"atom"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   139
  shows "x\<sharp>(EVEN \<union> ODD)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   140
  and   "\<not>x\<sharp>EVEN"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   141
  and   "\<not>x\<sharp>ODD"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   142
  by (auto simp only: fresh_def EVEN_union_ODD EVEN_ODD_supp UNIV_supp)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   143
26055
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
   144
text {* Moral: support is a sublte notion. *}
a7a537e0413a tuned proofs and comments
urbanc
parents: 25867
diff changeset
   145
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   146
end