src/HOL/Nominal/Examples/Support.thy
author urbanc
Mon, 08 Oct 2007 05:23:47 +0200
changeset 24895 7cbb842aa99e
child 25139 ffc5054a7274
permissions -rw-r--r--
added two new example files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24895
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     1
(* $Id$ *)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     2
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     3
theory Support 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     4
imports "../Nominal" 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     5
begin
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     6
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     7
text {* 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     8
  
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
     9
  An example showing that in general
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    10
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    11
  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
    12
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    13
  The example shows that with A set to the set of 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    14
  even atoms and B to the set of odd even atoms. 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    15
  Then A \<union> B, that is the set of all atoms, has 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    16
  empty support. The sets A, respectively B, have 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    17
  the set of all atoms as support. 
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    18
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    19
*}
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    20
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    21
atom_decl atom
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    22
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    23
abbreviation
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    24
  EVEN :: "atom set"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    25
where
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    26
  "EVEN \<equiv> {atom n | n. \<exists>i. n=2*i}"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    27
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    28
abbreviation  
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    29
  ODD :: "atom set"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    30
where
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    31
  "ODD \<equiv> {atom n | n. \<exists>i. n=2*i+1}"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    32
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    33
lemma even_or_odd:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    34
  fixes n::"nat"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    35
  shows "\<exists>i. (n = 2*i) \<or> (n=2*i+1)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    36
  by (induct n) (presburger)+
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    37
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    38
lemma EVEN_union_ODD:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    39
  shows "EVEN \<union> ODD = UNIV"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    40
proof -
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    41
  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
    42
  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
    43
  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
    44
  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
    45
  also have "\<dots> = (UNIV::atom set)" using atom.exhaust
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    46
    by (rule_tac  surj_range) (auto simp add: surj_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    47
  finally show "EVEN \<union> ODD = UNIV" by simp
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    48
qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    49
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    50
lemma EVEN_intersect_ODD:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    51
  shows "EVEN \<inter> ODD = {}"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    52
  using even_or_odd
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    53
  by (auto) (presburger)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    54
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    55
lemma UNIV_subtract:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    56
  shows "UNIV - EVEN = ODD"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    57
  and   "UNIV - ODD  = EVEN"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    58
  using EVEN_union_ODD EVEN_intersect_ODD
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    59
  by (blast)+
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    60
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    61
lemma EVEN_ODD_infinite:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    62
  shows "infinite EVEN"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    63
  and   "infinite ODD"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    64
apply(simp add: infinite_iff_countable_subset)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    65
apply(rule_tac x="\<lambda>n. atom (2*n)" in exI)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    66
apply(auto simp add: inj_on_def)[1]
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    67
apply(simp add: infinite_iff_countable_subset)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    68
apply(rule_tac x="\<lambda>n. atom (2*n+1)" in exI)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    69
apply(auto simp add: inj_on_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    70
done
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    71
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    72
(* A set S that is infinite and coinfinite has all atoms as its support *)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    73
lemma supp_infinite_coinfinite:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    74
  fixes S::"atom set"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    75
  assumes a: "infinite S"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    76
  and     b: "infinite (UNIV-S)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    77
  shows "(supp S) = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    78
proof -
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    79
  have "\<forall>(x::atom). x\<in>(supp S)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    80
  proof
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    81
    fix x::"atom"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    82
    show "x\<in>(supp S)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    83
    proof (cases "x\<in>S")
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    84
      case True
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    85
      have "x\<in>S" by fact
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    86
      hence "\<forall>b\<in>(UNIV-S). [(x,b)]\<bullet>S\<noteq>S" by (auto simp add: perm_set_def calc_atm)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    87
      with b have "infinite {b\<in>(UNIV-S). [(x,b)]\<bullet>S\<noteq>S}" by (rule infinite_Collection)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    88
      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
    89
      then show "x\<in>(supp S)" by (simp add: supp_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    90
    next
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    91
      case False
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    92
      have "x\<notin>S" by fact
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    93
      hence "\<forall>b\<in>S. [(x,b)]\<bullet>S\<noteq>S" by (auto simp add: perm_set_def calc_atm)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    94
      with a have "infinite {b\<in>S. [(x,b)]\<bullet>S\<noteq>S}" by (rule infinite_Collection)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    95
      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
    96
      then show "x\<in>(supp S)" by (simp add: supp_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    97
    qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    98
  qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
    99
  then show "(supp S) = (UNIV::atom set)" by auto
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   100
qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   101
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   102
lemma EVEN_ODD_supp:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   103
  shows "supp EVEN = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   104
  and   "supp ODD  = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   105
  using supp_infinite_coinfinite UNIV_subtract EVEN_ODD_infinite
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   106
  by simp_all
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   107
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   108
lemma UNIV_supp:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   109
  shows "supp (UNIV::atom set) = ({}::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   110
proof -
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   111
  have "\<forall>(x::atom) (y::atom). [(x,y)]\<bullet>UNIV = (UNIV::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   112
    by (auto simp add: perm_set_def calc_atm)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   113
  then show "supp (UNIV::atom set) = ({}::atom set)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   114
    by (simp add: supp_def)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   115
qed
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   116
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   117
theorem EVEN_ODD_freshness:
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   118
  fixes x::"atom"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   119
  shows "x\<sharp>(EVEN \<union> ODD)"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   120
  and   "\<not>x\<sharp>EVEN"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   121
  and   "\<not>x\<sharp>ODD"
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   122
  by (auto simp only: fresh_def EVEN_union_ODD EVEN_ODD_supp UNIV_supp)
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   123
7cbb842aa99e added two new example files
urbanc
parents:
diff changeset
   124
end