Nominal/Nominal2_Base.thy
author Christian Urban <urbanc@in.tum.de>
Thu, 19 Apr 2018 13:58:22 +0100
branchNominal2-Isabelle2016-1
changeset 3246 66114fa3d2ee
parent 3245 017e33849f4d
permissions -rw-r--r--
updated to Isabelle 2016-1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
     1
(*  Title:      Nominal2_Base
3101
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
     2
    Authors:    Christian Urban, Brian Huffman, Cezary Kaliszyk
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
     3
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
     4
    Basic definitions and lemma infrastructure for 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
     5
    Nominal Isabelle. 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
     6
*)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
     7
theory Nominal2_Base
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
     8
imports "~~/src/HOL/Library/Old_Datatype"
2635
64b4cb2c2bf8 simple cases for string rule inductions
Christian Urban <urbanc@in.tum.de>
parents: 2632
diff changeset
     9
        "~~/src/HOL/Library/Infinite_Set"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
    10
        "~~/src/HOL/Library/Multiset"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
    11
        "~~/src/HOL/Library/FSet"
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
    12
        "~~/src/HOL/Library/FinFun"
3134
301b74fcd614 updated to new Isabelle (declared keywords)
Christian Urban <urbanc@in.tum.de>
parents: 3121
diff changeset
    13
keywords
301b74fcd614 updated to new Isabelle (declared keywords)
Christian Urban <urbanc@in.tum.de>
parents: 3121
diff changeset
    14
  "atom_decl" "equivariance" :: thy_decl 
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    15
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    16
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
    17
declare [[typedef_overloaded]]
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
    18
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
    19
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    20
section {* Atoms and Sorts *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    21
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
    22
text {* A simple implementation for @{text atom_sorts} is strings. *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    23
(* types atom_sort = string *)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    24
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    25
text {* To deal with Church-like binding we use trees of  
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    26
  strings as sorts. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    27
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    28
datatype atom_sort = Sort "string" "atom_sort list"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    29
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    30
datatype atom = Atom atom_sort nat
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    31
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    32
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    33
text {* Basic projection function. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    34
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    35
primrec
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    36
  sort_of :: "atom \<Rightarrow> atom_sort"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    37
where
2742
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
    38
  "sort_of (Atom s n) = s"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    39
1930
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    40
primrec
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    41
  nat_of :: "atom \<Rightarrow> nat"
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    42
where
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    43
  "nat_of (Atom s n) = n"
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    44
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    45
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    46
text {* There are infinitely many atoms of each sort. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    47
lemma INFM_sort_of_eq: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    48
  shows "INFM a. sort_of a = s"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    49
proof -
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    50
  have "INFM i. sort_of (Atom s i) = s" by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    51
  moreover have "inj (Atom s)" by (simp add: inj_on_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    52
  ultimately show "INFM a. sort_of a = s" by (rule INFM_inj)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    53
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    54
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    55
lemma infinite_sort_of_eq:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    56
  shows "infinite {a. sort_of a = s}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    57
  using INFM_sort_of_eq unfolding INFM_iff_infinite .
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    58
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    59
lemma atom_infinite [simp]: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    60
  shows "infinite (UNIV :: atom set)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    61
  using subset_UNIV infinite_sort_of_eq
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    62
  by (rule infinite_super)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    63
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    64
lemma obtain_atom:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    65
  fixes X :: "atom set"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    66
  assumes X: "finite X"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    67
  obtains a where "a \<notin> X" "sort_of a = s"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    68
proof -
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    69
  from X have "MOST a. a \<notin> X"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    70
    unfolding MOST_iff_cofinite by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    71
  with INFM_sort_of_eq
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    72
  have "INFM a. sort_of a = s \<and> a \<notin> X"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    73
    by (rule INFM_conjI)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    74
  then obtain a where "a \<notin> X" "sort_of a = s"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    75
    by (auto elim: INFM_E)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    76
  then show ?thesis ..
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    77
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    78
1930
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    79
lemma atom_components_eq_iff:
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    80
  fixes a b :: atom
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    81
  shows "a = b \<longleftrightarrow> sort_of a = sort_of b \<and> nat_of a = nat_of b"
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    82
  by (induct a, induct b, simp)
f189cf2c0987 moved some lemmas into the right places
Christian Urban <urbanc@in.tum.de>
parents: 1879
diff changeset
    83
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
    84
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    85
section {* Sort-Respecting Permutations *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    86
3202
3611bc56c177 updated to changes in the type-def package
Christian Urban <urbanc@in.tum.de>
parents: 3201
diff changeset
    87
definition
3611bc56c177 updated to changes in the type-def package
Christian Urban <urbanc@in.tum.de>
parents: 3201
diff changeset
    88
  "perm \<equiv> {f. bij f \<and> finite {a. f a \<noteq> a} \<and> (\<forall>a. sort_of (f a) = sort_of a)}"
3611bc56c177 updated to changes in the type-def package
Christian Urban <urbanc@in.tum.de>
parents: 3201
diff changeset
    89
3611bc56c177 updated to changes in the type-def package
Christian Urban <urbanc@in.tum.de>
parents: 3201
diff changeset
    90
typedef perm = "perm"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    91
proof
3202
3611bc56c177 updated to changes in the type-def package
Christian Urban <urbanc@in.tum.de>
parents: 3201
diff changeset
    92
  show "id \<in> perm" unfolding perm_def by simp
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    93
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    94
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    95
lemma permI:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    96
  assumes "bij f" and "MOST x. f x = x" and "\<And>a. sort_of (f a) = sort_of a"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    97
  shows "f \<in> perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    98
  using assms unfolding perm_def MOST_iff_cofinite by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
    99
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   100
lemma perm_is_bij: "f \<in> perm \<Longrightarrow> bij f"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   101
  unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   102
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   103
lemma perm_is_finite: "f \<in> perm \<Longrightarrow> finite {a. f a \<noteq> a}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   104
  unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   105
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   106
lemma perm_is_sort_respecting: "f \<in> perm \<Longrightarrow> sort_of (f a) = sort_of a"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   107
  unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   108
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   109
lemma perm_MOST: "f \<in> perm \<Longrightarrow> MOST x. f x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   110
  unfolding perm_def MOST_iff_cofinite by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   111
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   112
lemma perm_id: "id \<in> perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   113
  unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   114
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   115
lemma perm_comp:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   116
  assumes f: "f \<in> perm" and g: "g \<in> perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   117
  shows "(f \<circ> g) \<in> perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   118
apply (rule permI)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   119
apply (rule bij_comp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   120
apply (rule perm_is_bij [OF g])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   121
apply (rule perm_is_bij [OF f])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   122
apply (rule MOST_rev_mp [OF perm_MOST [OF g]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   123
apply (rule MOST_rev_mp [OF perm_MOST [OF f]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   124
apply (simp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   125
apply (simp add: perm_is_sort_respecting [OF f])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   126
apply (simp add: perm_is_sort_respecting [OF g])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   127
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   128
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   129
lemma perm_inv:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   130
  assumes f: "f \<in> perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   131
  shows "(inv f) \<in> perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   132
apply (rule permI)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   133
apply (rule bij_imp_bij_inv)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   134
apply (rule perm_is_bij [OF f])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   135
apply (rule MOST_mono [OF perm_MOST [OF f]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   136
apply (erule subst, rule inv_f_f)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   137
apply (rule bij_is_inj [OF perm_is_bij [OF f]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   138
apply (rule perm_is_sort_respecting [OF f, THEN sym, THEN trans])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   139
apply (simp add: surj_f_inv_f [OF bij_is_surj [OF perm_is_bij [OF f]]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   140
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   141
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   142
lemma bij_Rep_perm: "bij (Rep_perm p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   143
  using Rep_perm [of p] unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   144
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   145
lemma finite_Rep_perm: "finite {a. Rep_perm p a \<noteq> a}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   146
  using Rep_perm [of p] unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   147
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   148
lemma sort_of_Rep_perm: "sort_of (Rep_perm p a) = sort_of a"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   149
  using Rep_perm [of p] unfolding perm_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   150
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   151
lemma Rep_perm_ext:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   152
  "Rep_perm p1 = Rep_perm p2 \<Longrightarrow> p1 = p2"
2479
a9b6a00b1ba0 updated to Isabelle Sept 16
Christian Urban <urbanc@in.tum.de>
parents: 2475
diff changeset
   153
  by (simp add: fun_eq_iff Rep_perm_inject [symmetric])
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   154
2560
82e37a4595c7 automated permute_bn functions (raw ones first)
Christian Urban <urbanc@in.tum.de>
parents: 2507
diff changeset
   155
instance perm :: size ..
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   156
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   157
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   158
subsection {* Permutations form a (multiplicative) group *}
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   159
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   160
instantiation perm :: group_add
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   161
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   162
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   163
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   164
  "0 = Abs_perm id"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   165
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   166
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   167
  "- p = Abs_perm (inv (Rep_perm p))"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   168
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   169
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   170
  "p + q = Abs_perm (Rep_perm p \<circ> Rep_perm q)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   171
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   172
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   173
  "(p1::perm) - p2 = p1 + - p2"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   174
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   175
lemma Rep_perm_0: "Rep_perm 0 = id"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   176
  unfolding zero_perm_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   177
  by (simp add: Abs_perm_inverse perm_id)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   178
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   179
lemma Rep_perm_add:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   180
  "Rep_perm (p1 + p2) = Rep_perm p1 \<circ> Rep_perm p2"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   181
  unfolding plus_perm_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   182
  by (simp add: Abs_perm_inverse perm_comp Rep_perm)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   183
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   184
lemma Rep_perm_uminus:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   185
  "Rep_perm (- p) = inv (Rep_perm p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   186
  unfolding uminus_perm_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   187
  by (simp add: Abs_perm_inverse perm_inv Rep_perm)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   188
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   189
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   190
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   191
unfolding Rep_perm_inject [symmetric]
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   192
unfolding minus_perm_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   193
unfolding Rep_perm_add
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   194
unfolding Rep_perm_uminus
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   195
unfolding Rep_perm_0
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   196
by (simp_all add: o_assoc inv_o_cancel [OF bij_is_inj [OF bij_Rep_perm]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   197
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   198
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   199
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   200
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   201
section {* Implementation of swappings *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   202
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   203
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   204
  swap :: "atom \<Rightarrow> atom \<Rightarrow> perm" ("'(_ \<rightleftharpoons> _')")
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   205
where
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   206
  "(a \<rightleftharpoons> b) =
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   207
    Abs_perm (if sort_of a = sort_of b 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   208
              then (\<lambda>c. if a = c then b else if b = c then a else c) 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   209
              else id)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   210
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   211
lemma Rep_perm_swap:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   212
  "Rep_perm (a \<rightleftharpoons> b) =
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   213
    (if sort_of a = sort_of b 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   214
     then (\<lambda>c. if a = c then b else if b = c then a else c)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   215
     else id)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   216
unfolding swap_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   217
apply (rule Abs_perm_inverse)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   218
apply (rule permI)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   219
apply (auto simp: bij_def inj_on_def surj_def)[1]
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   220
apply (rule MOST_rev_mp [OF MOST_neq(1) [of a]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   221
apply (rule MOST_rev_mp [OF MOST_neq(1) [of b]])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   222
apply (simp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   223
apply (simp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   224
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   225
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   226
lemmas Rep_perm_simps =
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   227
  Rep_perm_0
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   228
  Rep_perm_add
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   229
  Rep_perm_uminus
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   230
  Rep_perm_swap
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   231
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   232
lemma swap_different_sorts [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   233
  "sort_of a \<noteq> sort_of b \<Longrightarrow> (a \<rightleftharpoons> b) = 0"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   234
  by (rule Rep_perm_ext) (simp add: Rep_perm_simps)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   235
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   236
lemma swap_cancel:
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
   237
  shows "(a \<rightleftharpoons> b) + (a \<rightleftharpoons> b) = 0"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
   238
  and   "(a \<rightleftharpoons> b) + (b \<rightleftharpoons> a) = 0"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
   239
  by (rule_tac [!] Rep_perm_ext) 
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
   240
     (simp_all add: Rep_perm_simps fun_eq_iff)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   241
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   242
lemma swap_self [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   243
  "(a \<rightleftharpoons> a) = 0"
2479
a9b6a00b1ba0 updated to Isabelle Sept 16
Christian Urban <urbanc@in.tum.de>
parents: 2475
diff changeset
   244
  by (rule Rep_perm_ext, simp add: Rep_perm_simps fun_eq_iff)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   245
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   246
lemma minus_swap [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   247
  "- (a \<rightleftharpoons> b) = (a \<rightleftharpoons> b)"
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
   248
  by (rule minus_unique [OF swap_cancel(1)])
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   249
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   250
lemma swap_commute:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   251
  "(a \<rightleftharpoons> b) = (b \<rightleftharpoons> a)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   252
  by (rule Rep_perm_ext)
2479
a9b6a00b1ba0 updated to Isabelle Sept 16
Christian Urban <urbanc@in.tum.de>
parents: 2475
diff changeset
   253
     (simp add: Rep_perm_swap fun_eq_iff)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   254
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   255
lemma swap_triple:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   256
  assumes "a \<noteq> b" and "c \<noteq> b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   257
  assumes "sort_of a = sort_of b" "sort_of b = sort_of c"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   258
  shows "(a \<rightleftharpoons> c) + (b \<rightleftharpoons> c) + (a \<rightleftharpoons> c) = (a \<rightleftharpoons> b)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   259
  using assms
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   260
  by (rule_tac Rep_perm_ext)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   261
     (auto simp: Rep_perm_simps fun_eq_iff)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   262
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   263
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   264
section {* Permutation Types *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   265
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   266
text {*
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   267
  Infix syntax for @{text permute} has higher precedence than
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   268
  addition, but lower than unary minus.
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   269
*}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   270
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   271
class pt =
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   272
  fixes permute :: "perm \<Rightarrow> 'a \<Rightarrow> 'a" ("_ \<bullet> _" [76, 75] 75)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   273
  assumes permute_zero [simp]: "0 \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   274
  assumes permute_plus [simp]: "(p + q) \<bullet> x = p \<bullet> (q \<bullet> x)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   275
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   276
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   277
lemma permute_diff [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   278
  shows "(p - q) \<bullet> x = p \<bullet> - q \<bullet> x"
3226
780b7a2c50b6 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3223
diff changeset
   279
  using permute_plus [of p "- q" x] by simp
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   280
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   281
lemma permute_minus_cancel [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   282
  shows "p \<bullet> - p \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   283
  and   "- p \<bullet> p \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   284
  unfolding permute_plus [symmetric] by simp_all
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   285
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   286
lemma permute_swap_cancel [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   287
  shows "(a \<rightleftharpoons> b) \<bullet> (a \<rightleftharpoons> b) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   288
  unfolding permute_plus [symmetric]
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   289
  by (simp add: swap_cancel)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   290
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   291
lemma permute_swap_cancel2 [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   292
  shows "(a \<rightleftharpoons> b) \<bullet> (b \<rightleftharpoons> a) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   293
  unfolding permute_plus [symmetric]
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   294
  by (simp add: swap_commute)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   295
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   296
lemma inj_permute [simp]: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   297
  shows "inj (permute p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   298
  by (rule inj_on_inverseI)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   299
     (rule permute_minus_cancel)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   300
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   301
lemma surj_permute [simp]: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   302
  shows "surj (permute p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   303
  by (rule surjI, rule permute_minus_cancel)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   304
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   305
lemma bij_permute [simp]: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   306
  shows "bij (permute p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   307
  by (rule bijI [OF inj_permute surj_permute])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   308
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   309
lemma inv_permute: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   310
  shows "inv (permute p) = permute (- p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   311
  by (rule inv_equality) (simp_all)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   312
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   313
lemma permute_minus: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   314
  shows "permute (- p) = inv (permute p)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   315
  by (simp add: inv_permute)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   316
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   317
lemma permute_eq_iff [simp]: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   318
  shows "p \<bullet> x = p \<bullet> y \<longleftrightarrow> x = y"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   319
  by (rule inj_permute [THEN inj_eq])
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   320
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   321
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   322
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   323
subsection {* Permutations for atoms *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   324
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   325
instantiation atom :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   326
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   327
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   328
definition
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   329
  "p \<bullet> a = (Rep_perm p) a"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   330
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   331
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   332
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   333
apply(simp_all add: permute_atom_def Rep_perm_simps)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   334
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   335
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   336
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   337
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   338
lemma sort_of_permute [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   339
  shows "sort_of (p \<bullet> a) = sort_of a"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   340
  unfolding permute_atom_def by (rule sort_of_Rep_perm)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   341
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   342
lemma swap_atom:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   343
  shows "(a \<rightleftharpoons> b) \<bullet> c =
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   344
           (if sort_of a = sort_of b
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   345
            then (if c = a then b else if c = b then a else c) else c)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   346
  unfolding permute_atom_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   347
  by (simp add: Rep_perm_swap)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   348
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   349
lemma swap_atom_simps [simp]:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   350
  "sort_of a = sort_of b \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> a = b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   351
  "sort_of a = sort_of b \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> b = a"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   352
  "c \<noteq> a \<Longrightarrow> c \<noteq> b \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> c = c"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   353
  unfolding swap_atom by simp_all
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   354
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   355
lemma perm_eq_iff:
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   356
  fixes p q :: "perm"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   357
  shows "p = q \<longleftrightarrow> (\<forall>a::atom. p \<bullet> a = q \<bullet> a)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   358
  unfolding permute_atom_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   359
  by (metis Rep_perm_ext ext)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   360
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   361
subsection {* Permutations for permutations *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   362
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   363
instantiation perm :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   364
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   365
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   366
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   367
  "p \<bullet> q = p + q - p"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   368
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   369
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   370
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   371
apply (simp add: permute_perm_def)
3226
780b7a2c50b6 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3223
diff changeset
   372
apply (simp add: permute_perm_def algebra_simps)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   373
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   374
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   375
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   376
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   377
lemma permute_self: 
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   378
  shows "p \<bullet> p = p"
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   379
  unfolding permute_perm_def 
3237
8ee8f72778ce changed add.assoc
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3234
diff changeset
   380
  by (simp add: add.assoc)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   381
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   382
lemma pemute_minus_self:
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   383
  shows "- p \<bullet> p = p"
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   384
  unfolding permute_perm_def 
3237
8ee8f72778ce changed add.assoc
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3234
diff changeset
   385
  by (simp add: add.assoc)
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
   386
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   387
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   388
subsection {* Permutations for functions *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   389
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   390
instantiation "fun" :: (pt, pt) pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   391
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   392
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   393
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   394
  "p \<bullet> f = (\<lambda>x. p \<bullet> (f (- p \<bullet> x)))"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   395
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   396
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   397
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   398
apply (simp add: permute_fun_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   399
apply (simp add: permute_fun_def minus_add)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   400
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   401
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   402
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   403
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   404
lemma permute_fun_app_eq:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   405
  shows "p \<bullet> (f x) = (p \<bullet> f) (p \<bullet> x)"
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   406
  unfolding permute_fun_def by simp
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   407
3167
c25386402f6a added a lemma about composition and permutations
Christian Urban <urbanc@in.tum.de>
parents: 3152
diff changeset
   408
lemma permute_fun_comp:
c25386402f6a added a lemma about composition and permutations
Christian Urban <urbanc@in.tum.de>
parents: 3152
diff changeset
   409
  shows "p \<bullet> f  = (permute p) o f o (permute (-p))"
c25386402f6a added a lemma about composition and permutations
Christian Urban <urbanc@in.tum.de>
parents: 3152
diff changeset
   410
by (simp add: comp_def permute_fun_def)
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
   411
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   412
subsection {* Permutations for booleans *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   413
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   414
instantiation bool :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   415
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   416
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   417
definition "p \<bullet> (b::bool) = b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   418
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   419
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   420
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   421
apply(simp_all add: permute_bool_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   422
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   423
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   424
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   425
1557
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   426
lemma permute_boolE:
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   427
  fixes P::"bool"
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   428
  shows "p \<bullet> P \<Longrightarrow> P"
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   429
  by (simp add: permute_bool_def)
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   430
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   431
lemma permute_boolI:
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   432
  fixes P::"bool"
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   433
  shows "P \<Longrightarrow> p \<bullet> P"
fee2389789ad moved infinite_Un into mainstream Isabelle; moved permute_boolI/E lemmas
Christian Urban <urbanc@in.tum.de>
parents: 1305
diff changeset
   434
  by(simp add: permute_bool_def)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   435
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   436
subsection {* Permutations for sets *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   437
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   438
instantiation "set" :: (pt) pt
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   439
begin
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   440
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   441
definition
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   442
  "p \<bullet> X = {p \<bullet> x | x. x \<in> X}" 
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   443
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   444
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   445
apply standard
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   446
apply (auto simp: permute_set_def)
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   447
done
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   448
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   449
end
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   450
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   451
lemma permute_set_eq:
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
   452
 shows "p \<bullet> X = {x. - p \<bullet> x \<in> X}"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   453
unfolding permute_set_def
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   454
by (auto) (metis permute_minus_cancel(1))
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   455
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   456
lemma permute_set_eq_image:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   457
  shows "p \<bullet> X = permute p ` X"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   458
  unfolding permute_set_def by auto
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   459
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   460
lemma permute_set_eq_vimage:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   461
  shows "p \<bullet> X = permute (- p) -` X"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   462
  unfolding permute_set_eq vimage_def
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   463
  by simp
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   464
  
2588
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
   465
lemma permute_finite [simp]:
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
   466
  shows "finite (p \<bullet> X) = finite X"
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   467
  unfolding permute_set_eq_vimage
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   468
  using bij_permute by (rule finite_vimage_iff)
2588
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
   469
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   470
lemma swap_set_not_in:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   471
  assumes a: "a \<notin> S" "b \<notin> S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   472
  shows "(a \<rightleftharpoons> b) \<bullet> S = S"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   473
  unfolding permute_set_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   474
  using a by (auto simp: swap_atom)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   475
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   476
lemma swap_set_in:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   477
  assumes a: "a \<in> S" "b \<notin> S" "sort_of a = sort_of b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   478
  shows "(a \<rightleftharpoons> b) \<bullet> S \<noteq> S"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   479
  unfolding permute_set_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   480
  using a by (auto simp: swap_atom)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   481
2669
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   482
lemma swap_set_in_eq:
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   483
  assumes a: "a \<in> S" "b \<notin> S" "sort_of a = sort_of b"
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   484
  shows "(a \<rightleftharpoons> b) \<bullet> S = (S - {a}) \<union> {b}"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   485
  unfolding permute_set_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   486
  using a by (auto simp: swap_atom)
2669
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   487
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   488
lemma swap_set_both_in:
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   489
  assumes a: "a \<in> S" "b \<in> S"
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   490
  shows "(a \<rightleftharpoons> b) \<bullet> S = S"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   491
  unfolding permute_set_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   492
  using a by (auto simp: swap_atom)
2669
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
   493
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   494
lemma mem_permute_iff:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   495
  shows "(p \<bullet> x) \<in> (p \<bullet> X) \<longleftrightarrow> x \<in> X"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   496
  unfolding permute_set_def
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   497
  by auto
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   498
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   499
lemma empty_eqvt:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   500
  shows "p \<bullet> {} = {}"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   501
  unfolding permute_set_def
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   502
  by (simp)
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   503
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   504
lemma insert_eqvt:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   505
  shows "p \<bullet> (insert x A) = insert (p \<bullet> x) (p \<bullet> A)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   506
  unfolding permute_set_eq_image image_insert ..
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
   507
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   508
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   509
subsection {* Permutations for @{typ unit} *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   510
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   511
instantiation unit :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   512
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   513
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   514
definition "p \<bullet> (u::unit) = u"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   515
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   516
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   517
  by standard (simp_all add: permute_unit_def)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   518
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   519
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   520
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   521
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   522
subsection {* Permutations for products *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   523
2378
2f13fe48c877 updated to new Isabelle; made FSet more "quiet"
Christian Urban <urbanc@in.tum.de>
parents: 2310
diff changeset
   524
instantiation prod :: (pt, pt) pt
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   525
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   526
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   527
primrec 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   528
  permute_prod 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   529
where
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   530
  Pair_eqvt: "p \<bullet> (x, y) = (p \<bullet> x, p \<bullet> y)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   531
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   532
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   533
  by standard auto
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   534
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   535
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   536
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   537
subsection {* Permutations for sums *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   538
2378
2f13fe48c877 updated to new Isabelle; made FSet more "quiet"
Christian Urban <urbanc@in.tum.de>
parents: 2310
diff changeset
   539
instantiation sum :: (pt, pt) pt
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   540
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   541
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   542
primrec 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   543
  permute_sum 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   544
where
2982
4a00077c008f completed the eqvt-proofs for functions; they are stored under the name function_name.eqvt and added to the eqvt-list
Christian Urban <urbanc@in.tum.de>
parents: 2972
diff changeset
   545
  Inl_eqvt: "p \<bullet> (Inl x) = Inl (p \<bullet> x)"
4a00077c008f completed the eqvt-proofs for functions; they are stored under the name function_name.eqvt and added to the eqvt-list
Christian Urban <urbanc@in.tum.de>
parents: 2972
diff changeset
   546
| Inr_eqvt: "p \<bullet> (Inr y) = Inr (p \<bullet> y)"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   547
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   548
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   549
  by standard (case_tac [!] x, simp_all)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   550
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   551
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   552
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   553
subsection {* Permutations for @{typ "'a list"} *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   554
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   555
instantiation list :: (pt) pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   556
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   557
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   558
primrec 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   559
  permute_list 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   560
where
2982
4a00077c008f completed the eqvt-proofs for functions; they are stored under the name function_name.eqvt and added to the eqvt-list
Christian Urban <urbanc@in.tum.de>
parents: 2972
diff changeset
   561
  Nil_eqvt:  "p \<bullet> [] = []"
4a00077c008f completed the eqvt-proofs for functions; they are stored under the name function_name.eqvt and added to the eqvt-list
Christian Urban <urbanc@in.tum.de>
parents: 2972
diff changeset
   562
| Cons_eqvt: "p \<bullet> (x # xs) = p \<bullet> x # p \<bullet> xs"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   563
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   564
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   565
  by standard (induct_tac [!] x, simp_all)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   566
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   567
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   568
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   569
lemma set_eqvt:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   570
  shows "p \<bullet> (set xs) = set (p \<bullet> xs)"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   571
  by (induct xs) (simp_all add: empty_eqvt insert_eqvt)
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   572
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   573
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   574
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   575
subsection {* Permutations for @{typ "'a option"} *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   576
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   577
instantiation option :: (pt) pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   578
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   579
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   580
primrec 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   581
  permute_option 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   582
where
2982
4a00077c008f completed the eqvt-proofs for functions; they are stored under the name function_name.eqvt and added to the eqvt-list
Christian Urban <urbanc@in.tum.de>
parents: 2972
diff changeset
   583
  None_eqvt: "p \<bullet> None = None"
4a00077c008f completed the eqvt-proofs for functions; they are stored under the name function_name.eqvt and added to the eqvt-list
Christian Urban <urbanc@in.tum.de>
parents: 2972
diff changeset
   584
| Some_eqvt: "p \<bullet> (Some x) = Some (p \<bullet> x)"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   585
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   586
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   587
  by standard (induct_tac [!] x, simp_all)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   588
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   589
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   590
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   591
subsection {* Permutations for @{typ "'a multiset"} *}
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   592
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   593
instantiation multiset :: (pt) pt
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   594
begin
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   595
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   596
definition
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   597
  "p \<bullet> M = {# p \<bullet> x. x :# M #}"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   598
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   599
instance 
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   600
proof
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   601
  fix M :: "'a multiset" and p q :: "perm"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   602
  show "0 \<bullet> M = M" 
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   603
    unfolding permute_multiset_def
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   604
    by (induct_tac M) (simp_all)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   605
  show "(p + q) \<bullet> M = p \<bullet> q \<bullet> M" 
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   606
    unfolding permute_multiset_def
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   607
    by (induct_tac M) (simp_all)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   608
qed
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   609
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   610
end
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   611
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   612
lemma permute_multiset [simp]:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   613
  fixes M N::"('a::pt) multiset"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   614
  shows "(p \<bullet> {#}) = ({#} ::('a::pt) multiset)"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   615
  and   "(p \<bullet> add_mset x M) = add_mset (p \<bullet> x) (p \<bullet> M)"
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   616
  and   "(p \<bullet> (M + N)) = (p \<bullet> M) + (p \<bullet> N)"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   617
  unfolding permute_multiset_def
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   618
  by (simp_all)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   619
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   620
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   621
subsection {* Permutations for @{typ "'a fset"} *}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   622
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   623
instantiation fset :: (pt) pt
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   624
begin
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   625
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   626
context includes fset.lifting begin
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   627
lift_definition
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   628
  "permute_fset" :: "perm \<Rightarrow> 'a fset \<Rightarrow> 'a fset"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   629
is "permute :: perm \<Rightarrow> 'a set \<Rightarrow> 'a set" by simp
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   630
end
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   631
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   632
context includes fset.lifting begin
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   633
instance 
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   634
proof
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   635
  fix x :: "'a fset" and p q :: "perm"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   636
  show "0 \<bullet> x = x" by transfer simp
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   637
  show "(p + q) \<bullet> x = p \<bullet> q \<bullet> x"  by transfer simp
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   638
qed
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   639
end
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   640
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   641
end
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   642
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   643
context includes fset.lifting
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   644
begin
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   645
lemma permute_fset [simp]:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   646
  fixes S::"('a::pt) fset"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   647
  shows "(p \<bullet> {||}) = ({||} ::('a::pt) fset)"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   648
  and   "(p \<bullet> finsert x S) = finsert (p \<bullet> x) (p \<bullet> S)"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   649
  apply (transfer, simp add: empty_eqvt)
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   650
  apply (transfer, simp add: insert_eqvt)
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   651
  done
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   652
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   653
lemma fset_eqvt: 
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   654
  shows "p \<bullet> (fset S) = fset (p \<bullet> S)"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   655
  by transfer simp
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   656
end
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
   657
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   658
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   659
subsection {* Permutations for @{typ "('a, 'b) finfun"} *}
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   660
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   661
instantiation finfun :: (pt, pt) pt
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   662
begin
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   663
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   664
lift_definition
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   665
  permute_finfun :: "perm \<Rightarrow> ('a, 'b) finfun \<Rightarrow> ('a, 'b) finfun"
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   666
is
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   667
  "permute :: perm \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> ('a \<Rightarrow> 'b)"
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   668
  apply(simp add: permute_fun_comp)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   669
  apply(rule finfun_right_compose)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   670
  apply(rule finfun_left_compose)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   671
  apply(assumption)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   672
  apply(simp)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   673
  done
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   674
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   675
instance
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   676
apply standard
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   677
apply(transfer)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   678
apply(simp)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   679
apply(transfer)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
   680
apply(simp)
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   681
done
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   682
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   683
end
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   684
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
   685
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   686
subsection {* Permutations for @{typ char}, @{typ nat}, and @{typ int} *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   687
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   688
instantiation char :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   689
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   690
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   691
definition "p \<bullet> (c::char) = c"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   692
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   693
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   694
  by standard (simp_all add: permute_char_def)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   695
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   696
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   697
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   698
instantiation nat :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   699
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   700
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   701
definition "p \<bullet> (n::nat) = n"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   702
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   703
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   704
  by standard (simp_all add: permute_nat_def)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   705
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   706
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   707
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   708
instantiation int :: pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   709
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   710
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   711
definition "p \<bullet> (i::int) = i"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   712
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
   713
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   714
  by standard (simp_all add: permute_int_def)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   715
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   716
end
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   717
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   718
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   719
section {* Pure types *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   720
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   721
text {* Pure types will have always empty support. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   722
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   723
class pure = pt +
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   724
  assumes permute_pure: "p \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   725
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   726
text {* Types @{typ unit} and @{typ bool} are pure. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   727
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   728
instance unit :: pure
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   729
proof qed (rule permute_unit_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   730
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   731
instance bool :: pure
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   732
proof qed (rule permute_bool_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   733
2635
64b4cb2c2bf8 simple cases for string rule inductions
Christian Urban <urbanc@in.tum.de>
parents: 2632
diff changeset
   734
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   735
text {* Other type constructors preserve purity. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   736
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   737
instance "fun" :: (pure, pure) pure
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   738
  by standard (simp add: permute_fun_def permute_pure)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   739
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   740
instance set :: (pure) pure
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   741
  by standard (simp add: permute_set_def permute_pure)
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   742
2378
2f13fe48c877 updated to new Isabelle; made FSet more "quiet"
Christian Urban <urbanc@in.tum.de>
parents: 2310
diff changeset
   743
instance prod :: (pure, pure) pure
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   744
  by standard (induct_tac x, simp add: permute_pure)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   745
2378
2f13fe48c877 updated to new Isabelle; made FSet more "quiet"
Christian Urban <urbanc@in.tum.de>
parents: 2310
diff changeset
   746
instance sum :: (pure, pure) pure
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   747
  by standard (induct_tac x, simp_all add: permute_pure)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   748
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   749
instance list :: (pure) pure
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   750
  by standard (induct_tac x, simp_all add: permute_pure)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   751
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   752
instance option :: (pure) pure
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
   753
  by standard (induct_tac x, simp_all add: permute_pure)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   754
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   755
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   756
subsection {* Types @{typ char}, @{typ nat}, and @{typ int} *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   757
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   758
instance char :: pure
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   759
proof qed (rule permute_char_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   760
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   761
instance nat :: pure
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   762
proof qed (rule permute_nat_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   763
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   764
instance int :: pure
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   765
proof qed (rule permute_int_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
   766
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   767
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   768
section {* Infrastructure for Equivariance and @{text Perm_simp} *}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   769
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   770
subsection {* Basic functions about permutations *}
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   771
3201
3e6f4320669f removed "use" - replaced by "ML_file"
Christian Urban <urbanc@in.tum.de>
parents: 3197
diff changeset
   772
ML_file "nominal_basics.ML"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   773
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   774
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   775
subsection {* Eqvt infrastructure *}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   776
3214
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
   777
text {* Setup of the theorem attributes @{text eqvt} and @{text eqvt_raw}. *}
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
   778
                   
3201
3e6f4320669f removed "use" - replaced by "ML_file"
Christian Urban <urbanc@in.tum.de>
parents: 3197
diff changeset
   779
ML_file "nominal_thmdecls.ML"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   780
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   781
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   782
lemmas [eqvt] =
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   783
  (* pt types *)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   784
  permute_prod.simps 
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   785
  permute_list.simps 
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   786
  permute_option.simps 
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   787
  permute_sum.simps
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   788
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   789
  (* sets *)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   790
  empty_eqvt insert_eqvt set_eqvt 
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   791
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   792
  (* fsets *)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   793
  permute_fset fset_eqvt
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   794
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   795
  (* multisets *)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
   796
  permute_multiset
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   797
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   798
subsection {* @{text perm_simp} infrastructure *}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   799
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   800
definition
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   801
  "unpermute p = permute (- p)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   802
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   803
lemma eqvt_apply:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   804
  fixes f :: "'a::pt \<Rightarrow> 'b::pt" 
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   805
  and x :: "'a::pt"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   806
  shows "p \<bullet> (f x) \<equiv> (p \<bullet> f) (p \<bullet> x)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   807
  unfolding permute_fun_def by simp
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   808
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   809
lemma eqvt_lambda:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   810
  fixes f :: "'a::pt \<Rightarrow> 'b::pt"
2753
445518561867 eqvt_lambda without eta-expansion
Christian Urban <urbanc@in.tum.de>
parents: 2743
diff changeset
   811
  shows "p \<bullet> f \<equiv> (\<lambda>x. p \<bullet> (f (unpermute p x)))"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   812
  unfolding permute_fun_def unpermute_def by simp
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   813
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   814
lemma eqvt_bound:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   815
  shows "p \<bullet> unpermute p x \<equiv> x"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   816
  unfolding unpermute_def by simp
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   817
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
   818
text {* provides @{text perm_simp} methods *}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   819
3201
3e6f4320669f removed "use" - replaced by "ML_file"
Christian Urban <urbanc@in.tum.de>
parents: 3197
diff changeset
   820
ML_file "nominal_permeq.ML"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   821
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   822
method_setup perm_simp =
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   823
 {* Nominal_Permeq.args_parser >> Nominal_Permeq.perm_simp_meth *}
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   824
 {* pushes permutations inside. *}
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   825
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   826
method_setup perm_strict_simp =
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   827
 {* Nominal_Permeq.args_parser >> Nominal_Permeq.perm_strict_simp_meth *}
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   828
 {* pushes permutations inside, raises an error if it cannot solve all permutations. *}
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   829
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
   830
simproc_setup perm_simproc ("p \<bullet> t") = {* fn _ => fn ctxt => fn ctrm =>
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
   831
  case Thm.term_of (Thm.dest_arg ctrm) of 
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   832
    Free _ => NONE
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   833
  | Var _ => NONE
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   834
  | Const (@{const_name permute}, _) $ _ $ _ => NONE
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   835
  | _ =>
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   836
      let
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   837
        val thm = Nominal_Permeq.eqvt_conv ctxt Nominal_Permeq.eqvt_strict_config ctrm
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   838
          handle ERROR _ => Thm.reflexive ctrm
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   839
      in
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   840
        if Thm.is_reflexive thm then NONE else SOME(thm)
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   841
      end
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   842
*}
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   843
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   844
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   845
subsubsection {* Equivariance for permutations and swapping *}
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   846
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   847
lemma permute_eqvt:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   848
  shows "p \<bullet> (q \<bullet> x) = (p \<bullet> q) \<bullet> (p \<bullet> x)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   849
  unfolding permute_perm_def by simp
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   850
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   851
(* the normal version of this lemma would cause loops *)
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   852
lemma permute_eqvt_raw [eqvt_raw]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   853
  shows "p \<bullet> permute \<equiv> permute"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   854
apply(simp add: fun_eq_iff permute_fun_def)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   855
apply(subst permute_eqvt)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   856
apply(simp)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   857
done
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   858
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   859
lemma zero_perm_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   860
  shows "p \<bullet> (0::perm) = 0"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   861
  unfolding permute_perm_def by simp
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   862
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   863
lemma add_perm_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   864
  fixes p p1 p2 :: perm
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   865
  shows "p \<bullet> (p1 + p2) = p \<bullet> p1 + p \<bullet> p2"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   866
  unfolding permute_perm_def
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   867
  by (simp add: perm_eq_iff)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   868
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   869
lemma swap_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   870
  shows "p \<bullet> (a \<rightleftharpoons> b) = (p \<bullet> a \<rightleftharpoons> p \<bullet> b)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   871
  unfolding permute_perm_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   872
  by (auto simp: swap_atom perm_eq_iff)
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   873
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   874
lemma uminus_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   875
  fixes p q::"perm"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   876
  shows "p \<bullet> (- q) = - (p \<bullet> q)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   877
  unfolding permute_perm_def
3226
780b7a2c50b6 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3223
diff changeset
   878
  by (simp add: diff_add_eq_diff_diff_swap)
780b7a2c50b6 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3223
diff changeset
   879
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   880
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   881
subsubsection {* Equivariance of Logical Operators *}
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   882
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   883
lemma eq_eqvt [eqvt]:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   884
  shows "p \<bullet> (x = y) \<longleftrightarrow> (p \<bullet> x) = (p \<bullet> y)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   885
  unfolding permute_eq_iff permute_bool_def ..
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   886
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   887
lemma Not_eqvt [eqvt]:
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   888
  shows "p \<bullet> (\<not> A) \<longleftrightarrow> \<not> (p \<bullet> A)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   889
  by (simp add: permute_bool_def)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   890
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   891
lemma conj_eqvt [eqvt]:
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   892
  shows "p \<bullet> (A \<and> B) \<longleftrightarrow> (p \<bullet> A) \<and> (p \<bullet> B)"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   893
  by (simp add: permute_bool_def)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   894
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   895
lemma imp_eqvt [eqvt]:
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   896
  shows "p \<bullet> (A \<longrightarrow> B) \<longleftrightarrow> (p \<bullet> A) \<longrightarrow> (p \<bullet> B)"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   897
  by (simp add: permute_bool_def)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   898
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
   899
declare imp_eqvt[folded HOL.induct_implies_def, eqvt]
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   900
2743
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   901
lemma all_eqvt [eqvt]:
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   902
  shows "p \<bullet> (\<forall>x. P x) = (\<forall>x. (p \<bullet> P) x)"
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   903
  unfolding All_def
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   904
  by (perm_simp) (rule refl)
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   905
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
   906
declare all_eqvt[folded HOL.induct_forall_def, eqvt]
2743
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   907
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   908
lemma ex_eqvt [eqvt]:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   909
  shows "p \<bullet> (\<exists>x. P x) = (\<exists>x. (p \<bullet> P) x)"
2743
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   910
  unfolding Ex_def
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
   911
  by (perm_simp) (rule refl)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   912
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   913
lemma ex1_eqvt [eqvt]:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   914
  shows "p \<bullet> (\<exists>!x. P x) = (\<exists>!x. (p \<bullet> P) x)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   915
  unfolding Ex1_def
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   916
  by (perm_simp) (rule refl)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   917
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   918
lemma if_eqvt [eqvt]:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   919
  shows "p \<bullet> (if b then x else y) = (if p \<bullet> b then p \<bullet> x else p \<bullet> y)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   920
  by (simp add: permute_fun_def permute_bool_def)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   921
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   922
lemma True_eqvt [eqvt]:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   923
  shows "p \<bullet> True = True"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   924
  unfolding permute_bool_def ..
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   925
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   926
lemma False_eqvt [eqvt]:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   927
  shows "p \<bullet> False = False"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   928
  unfolding permute_bool_def ..
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   929
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   930
lemma disj_eqvt [eqvt]:
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   931
  shows "p \<bullet> (A \<or> B) \<longleftrightarrow> (p \<bullet> A) \<or> (p \<bullet> B)"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   932
  by (simp add: permute_bool_def)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   933
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   934
lemma all_eqvt2:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   935
  shows "p \<bullet> (\<forall>x. P x) = (\<forall>x. p \<bullet> P (- p \<bullet> x))"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   936
  by (perm_simp add: permute_minus_cancel) (rule refl)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   937
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   938
lemma ex_eqvt2:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   939
  shows "p \<bullet> (\<exists>x. P x) = (\<exists>x. p \<bullet> P (- p \<bullet> x))"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   940
  by (perm_simp add: permute_minus_cancel) (rule refl)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   941
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   942
lemma ex1_eqvt2:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   943
  shows "p \<bullet> (\<exists>!x. P x) = (\<exists>!x. p \<bullet> P (- p \<bullet> x))"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   944
  by (perm_simp add: permute_minus_cancel) (rule refl)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   945
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   946
lemma the_eqvt:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   947
  assumes unique: "\<exists>!x. P x"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   948
  shows "(p \<bullet> (THE x. P x)) = (THE x. (p \<bullet> P) x)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   949
  apply(rule the1_equality [symmetric])
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   950
  apply(rule_tac p="-p" in permute_boolE)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   951
  apply(perm_simp add: permute_minus_cancel)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   952
  apply(rule unique)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   953
  apply(rule_tac p="-p" in permute_boolE)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   954
  apply(perm_simp add: permute_minus_cancel)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   955
  apply(rule theI'[OF unique])
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   956
  done
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   957
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   958
lemma the_eqvt2:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   959
  assumes unique: "\<exists>!x. P x"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   960
  shows "(p \<bullet> (THE x. P x)) = (THE x. p \<bullet> P (- p \<bullet> x))"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   961
  apply(rule the1_equality [symmetric])
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   962
  apply(simp only: ex1_eqvt2[symmetric])
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   963
  apply(simp add: permute_bool_def unique)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   964
  apply(simp add: permute_bool_def)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   965
  apply(rule theI'[OF unique])
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   966
  done
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   967
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   968
subsubsection {* Equivariance of Set operators *}
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   969
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   970
lemma mem_eqvt [eqvt]:
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   971
  shows "p \<bullet> (x \<in> A) \<longleftrightarrow> (p \<bullet> x) \<in> (p \<bullet> A)"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   972
  unfolding permute_bool_def permute_set_def
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   973
  by (auto)
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   974
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   975
lemma Collect_eqvt [eqvt]:
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   976
  shows "p \<bullet> {x. P x} = {x. (p \<bullet> P) x}"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
   977
  unfolding permute_set_eq permute_fun_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
   978
  by (auto simp: permute_bool_def)
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   979
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   980
lemma Bex_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   981
  shows "p \<bullet> (\<exists>x \<in> S. P x) = (\<exists>x \<in> (p \<bullet> S). (p \<bullet> P) x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   982
  unfolding Bex_def by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   983
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   984
lemma Ball_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   985
  shows "p \<bullet> (\<forall>x \<in> S. P x) = (\<forall>x \<in> (p \<bullet> S). (p \<bullet> P) x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   986
  unfolding Ball_def by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   987
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   988
lemma image_eqvt [eqvt]:
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   989
  shows "p \<bullet> (f ` A) = (p \<bullet> f) ` (p \<bullet> A)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   990
  unfolding image_def by simp
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
   991
3050
7519ebb41145 added eqvt-lemma for Image
Christian Urban <urbanc@in.tum.de>
parents: 3026
diff changeset
   992
lemma Image_eqvt [eqvt]:
7519ebb41145 added eqvt-lemma for Image
Christian Urban <urbanc@in.tum.de>
parents: 3026
diff changeset
   993
  shows "p \<bullet> (R `` A) = (p \<bullet> R) `` (p \<bullet> A)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   994
  unfolding Image_def by simp
3050
7519ebb41145 added eqvt-lemma for Image
Christian Urban <urbanc@in.tum.de>
parents: 3026
diff changeset
   995
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
   996
lemma UNIV_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   997
  shows "p \<bullet> UNIV = UNIV"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
   998
  unfolding UNIV_def 
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
   999
  by (perm_simp) (rule refl)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1000
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1001
lemma inter_eqvt [eqvt]:
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1002
  shows "p \<bullet> (A \<inter> B) = (p \<bullet> A) \<inter> (p \<bullet> B)"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1003
  unfolding Int_def by simp
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1004
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1005
lemma Inter_eqvt [eqvt]:
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1006
  shows "p \<bullet> \<Inter>S = \<Inter>(p \<bullet> S)"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1007
  unfolding Inter_eq by simp
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1008
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1009
lemma union_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1010
  shows "p \<bullet> (A \<union> B) = (p \<bullet> A) \<union> (p \<bullet> B)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1011
  unfolding Un_def by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1012
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1013
lemma Union_eqvt [eqvt]:
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1014
  shows "p \<bullet> \<Union>A = \<Union>(p \<bullet> A)"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1015
  unfolding Union_eq
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1016
  by perm_simp rule
3219
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1017
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1018
lemma Diff_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1019
  fixes A B :: "'a::pt set"
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1020
  shows "p \<bullet> (A - B) = (p \<bullet> A) - (p \<bullet> B)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1021
  unfolding set_diff_eq by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1022
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1023
lemma Compl_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1024
  fixes A :: "'a::pt set"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1025
  shows "p \<bullet> (- A) = - (p \<bullet> A)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1026
  unfolding Compl_eq_Diff_UNIV by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1027
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1028
lemma subset_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1029
  shows "p \<bullet> (S \<subseteq> T) \<longleftrightarrow> (p \<bullet> S) \<subseteq> (p \<bullet> T)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1030
  unfolding subset_eq by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1031
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1032
lemma psubset_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1033
  shows "p \<bullet> (S \<subset> T) \<longleftrightarrow> (p \<bullet> S) \<subset> (p \<bullet> T)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1034
  unfolding psubset_eq by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1035
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1036
lemma vimage_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1037
  shows "p \<bullet> (f -` A) = (p \<bullet> f) -` (p \<bullet> A)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1038
  unfolding vimage_def by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1039
3147
d24e70483051 Clean the proof of Aux
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents: 3134
diff changeset
  1040
lemma foldr_eqvt[eqvt]:
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1041
  "p \<bullet> foldr f xs = foldr (p \<bullet> f) (p \<bullet> xs)"
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1042
  apply(induct xs)
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1043
  apply(simp_all)
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1044
  apply(perm_simp exclude: foldr)
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1045
  apply(simp)
3147
d24e70483051 Clean the proof of Aux
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents: 3134
diff changeset
  1046
  done
d24e70483051 Clean the proof of Aux
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents: 3134
diff changeset
  1047
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1048
(* FIXME: eqvt attribute *)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1049
lemma Sigma_eqvt:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1050
  shows "(p \<bullet> (X \<times> Y)) = (p \<bullet> X) \<times> (p \<bullet> Y)"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1051
unfolding Sigma_def
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1052
by (perm_simp) (rule refl)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1053
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1054
text {* 
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1055
  In order to prove that lfp is equivariant we need two
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1056
  auxiliary classes which specify that (op <=) and
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1057
  Inf are equivariant. Instances for bool and fun are 
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1058
  given.
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1059
*}
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1060
3214
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
  1061
class le_eqvt = order +
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
  1062
  assumes le_eqvt [eqvt]: "p \<bullet> (x \<le> y) = ((p \<bullet> x) \<le> (p \<bullet> (y::('a::{pt, order}))))"
3213
a8724924a62e Manual merge of d121bd2a5a47 from Isabelle/AFP.
webertj
parents: 3202
diff changeset
  1063
a8724924a62e Manual merge of d121bd2a5a47 from Isabelle/AFP.
webertj
parents: 3202
diff changeset
  1064
class inf_eqvt = Inf +
3214
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
  1065
  assumes inf_eqvt [eqvt]: "p \<bullet> (Inf X) = Inf (p \<bullet> (X::('a::{pt, complete_lattice}) set))"
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1066
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1067
instantiation bool :: le_eqvt
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1068
begin
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1069
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1070
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1071
apply standard
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1072
unfolding le_bool_def
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1073
apply(perm_simp)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1074
apply(rule refl)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1075
done
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1076
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1077
end
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1078
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1079
instantiation "fun" :: (pt, le_eqvt) le_eqvt
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1080
begin
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1081
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1082
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1083
apply standard
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1084
unfolding le_fun_def
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1085
apply(perm_simp)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1086
apply(rule refl)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1087
done 
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1088
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1089
end
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1090
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1091
instantiation bool :: inf_eqvt
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1092
begin
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1093
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1094
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1095
apply standard
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1096
unfolding Inf_bool_def
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1097
apply(perm_simp)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1098
apply(rule refl)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1099
done
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1100
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1101
end
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1102
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1103
instantiation "fun" :: (pt, inf_eqvt) inf_eqvt
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1104
begin
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1105
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1106
instance 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1107
apply standard
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1108
unfolding Inf_fun_def
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1109
apply(perm_simp)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1110
apply(rule refl)
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1111
done 
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1112
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1113
end
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1114
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1115
lemma lfp_eqvt [eqvt]:
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1116
  fixes F::"('a \<Rightarrow> 'b) \<Rightarrow> ('a::pt \<Rightarrow> 'b::{inf_eqvt, le_eqvt})"
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1117
  shows "p \<bullet> (lfp F) = lfp (p \<bullet> F)"
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1118
unfolding lfp_def
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1119
by simp
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1120
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1121
lemma finite_eqvt [eqvt]:
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1122
  shows "p \<bullet> finite A = finite (p \<bullet> A)"
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1123
unfolding finite_def
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1124
by simp
2777
75a95431cd8b proved that lfp is equivariant (that simplifies equivariance proofs of inductively defined predicates)
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1125
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1126
lemma fun_upd_eqvt[eqvt]:
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1127
  shows "p \<bullet> (f(x := y)) = (p \<bullet> f)((p \<bullet> x) := (p \<bullet> y))"
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1128
unfolding fun_upd_def
3195
deef21dc972f added eqvt-lemma for function composition
Christian Urban <urbanc@in.tum.de>
parents: 3191
diff changeset
  1129
by simp
deef21dc972f added eqvt-lemma for function composition
Christian Urban <urbanc@in.tum.de>
parents: 3191
diff changeset
  1130
deef21dc972f added eqvt-lemma for function composition
Christian Urban <urbanc@in.tum.de>
parents: 3191
diff changeset
  1131
lemma comp_eqvt [eqvt]:
deef21dc972f added eqvt-lemma for function composition
Christian Urban <urbanc@in.tum.de>
parents: 3191
diff changeset
  1132
  shows "p \<bullet> (f \<circ> g) = (p \<bullet> f) \<circ> (p \<bullet> g)"
deef21dc972f added eqvt-lemma for function composition
Christian Urban <urbanc@in.tum.de>
parents: 3191
diff changeset
  1133
unfolding comp_def
deef21dc972f added eqvt-lemma for function composition
Christian Urban <urbanc@in.tum.de>
parents: 3191
diff changeset
  1134
by simp
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1135
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1136
subsubsection {* Equivariance for product operations *}
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1137
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1138
lemma fst_eqvt [eqvt]:
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1139
  shows "p \<bullet> (fst x) = fst (p \<bullet> x)"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1140
  by (cases x) simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1141
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1142
lemma snd_eqvt [eqvt]:
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1143
  shows "p \<bullet> (snd x) = snd (p \<bullet> x)"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1144
  by (cases x) simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1145
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1146
lemma split_eqvt [eqvt]: 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1147
  shows "p \<bullet> (case_prod P x) = case_prod (p \<bullet> P) (p \<bullet> x)"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1148
  unfolding split_def
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1149
  by simp
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1150
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1151
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1152
subsubsection {* Equivariance for list operations *}
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1153
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1154
lemma append_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1155
  shows "p \<bullet> (xs @ ys) = (p \<bullet> xs) @ (p \<bullet> ys)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1156
  by (induct xs) auto
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1157
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1158
lemma rev_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1159
  shows "p \<bullet> (rev xs) = rev (p \<bullet> xs)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1160
  by (induct xs) (simp_all add: append_eqvt)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1161
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1162
lemma map_eqvt [eqvt]: 
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1163
  shows "p \<bullet> (map f xs) = map (p \<bullet> f) (p \<bullet> xs)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1164
  by (induct xs) (simp_all)
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1165
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1166
lemma removeAll_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1167
  shows "p \<bullet> (removeAll x xs) = removeAll (p \<bullet> x) (p \<bullet> xs)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1168
  by (induct xs) (auto)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1169
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1170
lemma filter_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1171
  shows "p \<bullet> (filter f xs) = filter (p \<bullet> f) (p \<bullet> xs)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1172
apply(induct xs)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1173
apply(simp)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1174
apply(simp only: filter.simps permute_list.simps if_eqvt)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1175
apply(simp only: permute_fun_app_eq)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1176
done
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1177
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1178
lemma distinct_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1179
  shows "p \<bullet> (distinct xs) = distinct (p \<bullet> xs)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1180
apply(induct xs)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1181
apply(simp add: permute_bool_def)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1182
apply(simp add: conj_eqvt Not_eqvt mem_eqvt set_eqvt)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1183
done
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1184
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1185
lemma length_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1186
  shows "p \<bullet> (length xs) = length (p \<bullet> xs)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1187
by (induct xs) (simp_all add: permute_pure)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1188
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1189
2972
84afb941df53 moved eqvt for Option.map
Christian Urban <urbanc@in.tum.de>
parents: 2955
diff changeset
  1190
subsubsection {* Equivariance for @{typ "'a option"} *}
84afb941df53 moved eqvt for Option.map
Christian Urban <urbanc@in.tum.de>
parents: 2955
diff changeset
  1191
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  1192
lemma map_option_eqvt[eqvt]:
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  1193
  shows "p \<bullet> (map_option f x) = map_option (p \<bullet> f) (p \<bullet> x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1194
  by (cases x) (simp_all)
2972
84afb941df53 moved eqvt for Option.map
Christian Urban <urbanc@in.tum.de>
parents: 2955
diff changeset
  1195
84afb941df53 moved eqvt for Option.map
Christian Urban <urbanc@in.tum.de>
parents: 2955
diff changeset
  1196
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1197
subsubsection {* Equivariance for @{typ "'a fset"} *}
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1198
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1199
context includes fset.lifting begin
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1200
lemma in_fset_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1201
  shows "(p \<bullet> (x |\<in>| S)) = ((p \<bullet> x) |\<in>| (p \<bullet> S))"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1202
  by transfer simp
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1203
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1204
lemma union_fset_eqvt [eqvt]:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1205
  shows "(p \<bullet> (S |\<union>| T)) = ((p \<bullet> S) |\<union>| (p \<bullet> T))"
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1206
  by (induct S) (simp_all)
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1207
3101
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
  1208
lemma inter_fset_eqvt [eqvt]:
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
  1209
  shows "(p \<bullet> (S |\<inter>| T)) = ((p \<bullet> S) |\<inter>| (p \<bullet> T))"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1210
  by transfer simp
3101
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
  1211
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
  1212
lemma subset_fset_eqvt [eqvt]:
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
  1213
  shows "(p \<bullet> (S |\<subseteq>| T)) = ((p \<bullet> S) |\<subseteq>| (p \<bullet> T))"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1214
  by transfer simp
3101
09acd7e116e8 added two eqvt lemmas for fset-operators
Christian Urban <urbanc@in.tum.de>
parents: 3065
diff changeset
  1215
  
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1216
lemma map_fset_eqvt [eqvt]: 
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1217
  shows "p \<bullet> (f |`| S) = (p \<bullet> f) |`| (p \<bullet> S)"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1218
  by transfer simp
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1219
end
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1220
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1221
subsubsection {* Equivariance for @{typ "('a, 'b) finfun"} *}
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1222
3189
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1223
lemma finfun_update_eqvt [eqvt]:
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1224
  shows "(p \<bullet> (finfun_update f a b)) = finfun_update (p \<bullet> f) (p \<bullet> a) (p \<bullet> b)"
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1225
by (transfer) (simp)
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1226
3189
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1227
lemma finfun_const_eqvt [eqvt]:
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1228
  shows "(p \<bullet> (finfun_const b)) = finfun_const (p \<bullet> b)"
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1229
by (transfer) (simp)
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1230
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1231
lemma finfun_apply_eqvt [eqvt]:
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  1232
  shows "(p \<bullet> (finfun_apply f b)) = finfun_apply (p \<bullet> f) (p \<bullet> b)"
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  1233
by (transfer) (simp)
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  1234
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1235
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1236
section {* Supp, Freshness and Supports *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1237
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1238
context pt
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1239
begin
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1240
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1241
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1242
  supp :: "'a \<Rightarrow> atom set"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1243
where
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1244
  "supp x = {a. infinite {b. (a \<rightleftharpoons> b) \<bullet> x \<noteq> x}}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1245
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1246
definition
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1247
  fresh :: "atom \<Rightarrow> 'a \<Rightarrow> bool" ("_ \<sharp> _" [55, 55] 55)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1248
where   
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1249
  "a \<sharp> x \<equiv> a \<notin> supp x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1250
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1251
end
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1252
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1253
lemma supp_conv_fresh: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1254
  shows "supp x = {a. \<not> a \<sharp> x}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1255
  unfolding fresh_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1256
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1257
lemma swap_rel_trans:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1258
  assumes "sort_of a = sort_of b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1259
  assumes "sort_of b = sort_of c"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1260
  assumes "(a \<rightleftharpoons> c) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1261
  assumes "(b \<rightleftharpoons> c) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1262
  shows "(a \<rightleftharpoons> b) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1263
proof (cases)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1264
  assume "a = b \<or> c = b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1265
  with assms show "(a \<rightleftharpoons> b) \<bullet> x = x" by auto
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1266
next
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1267
  assume *: "\<not> (a = b \<or> c = b)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1268
  have "((a \<rightleftharpoons> c) + (b \<rightleftharpoons> c) + (a \<rightleftharpoons> c)) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1269
    using assms by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1270
  also have "(a \<rightleftharpoons> c) + (b \<rightleftharpoons> c) + (a \<rightleftharpoons> c) = (a \<rightleftharpoons> b)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1271
    using assms * by (simp add: swap_triple)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1272
  finally show "(a \<rightleftharpoons> b) \<bullet> x = x" .
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1273
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1274
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1275
lemma swap_fresh_fresh:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1276
  assumes a: "a \<sharp> x" 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1277
  and     b: "b \<sharp> x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1278
  shows "(a \<rightleftharpoons> b) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1279
proof (cases)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1280
  assume asm: "sort_of a = sort_of b" 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1281
  have "finite {c. (a \<rightleftharpoons> c) \<bullet> x \<noteq> x}" "finite {c. (b \<rightleftharpoons> c) \<bullet> x \<noteq> x}" 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1282
    using a b unfolding fresh_def supp_def by simp_all
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1283
  then have "finite ({c. (a \<rightleftharpoons> c) \<bullet> x \<noteq> x} \<union> {c. (b \<rightleftharpoons> c) \<bullet> x \<noteq> x})" by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1284
  then obtain c 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1285
    where "(a \<rightleftharpoons> c) \<bullet> x = x" "(b \<rightleftharpoons> c) \<bullet> x = x" "sort_of c = sort_of b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1286
    by (rule obtain_atom) (auto)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1287
  then show "(a \<rightleftharpoons> b) \<bullet> x = x" using asm by (rule_tac swap_rel_trans) (simp_all)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1288
next
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1289
  assume "sort_of a \<noteq> sort_of b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1290
  then show "(a \<rightleftharpoons> b) \<bullet> x = x" by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1291
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1292
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1293
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1294
subsection {* supp and fresh are equivariant *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1295
2760
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1296
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1297
lemma supp_eqvt [eqvt]:
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1298
  shows "p \<bullet> (supp x) = supp (p \<bullet> x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1299
  unfolding supp_def by simp
2760
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1300
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1301
lemma fresh_eqvt [eqvt]:
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1302
  shows "p \<bullet> (a \<sharp> x) = (p \<bullet> a) \<sharp> (p \<bullet> x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1303
  unfolding fresh_def by simp
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1304
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1305
lemma fresh_permute_iff:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1306
  shows "(p \<bullet> a) \<sharp> (p \<bullet> x) \<longleftrightarrow> a \<sharp> x"
2760
8f833ebc4b58 eqvt of supp and fresh is proved using equivariance infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 2753
diff changeset
  1307
  by (simp only: fresh_eqvt[symmetric] permute_bool_def)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1308
2683
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1309
lemma fresh_permute_left:
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1310
  shows "a \<sharp> p \<bullet> x \<longleftrightarrow> - p \<bullet> a \<sharp> x"
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1311
proof
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1312
  assume "a \<sharp> p \<bullet> x"
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1313
  then have "- p \<bullet> a \<sharp> - p \<bullet> p \<bullet> x" by (simp only: fresh_permute_iff)
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1314
  then show "- p \<bullet> a \<sharp> x" by simp
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1315
next
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1316
  assume "- p \<bullet> a \<sharp> x"
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1317
  then have "p \<bullet> - p \<bullet> a \<sharp> p \<bullet> x" by (simp only: fresh_permute_iff)
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1318
  then show "a \<sharp> p \<bullet> x" by simp
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1319
qed
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1320
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  1321
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1322
section {* supports *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1323
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1324
definition
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1325
  supports :: "atom set \<Rightarrow> 'a::pt \<Rightarrow> bool" (infixl "supports" 80)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1326
where  
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1327
  "S supports x \<equiv> \<forall>a b. (a \<notin> S \<and> b \<notin> S \<longrightarrow> (a \<rightleftharpoons> b) \<bullet> x = x)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1328
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1329
lemma supp_is_subset:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1330
  fixes S :: "atom set"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1331
  and   x :: "'a::pt"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1332
  assumes a1: "S supports x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1333
  and     a2: "finite S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1334
  shows "(supp x) \<subseteq> S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1335
proof (rule ccontr)
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1336
  assume "\<not> (supp x \<subseteq> S)"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1337
  then obtain a where b1: "a \<in> supp x" and b2: "a \<notin> S" by auto
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1338
  from a1 b2 have "\<forall>b. b \<notin> S \<longrightarrow> (a \<rightleftharpoons> b) \<bullet> x = x" unfolding supports_def by auto
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1339
  then have "{b. (a \<rightleftharpoons> b) \<bullet> x \<noteq> x} \<subseteq> S" by auto
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1340
  with a2 have "finite {b. (a \<rightleftharpoons> b) \<bullet> x \<noteq> x}" by (simp add: finite_subset)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1341
  then have "a \<notin> (supp x)" unfolding supp_def by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1342
  with b1 show False by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1343
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1344
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1345
lemma supports_finite:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1346
  fixes S :: "atom set"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1347
  and   x :: "'a::pt"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1348
  assumes a1: "S supports x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1349
  and     a2: "finite S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1350
  shows "finite (supp x)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1351
proof -
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1352
  have "(supp x) \<subseteq> S" using a1 a2 by (rule supp_is_subset)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1353
  then show "finite (supp x)" using a2 by (simp add: finite_subset)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1354
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1355
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1356
lemma supp_supports:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1357
  fixes x :: "'a::pt"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1358
  shows "(supp x) supports x"
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1359
unfolding supports_def
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1360
proof (intro strip)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1361
  fix a b
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1362
  assume "a \<notin> (supp x) \<and> b \<notin> (supp x)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1363
  then have "a \<sharp> x" and "b \<sharp> x" by (simp_all add: fresh_def)
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1364
  then show "(a \<rightleftharpoons> b) \<bullet> x = x" by (simp add: swap_fresh_fresh)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1365
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1366
2955
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1367
lemma supports_fresh:
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1368
  fixes x :: "'a::pt"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1369
  assumes a1: "S supports x"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1370
  and     a2: "finite S"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1371
  and     a3: "a \<notin> S"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1372
  shows "a \<sharp> x"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1373
unfolding fresh_def
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1374
proof -
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1375
  have "(supp x) \<subseteq> S" using a1 a2 by (rule supp_is_subset)
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1376
  then show "a \<notin> (supp x)" using a3 by auto
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1377
qed
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1378
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1379
lemma supp_is_least_supports:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1380
  fixes S :: "atom set"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1381
  and   x :: "'a::pt"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1382
  assumes  a1: "S supports x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1383
  and      a2: "finite S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1384
  and      a3: "\<And>S'. finite S' \<Longrightarrow> (S' supports x) \<Longrightarrow> S \<subseteq> S'"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1385
  shows "(supp x) = S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1386
proof (rule equalityI)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1387
  show "(supp x) \<subseteq> S" using a1 a2 by (rule supp_is_subset)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1388
  with a2 have fin: "finite (supp x)" by (rule rev_finite_subset)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1389
  have "(supp x) supports x" by (rule supp_supports)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1390
  with fin a3 show "S \<subseteq> supp x" by blast
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1391
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1392
2955
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1393
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1394
lemma subsetCI: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1395
  shows "(\<And>x. x \<in> A \<Longrightarrow> x \<notin> B \<Longrightarrow> False) \<Longrightarrow> A \<subseteq> B"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1396
  by auto
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1397
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1398
lemma finite_supp_unique:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1399
  assumes a1: "S supports x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1400
  assumes a2: "finite S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1401
  assumes a3: "\<And>a b. \<lbrakk>a \<in> S; b \<notin> S; sort_of a = sort_of b\<rbrakk> \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> x \<noteq> x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1402
  shows "(supp x) = S"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1403
  using a1 a2
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1404
proof (rule supp_is_least_supports)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1405
  fix S'
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1406
  assume "finite S'" and "S' supports x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1407
  show "S \<subseteq> S'"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1408
  proof (rule subsetCI)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1409
    fix a
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1410
    assume "a \<in> S" and "a \<notin> S'"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1411
    have "finite (S \<union> S')"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1412
      using `finite S` `finite S'` by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1413
    then obtain b where "b \<notin> S \<union> S'" and "sort_of b = sort_of a"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1414
      by (rule obtain_atom)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1415
    then have "b \<notin> S" and "b \<notin> S'"  and "sort_of a = sort_of b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1416
      by simp_all
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1417
    then have "(a \<rightleftharpoons> b) \<bullet> x = x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1418
      using `a \<notin> S'` `S' supports x` by (simp add: supports_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1419
    moreover have "(a \<rightleftharpoons> b) \<bullet> x \<noteq> x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1420
      using `a \<in> S` `b \<notin> S` `sort_of a = sort_of b`
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1421
      by (rule a3)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1422
    ultimately show "False" by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1423
  qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1424
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1425
2475
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1426
section {* Support w.r.t. relations *}
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1427
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1428
text {* 
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1429
  This definition is used for unquotient types, where
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1430
  alpha-equivalence does not coincide with equality.
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1431
*}
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1432
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1433
definition 
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1434
  "supp_rel R x = {a. infinite {b. \<not>(R ((a \<rightleftharpoons> b) \<bullet> x) x)}}"
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1435
486d4647bb37 supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents: 2470
diff changeset
  1436
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1437
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1438
section {* Finitely-supported types *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1439
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1440
class fs = pt +
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1441
  assumes finite_supp: "finite (supp x)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1442
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1443
lemma pure_supp: 
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1444
  fixes x::"'a::pure"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1445
  shows "supp x = {}"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1446
  unfolding supp_def by (simp add: permute_pure)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1447
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1448
lemma pure_fresh:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1449
  fixes x::"'a::pure"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1450
  shows "a \<sharp> x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1451
  unfolding fresh_def by (simp add: pure_supp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1452
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1453
instance pure < fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1454
  by standard (simp add: pure_supp)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1455
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1456
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1457
subsection  {* Type @{typ atom} is finitely-supported. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1458
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1459
lemma supp_atom:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1460
  shows "supp a = {a}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1461
apply (rule finite_supp_unique)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1462
apply (clarsimp simp add: supports_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1463
apply simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1464
apply simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1465
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1466
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1467
lemma fresh_atom: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1468
  shows "a \<sharp> b \<longleftrightarrow> a \<noteq> b"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1469
  unfolding fresh_def supp_atom by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1470
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1471
instance atom :: fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1472
  by standard (simp add: supp_atom)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1473
1933
9eab1dfc14d2 moved lemmas from FSet.thy to do with atom to Nominal2_Base, and to do with 'a::at set to Nominal2_Atoms; moved Nominal2_Eqvt.thy one up to be loaded before Nominal2_Atoms
Christian Urban <urbanc@in.tum.de>
parents: 1932
diff changeset
  1474
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1475
section {* Type @{typ perm} is finitely-supported. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1476
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1477
lemma perm_swap_eq:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1478
  shows "(a \<rightleftharpoons> b) \<bullet> p = p \<longleftrightarrow> (p \<bullet> (a \<rightleftharpoons> b)) = (a \<rightleftharpoons> b)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1479
unfolding permute_perm_def
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1480
by (metis add_diff_cancel minus_perm_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1481
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1482
lemma supports_perm: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1483
  shows "{a. p \<bullet> a \<noteq> a} supports p"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1484
  unfolding supports_def
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1485
  unfolding perm_swap_eq
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1486
  by (simp add: swap_eqvt)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1487
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1488
lemma finite_perm_lemma: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1489
  shows "finite {a::atom. p \<bullet> a \<noteq> a}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1490
  using finite_Rep_perm [of p]
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1491
  unfolding permute_atom_def .
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1492
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1493
lemma supp_perm:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1494
  shows "supp p = {a. p \<bullet> a \<noteq> a}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1495
apply (rule finite_supp_unique)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1496
apply (rule supports_perm)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1497
apply (rule finite_perm_lemma)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1498
apply (simp add: perm_swap_eq swap_eqvt)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1499
apply (auto simp: perm_eq_iff swap_atom)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1500
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1501
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1502
lemma fresh_perm: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1503
  shows "a \<sharp> p \<longleftrightarrow> p \<bullet> a = a"
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1504
  unfolding fresh_def 
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1505
  by (simp add: supp_perm)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1506
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1507
lemma supp_swap:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1508
  shows "supp (a \<rightleftharpoons> b) = (if a = b \<or> sort_of a \<noteq> sort_of b then {} else {a, b})"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1509
  by (auto simp: supp_perm swap_atom)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1510
3221
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  1511
lemma fresh_swap:
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  1512
  shows "a \<sharp> (b \<rightleftharpoons> c) \<longleftrightarrow> (sort_of b \<noteq> sort_of c) \<or> b = c \<or> (a \<sharp> b \<and> a \<sharp> c)"
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  1513
  by (simp add: fresh_def supp_swap supp_atom)
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  1514
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1515
lemma fresh_zero_perm: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1516
  shows "a \<sharp> (0::perm)"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1517
  unfolding fresh_perm by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1518
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1519
lemma supp_zero_perm: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1520
  shows "supp (0::perm) = {}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1521
  unfolding supp_perm by simp
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1522
1087
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1523
lemma fresh_plus_perm:
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1524
  fixes p q::perm
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1525
  assumes "a \<sharp> p" "a \<sharp> q"
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1526
  shows "a \<sharp> (p + q)"
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1527
  using assms
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1528
  unfolding fresh_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1529
  by (auto simp: supp_perm)
1087
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1530
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1531
lemma supp_plus_perm:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1532
  fixes p q::perm
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1533
  shows "supp (p + q) \<subseteq> supp p \<union> supp q"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1534
  by (auto simp: supp_perm)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1535
1087
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1536
lemma fresh_minus_perm:
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1537
  fixes p::perm
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1538
  shows "a \<sharp> (- p) \<longleftrightarrow> a \<sharp> p"
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1539
  unfolding fresh_def
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1540
  unfolding supp_perm
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1541
  apply(simp)
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1542
  apply(metis permute_minus_cancel)
1087
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1543
  done
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1544
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1545
lemma supp_minus_perm:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1546
  fixes p::perm
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1547
  shows "supp (- p) = supp p"
1087
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1548
  unfolding supp_conv_fresh
bb7f4457091a moved some lemmas to Nominal; updated all files
Christian Urban <urbanc@in.tum.de>
parents: 1062
diff changeset
  1549
  by (simp add: fresh_minus_perm)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1550
1305
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1551
lemma plus_perm_eq:
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1552
  fixes p q::"perm"
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1553
  assumes asm: "supp p \<inter> supp q = {}"
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1554
  shows "p + q = q + p"
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1555
unfolding perm_eq_iff
1305
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1556
proof
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1557
  fix a::"atom"
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1558
  show "(p + q) \<bullet> a = (q + p) \<bullet> a"
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1559
  proof -
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1560
    { assume "a \<notin> supp p" "a \<notin> supp q"
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1561
      then have "(p + q) \<bullet> a = (q + p) \<bullet> a" 
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  1562
        by (simp add: supp_perm)
1305
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1563
    }
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1564
    moreover
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1565
    { assume a: "a \<in> supp p" "a \<notin> supp q"
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1566
      then have "p \<bullet> a \<in> supp p" by (simp add: supp_perm)
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1567
      then have "p \<bullet> a \<notin> supp q" using asm by auto
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1568
      with a have "(p + q) \<bullet> a = (q + p) \<bullet> a" 
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  1569
        by (simp add: supp_perm)
1305
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1570
    }
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1571
    moreover
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1572
    { assume a: "a \<notin> supp p" "a \<in> supp q"
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1573
      then have "q \<bullet> a \<in> supp q" by (simp add: supp_perm)
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1574
      then have "q \<bullet> a \<notin> supp p" using asm by auto 
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1575
      with a have "(p + q) \<bullet> a = (q + p) \<bullet> a" 
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  1576
        by (simp add: supp_perm)
1305
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1577
    }
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1578
    ultimately show "(p + q) \<bullet> a = (q + p) \<bullet> a" 
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1579
      using asm by blast
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1580
  qed
61319a9af976 updated (added lemma about commuting permutations)
Christian Urban <urbanc@in.tum.de>
parents: 1258
diff changeset
  1581
qed
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1582
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1583
lemma supp_plus_perm_eq:
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1584
  fixes p q::perm
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1585
  assumes asm: "supp p \<inter> supp q = {}"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1586
  shows "supp (p + q) = supp p \<union> supp q"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1587
proof -
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1588
  { fix a::"atom"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1589
    assume "a \<in> supp p"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1590
    then have "a \<notin> supp q" using asm by auto
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1591
    then have "a \<in> supp (p + q)" using `a \<in> supp p` 
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1592
      by (simp add: supp_perm)
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1593
  }
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1594
  moreover
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1595
  { fix a::"atom"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1596
    assume "a \<in> supp q"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1597
    then have "a \<notin> supp p" using asm by auto
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1598
    then have "a \<in> supp (q + p)" using `a \<in> supp q` 
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1599
      by (simp add: supp_perm)
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1600
    then have "a \<in> supp (p + q)" using asm plus_perm_eq
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1601
      by metis
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1602
  }
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1603
  ultimately have "supp p \<union> supp q \<subseteq> supp (p + q)"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1604
    by blast
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1605
  then show "supp (p + q) = supp p \<union> supp q" using supp_plus_perm
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1606
    by blast
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1607
qed
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1608
3219
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1609
lemma perm_eq_iff2:
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1610
  fixes p q :: "perm"
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1611
  shows "p = q \<longleftrightarrow> (\<forall>a::atom \<in> supp p \<union> supp q. p \<bullet> a = q \<bullet> a)"
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1612
  unfolding perm_eq_iff
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1613
  apply(auto)
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1614
  apply(case_tac "a \<sharp> p \<and> a \<sharp> q")
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1615
  apply(simp add: fresh_perm)
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1616
  apply(simp add: fresh_def)
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1617
  done
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1618
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  1619
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1620
instance perm :: fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1621
  by standard (simp add: supp_perm finite_perm_lemma)
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1622
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1623
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  1624
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1625
section {* Finite Support instances for other types *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1626
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  1627
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1628
subsection {* Type @{typ "'a \<times> 'b"} is finitely-supported. *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1629
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1630
lemma supp_Pair: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1631
  shows "supp (x, y) = supp x \<union> supp y"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1632
  by (simp add: supp_def Collect_imp_eq Collect_neg_eq)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1633
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1634
lemma fresh_Pair: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1635
  shows "a \<sharp> (x, y) \<longleftrightarrow> a \<sharp> x \<and> a \<sharp> y"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1636
  by (simp add: fresh_def supp_Pair)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1637
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1638
lemma supp_Unit:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1639
  shows "supp () = {}"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1640
  by (simp add: supp_def)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1641
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1642
lemma fresh_Unit:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1643
  shows "a \<sharp> ()"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1644
  by (simp add: fresh_def supp_Unit)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1645
2378
2f13fe48c877 updated to new Isabelle; made FSet more "quiet"
Christian Urban <urbanc@in.tum.de>
parents: 2310
diff changeset
  1646
instance prod :: (fs, fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1647
apply standard
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1648
apply (case_tac x)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1649
apply (simp add: supp_Pair finite_supp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1650
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1651
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  1652
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1653
subsection {* Type @{typ "'a + 'b"} is finitely supported *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1654
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1655
lemma supp_Inl: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1656
  shows "supp (Inl x) = supp x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1657
  by (simp add: supp_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1658
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1659
lemma supp_Inr: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1660
  shows "supp (Inr x) = supp x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1661
  by (simp add: supp_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1662
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1663
lemma fresh_Inl: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1664
  shows "a \<sharp> Inl x \<longleftrightarrow> a \<sharp> x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1665
  by (simp add: fresh_def supp_Inl)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1666
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1667
lemma fresh_Inr: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1668
  shows "a \<sharp> Inr y \<longleftrightarrow> a \<sharp> y"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1669
  by (simp add: fresh_def supp_Inr)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1670
2378
2f13fe48c877 updated to new Isabelle; made FSet more "quiet"
Christian Urban <urbanc@in.tum.de>
parents: 2310
diff changeset
  1671
instance sum :: (fs, fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1672
apply standard
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1673
apply (case_tac x)
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1674
apply (simp_all add: supp_Inl supp_Inr finite_supp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1675
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1676
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  1677
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1678
subsection {* Type @{typ "'a option"} is finitely supported *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1679
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1680
lemma supp_None: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1681
  shows "supp None = {}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1682
by (simp add: supp_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1683
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1684
lemma supp_Some: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1685
  shows "supp (Some x) = supp x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1686
  by (simp add: supp_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1687
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1688
lemma fresh_None: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1689
  shows "a \<sharp> None"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1690
  by (simp add: fresh_def supp_None)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1691
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1692
lemma fresh_Some: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1693
  shows "a \<sharp> Some x \<longleftrightarrow> a \<sharp> x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1694
  by (simp add: fresh_def supp_Some)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1695
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1696
instance option :: (fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1697
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1698
apply (induct_tac x)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1699
apply (simp_all add: supp_None supp_Some finite_supp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1700
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1701
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  1702
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1703
subsubsection {* Type @{typ "'a list"} is finitely supported *}
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1704
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1705
lemma supp_Nil: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1706
  shows "supp [] = {}"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1707
  by (simp add: supp_def)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1708
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1709
lemma fresh_Nil: 
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1710
  shows "a \<sharp> []"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1711
  by (simp add: fresh_def supp_Nil)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1712
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1713
lemma supp_Cons: 
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1714
  shows "supp (x # xs) = supp x \<union> supp xs"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1715
by (simp add: supp_def Collect_imp_eq Collect_neg_eq)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1716
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1717
lemma fresh_Cons: 
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1718
  shows "a \<sharp> (x # xs) \<longleftrightarrow> a \<sharp> x \<and> a \<sharp> xs"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1719
  by (simp add: fresh_def supp_Cons)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1720
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1721
lemma supp_append:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1722
  shows "supp (xs @ ys) = supp xs \<union> supp ys"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1723
  by (induct xs) (auto simp: supp_Nil supp_Cons)
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1724
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1725
lemma fresh_append:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1726
  shows "a \<sharp> (xs @ ys) \<longleftrightarrow> a \<sharp> xs \<and> a \<sharp> ys"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1727
  by (induct xs) (simp_all add: fresh_Nil fresh_Cons)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  1728
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1729
lemma supp_rev:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1730
  shows "supp (rev xs) = supp xs"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1731
  by (induct xs) (auto simp: supp_append supp_Cons supp_Nil)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1732
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1733
lemma fresh_rev:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1734
  shows "a \<sharp> rev xs \<longleftrightarrow> a \<sharp> xs"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1735
  by (induct xs) (auto simp: fresh_append fresh_Cons fresh_Nil)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1736
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1737
lemma supp_removeAll:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1738
  fixes x::"atom"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1739
  shows "supp (removeAll x xs) = supp xs - {x}"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1740
  by (induct xs)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  1741
     (auto simp: supp_Nil supp_Cons supp_atom)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1742
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1743
lemma supp_of_atom_list:
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1744
  fixes as::"atom list"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1745
  shows "supp as = set as"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1746
by (induct as)
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1747
   (simp_all add: supp_Nil supp_Cons supp_atom)
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1748
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1749
instance list :: (fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1750
apply standard
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1751
apply (induct_tac x)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1752
apply (simp_all add: supp_Nil supp_Cons finite_supp)
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1753
done
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1754
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  1755
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  1756
section {* Support and Freshness for Applications *}
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1757
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1758
lemma fresh_conv_MOST: 
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1759
  shows "a \<sharp> x \<longleftrightarrow> (MOST b. (a \<rightleftharpoons> b) \<bullet> x = x)"
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1760
  unfolding fresh_def supp_def 
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1761
  unfolding MOST_iff_cofinite by simp
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1762
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1763
lemma fresh_fun_app:
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1764
  assumes "a \<sharp> f" and "a \<sharp> x" 
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1765
  shows "a \<sharp> f x"
2003
b53e98bfb298 added lemmas establishing the support of finite sets of finitely supported elements
Christian Urban <urbanc@in.tum.de>
parents: 1973
diff changeset
  1766
  using assms
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1767
  unfolding fresh_conv_MOST
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1768
  unfolding permute_fun_app_eq
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  1769
  by (elim MOST_rev_mp) (simp)
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1770
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1771
lemma supp_fun_app:
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1772
  shows "supp (f x) \<subseteq> (supp f) \<union> (supp x)"
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1773
  using fresh_fun_app
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1774
  unfolding fresh_def
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1775
  by auto
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1776
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  1777
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1778
subsection {* Equivariance Predicate @{text eqvt} and @{text eqvt_at}*}
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1779
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1780
definition
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1781
  "eqvt f \<equiv> \<forall>p. p \<bullet> f = f"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1782
2868
2b8e387d2dfc got rid of the boolean flag in the raw_equivariance function
Christian Urban <urbanc@in.tum.de>
parents: 2849
diff changeset
  1783
lemma eqvt_boolI:
2b8e387d2dfc got rid of the boolean flag in the raw_equivariance function
Christian Urban <urbanc@in.tum.de>
parents: 2849
diff changeset
  1784
  fixes f::"bool"
2b8e387d2dfc got rid of the boolean flag in the raw_equivariance function
Christian Urban <urbanc@in.tum.de>
parents: 2849
diff changeset
  1785
  shows "eqvt f"
2b8e387d2dfc got rid of the boolean flag in the raw_equivariance function
Christian Urban <urbanc@in.tum.de>
parents: 2849
diff changeset
  1786
unfolding eqvt_def by (simp add: permute_bool_def)
2b8e387d2dfc got rid of the boolean flag in the raw_equivariance function
Christian Urban <urbanc@in.tum.de>
parents: 2849
diff changeset
  1787
2b8e387d2dfc got rid of the boolean flag in the raw_equivariance function
Christian Urban <urbanc@in.tum.de>
parents: 2849
diff changeset
  1788
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1789
text {* equivariance of a function at a given argument *}
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1790
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1791
definition
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1792
 "eqvt_at f x \<equiv> \<forall>p. p \<bullet> (f x) = f (p \<bullet> x)"
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1793
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1794
lemma eqvtI:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1795
  shows "(\<And>p. p \<bullet> f \<equiv> f) \<Longrightarrow> eqvt f"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1796
unfolding eqvt_def
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1797
by simp
2003
b53e98bfb298 added lemmas establishing the support of finite sets of finitely supported elements
Christian Urban <urbanc@in.tum.de>
parents: 1973
diff changeset
  1798
2955
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1799
lemma eqvt_at_perm:
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1800
  assumes "eqvt_at f x"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1801
  shows "eqvt_at f (q \<bullet> x)"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1802
proof -
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1803
  { fix p::"perm"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1804
    have "p \<bullet> (f (q \<bullet> x)) = p \<bullet> q \<bullet> (f x)"
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1805
      using assms by (simp add: eqvt_at_def)
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1806
    also have "\<dots> = (p + q) \<bullet> (f x)" by simp
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1807
    also have "\<dots> = f ((p + q) \<bullet> x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  1808
      using assms by (simp only: eqvt_at_def)
2955
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1809
    finally have "p \<bullet> (f (q \<bullet> x)) = f (p \<bullet> q \<bullet> x)" by simp } 
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1810
  then show "eqvt_at f (q \<bullet> x)" unfolding eqvt_at_def
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1811
    by simp
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1812
qed
4049a2651dd9 more on the NBE function
Christian Urban <urbanc@in.tum.de>
parents: 2948
diff changeset
  1813
1941
Christian Urban <urbanc@in.tum.de>
parents: 1933
diff changeset
  1814
lemma supp_fun_eqvt:
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1815
  assumes a: "eqvt f"
1941
Christian Urban <urbanc@in.tum.de>
parents: 1933
diff changeset
  1816
  shows "supp f = {}"
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1817
  using a
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1818
  unfolding eqvt_def
1941
Christian Urban <urbanc@in.tum.de>
parents: 1933
diff changeset
  1819
  unfolding supp_def 
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1820
  by simp
1941
Christian Urban <urbanc@in.tum.de>
parents: 1933
diff changeset
  1821
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1822
lemma fresh_fun_eqvt:
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1823
  assumes a: "eqvt f"
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1824
  shows "a \<sharp> f"
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1825
  using a
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1826
  unfolding fresh_def
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1827
  by (simp add: supp_fun_eqvt)
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1828
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1829
lemma fresh_fun_eqvt_app:
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1830
  assumes a: "eqvt f"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1831
  shows "a \<sharp> x \<Longrightarrow> a \<sharp> f x"
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1832
proof -
1941
Christian Urban <urbanc@in.tum.de>
parents: 1933
diff changeset
  1833
  from a have "supp f = {}" by (simp add: supp_fun_eqvt)
1879
869d1183e082 tuned proofs
Christian Urban <urbanc@in.tum.de>
parents: 1833
diff changeset
  1834
  then show "a \<sharp> x \<Longrightarrow> a \<sharp> f x"
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1835
    unfolding fresh_def
2003
b53e98bfb298 added lemmas establishing the support of finite sets of finitely supported elements
Christian Urban <urbanc@in.tum.de>
parents: 1973
diff changeset
  1836
    using supp_fun_app by auto
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1837
qed
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  1838
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1839
lemma supp_fun_app_eqvt:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1840
  assumes a: "eqvt f"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1841
  shows "supp (f x) \<subseteq> supp x"
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1842
  using fresh_fun_eqvt_app[OF a]
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1843
  unfolding fresh_def
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1844
  by auto
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1845
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1846
lemma supp_eqvt_at:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1847
  assumes asm: "eqvt_at f x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1848
  and     fin: "finite (supp x)"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1849
  shows "supp (f x) \<subseteq> supp x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1850
apply(rule supp_is_subset)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1851
unfolding supports_def
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1852
unfolding fresh_def[symmetric]
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1853
using asm
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1854
apply(simp add: eqvt_at_def)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1855
apply(simp add: swap_fresh_fresh)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1856
apply(rule fin)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1857
done
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1858
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1859
lemma finite_supp_eqvt_at:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1860
  assumes asm: "eqvt_at f x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1861
  and     fin: "finite (supp x)"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1862
  shows "finite (supp (f x))"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1863
apply(rule finite_subset)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1864
apply(rule supp_eqvt_at[OF asm fin])
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1865
apply(rule fin)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1866
done
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1867
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1868
lemma fresh_eqvt_at:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1869
  assumes asm: "eqvt_at f x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1870
  and     fin: "finite (supp x)"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1871
  and     fresh: "a \<sharp> x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1872
  shows "a \<sharp> f x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1873
using fresh
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1874
unfolding fresh_def
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1875
using supp_eqvt_at[OF asm fin]
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1876
by auto
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1877
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1878
text {* for handling of freshness of functions *}
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1879
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
  1880
simproc_setup fresh_fun_simproc ("a \<sharp> (f::'a::pt \<Rightarrow>'b::pt)") = {* fn _ => fn ctxt => fn ctrm =>
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1881
  let 
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1882
    val _ $ _ $ f = Thm.term_of ctrm
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1883
  in
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1884
    case (Term.add_frees f [], Term.add_vars f []) of
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1885
      ([], []) => SOME(@{thm fresh_fun_eqvt[simplified eqvt_def, THEN Eq_TrueI]})
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1886
    | (x::_, []) =>
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1887
      let
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1888
        val argx = Free x
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1889
        val absf = absfree x f
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1890
        val cty_inst =
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1891
          [SOME (Thm.ctyp_of ctxt (fastype_of argx)), SOME (Thm.ctyp_of ctxt (fastype_of f))]
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  1892
        val ctrm_inst = [NONE, SOME (Thm.cterm_of ctxt absf), SOME (Thm.cterm_of ctxt argx)] 
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  1893
        val thm = Thm.instantiate' cty_inst ctrm_inst @{thm fresh_fun_app}
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1894
      in
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1895
        SOME(thm RS @{thm Eq_TrueI}) 
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1896
      end  
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1897
    | (_, _) => NONE
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1898
  end
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  1899
*}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  1900
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  1901
subsection {* helper functions for @{text nominal_functions} *}
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1902
2818
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1903
lemma THE_defaultI2:
2849
31c338d562fd tuned some proofs
Christian Urban <urbanc@in.tum.de>
parents: 2848
diff changeset
  1904
  assumes "\<exists>!x. P x" "\<And>x. P x \<Longrightarrow> Q x"
2818
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1905
  shows "Q (THE_default d P)"
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1906
by (iprover intro: assms THE_defaultI')
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1907
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1908
lemma the_default_eqvt:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1909
  assumes unique: "\<exists>!x. P x"
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1910
  shows "(p \<bullet> (THE_default d P)) = (THE_default (p \<bullet> d) (p \<bullet> P))"
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1911
  apply(rule THE_default1_equality [symmetric])
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1912
  apply(rule_tac p="-p" in permute_boolE)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1913
  apply(simp add: ex1_eqvt)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1914
  apply(rule unique)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1915
  apply(rule_tac p="-p" in permute_boolE)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1916
  apply(rule subst[OF permute_fun_app_eq])
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1917
  apply(simp)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1918
  apply(rule THE_defaultI'[OF unique])
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1919
  done
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1920
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1921
lemma fundef_ex1_eqvt:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1922
  fixes x::"'a::pt"
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1923
  assumes f_def: "f == (\<lambda>x::'a. THE_default (d x) (G x))"
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1924
  assumes eqvt: "eqvt G"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1925
  assumes ex1: "\<exists>!y. G x y"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1926
  shows "(p \<bullet> (f x)) = f (p \<bullet> x)"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1927
  apply(simp only: f_def)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1928
  apply(subst the_default_eqvt)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1929
  apply(rule ex1)
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1930
  apply(rule THE_default1_equality [symmetric])
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1931
  apply(rule_tac p="-p" in permute_boolE)
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1932
  apply(perm_simp add: permute_minus_cancel)
2849
31c338d562fd tuned some proofs
Christian Urban <urbanc@in.tum.de>
parents: 2848
diff changeset
  1933
  using eqvt[simplified eqvt_def]
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1934
  apply(simp)
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1935
  apply(rule ex1)
2849
31c338d562fd tuned some proofs
Christian Urban <urbanc@in.tum.de>
parents: 2848
diff changeset
  1936
  apply(rule THE_defaultI2) 
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1937
  apply(rule_tac p="-p" in permute_boolE)
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1938
  apply(perm_simp add: permute_minus_cancel)
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1939
  apply(rule ex1)
2849
31c338d562fd tuned some proofs
Christian Urban <urbanc@in.tum.de>
parents: 2848
diff changeset
  1940
  apply(perm_simp)
31c338d562fd tuned some proofs
Christian Urban <urbanc@in.tum.de>
parents: 2848
diff changeset
  1941
  using eqvt[simplified eqvt_def]
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1942
  apply(simp)
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1943
  done
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1944
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1945
lemma fundef_ex1_eqvt_at:
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1946
  fixes x::"'a::pt"
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1947
  assumes f_def: "f == (\<lambda>x::'a. THE_default (d x) (G x))"
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1948
  assumes eqvt: "eqvt G"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1949
  assumes ex1: "\<exists>!y. G x y"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1950
  shows "eqvt_at f x"
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1951
  unfolding eqvt_at_def
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1952
  using assms
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1953
  by (auto intro: fundef_ex1_eqvt)
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  1954
2818
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1955
lemma fundef_ex1_prop:
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1956
  fixes x::"'a::pt"
2848
da7e6655cd4c fixed the problem when giving a complex default-term; the fundef lemmas in Nominal_Base were not general enough
Christian Urban <urbanc@in.tum.de>
parents: 2847
diff changeset
  1957
  assumes f_def: "f == (\<lambda>x::'a. THE_default (d x) (G x))"
2820
77e1d9f2925e slightly stronger property in fundef_ex_prop
Christian Urban <urbanc@in.tum.de>
parents: 2818
diff changeset
  1958
  assumes P_all: "\<And>x y. G x y \<Longrightarrow> P x y"
2818
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1959
  assumes ex1: "\<exists>!y. G x y"
2820
77e1d9f2925e slightly stronger property in fundef_ex_prop
Christian Urban <urbanc@in.tum.de>
parents: 2818
diff changeset
  1960
  shows "P x (f x)"
2818
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1961
  unfolding f_def
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1962
  using ex1
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1963
  apply(erule_tac ex1E)
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1964
  apply(rule THE_defaultI2)
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1965
  apply(blast)
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1966
  apply(rule P_all)
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1967
  apply(assumption)
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1968
  done
8fe80e9f796d added a more general lemma fro fundef_ex1
Christian Urban <urbanc@in.tum.de>
parents: 2810
diff changeset
  1969
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  1970
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  1971
section {* Support of Finite Sets of Finitely Supported Elements *}
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  1972
2657
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1973
text {* support and freshness for atom sets *}
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1974
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1975
lemma supp_finite_atom_set:
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1976
  fixes S::"atom set"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1977
  assumes "finite S"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1978
  shows "supp S = S"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1979
  apply(rule finite_supp_unique)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1980
  apply(simp add: supports_def)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1981
  apply(simp add: swap_set_not_in)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1982
  apply(rule assms)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1983
  apply(simp add: swap_set_in)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1984
done
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1985
2742
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1986
lemma supp_cofinite_atom_set:
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1987
  fixes S::"atom set"
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1988
  assumes "finite (UNIV - S)"
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1989
  shows "supp S = (UNIV - S)"
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1990
  apply(rule finite_supp_unique)
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1991
  apply(simp add: supports_def)
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1992
  apply(simp add: swap_set_both_in)
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1993
  apply(rule assms)
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1994
  apply(subst swap_commute)
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1995
  apply(simp add: swap_set_in)
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1996
done
f1192e3474e0 more on the paper
Christian Urban <urbanc@in.tum.de>
parents: 2735
diff changeset
  1997
2657
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1998
lemma fresh_finite_atom_set:
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  1999
  fixes S::"atom set"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  2000
  assumes "finite S"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  2001
  shows "a \<sharp> S \<longleftrightarrow> a \<notin> S"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  2002
  unfolding fresh_def
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  2003
  by (simp add: supp_finite_atom_set[OF assms])
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  2004
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2005
lemma fresh_minus_atom_set:
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2006
  fixes S::"atom set"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2007
  assumes "finite S"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2008
  shows "a \<sharp> S - T \<longleftrightarrow> (a \<notin> T \<longrightarrow> a \<sharp> S)"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2009
  unfolding fresh_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2010
  by (auto simp: supp_finite_atom_set assms)
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2011
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2012
lemma Union_supports_set:
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2013
  shows "(\<Union>x \<in> S. supp x) supports S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2014
proof -
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2015
  { fix a b
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2016
    have "\<forall>x \<in> S. (a \<rightleftharpoons> b) \<bullet> x = x \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> S = S"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
  2017
      unfolding permute_set_def by force
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2018
  }
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2019
  then show "(\<Union>x \<in> S. supp x) supports S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2020
    unfolding supports_def 
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2021
    by (simp add: fresh_def[symmetric] swap_fresh_fresh)
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2022
qed
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2023
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2024
lemma Union_of_finite_supp_sets:
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2025
  fixes S::"('a::fs set)"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2026
  assumes fin: "finite S"   
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2027
  shows "finite (\<Union>x\<in>S. supp x)"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2028
  using fin by (induct) (auto simp: finite_supp)
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2029
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2030
lemma Union_included_in_supp:
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2031
  fixes S::"('a::fs set)"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2032
  assumes fin: "finite S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2033
  shows "(\<Union>x\<in>S. supp x) \<subseteq> supp S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2034
proof -
3219
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  2035
  have eqvt: "eqvt (\<lambda>S. \<Union>x \<in> S. supp x)" 
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  2036
    unfolding eqvt_def by simp 
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2037
  have "(\<Union>x\<in>S. supp x) = supp (\<Union>x\<in>S. supp x)"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2038
    by (rule supp_finite_atom_set[symmetric]) (rule Union_of_finite_supp_sets[OF fin])
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2039
  also have "\<dots> \<subseteq> supp S" using eqvt
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2040
    by (rule supp_fun_app_eqvt)
3219
e5d9b6bca88c updated to new Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3218
diff changeset
  2041
  finally show "(\<Union>x\<in>S. supp x) \<subseteq> supp S" .  
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2042
qed
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2043
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2044
lemma supp_of_finite_sets:
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2045
  fixes S::"('a::fs set)"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2046
  assumes fin: "finite S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2047
  shows "(supp S) = (\<Union>x\<in>S. supp x)"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2048
apply(rule subset_antisym)
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2049
apply(rule supp_is_subset)
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2050
apply(rule Union_supports_set)
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2051
apply(rule Union_of_finite_supp_sets[OF fin])
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2052
apply(rule Union_included_in_supp[OF fin])
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2053
done
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2054
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2055
lemma finite_sets_supp:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2056
  fixes S::"('a::fs set)"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2057
  assumes "finite S"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2058
  shows "finite (supp S)"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2059
using assms
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2060
by (simp only: supp_of_finite_sets Union_of_finite_supp_sets)
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2061
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2062
lemma supp_of_finite_union:
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2063
  fixes S T::"('a::fs) set"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2064
  assumes fin1: "finite S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2065
  and     fin2: "finite T"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2066
  shows "supp (S \<union> T) = supp S \<union> supp T"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2067
  using fin1 fin2
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2068
  by (simp add: supp_of_finite_sets)
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2069
3221
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2070
lemma fresh_finite_union:
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2071
  fixes S T::"('a::fs) set"
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2072
  assumes fin1: "finite S"
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2073
  and     fin2: "finite T"
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2074
  shows "a \<sharp> (S \<union> T) \<longleftrightarrow> a \<sharp> S \<and> a \<sharp> T"
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2075
  unfolding fresh_def
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2076
  by (simp add: supp_of_finite_union[OF fin1 fin2])
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  2077
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2078
lemma supp_of_finite_insert:
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2079
  fixes S::"('a::fs) set"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2080
  assumes fin:  "finite S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2081
  shows "supp (insert x S) = supp x \<union> supp S"
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  2082
  using fin
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2083
  by (simp add: supp_of_finite_sets)
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2084
2588
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2085
lemma fresh_finite_insert:
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2086
  fixes S::"('a::fs) set"
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2087
  assumes fin:  "finite S"
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2088
  shows "a \<sharp> (insert x S) \<longleftrightarrow> a \<sharp> x \<and> a \<sharp> S"
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2089
  using fin unfolding fresh_def
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2090
  by (simp add: supp_of_finite_insert)
8f5420681039 completed the strong exhausts rules for Foo2 using general lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2587
diff changeset
  2091
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2092
lemma supp_set_empty:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2093
  shows "supp {} = {}"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2094
  unfolding supp_def
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2095
  by (simp add: empty_eqvt)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2096
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2097
lemma fresh_set_empty:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2098
  shows "a \<sharp> {}"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2099
  by (simp add: fresh_def supp_set_empty)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2100
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2101
lemma supp_set:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2102
  fixes xs :: "('a::fs) list"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2103
  shows "supp (set xs) = supp xs"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2104
apply(induct xs)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2105
apply(simp add: supp_set_empty supp_Nil)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2106
apply(simp add: supp_Cons supp_of_finite_insert)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2107
done
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2108
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2109
lemma fresh_set:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2110
  fixes xs :: "('a::fs) list"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2111
  shows "a \<sharp> (set xs) \<longleftrightarrow> a \<sharp> xs"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2112
unfolding fresh_def
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2113
by (simp add: supp_set)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2114
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2115
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2116
subsection {* Type @{typ "'a multiset"} is finitely supported *}
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2117
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2118
lemma set_mset_eqvt [eqvt]:
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2119
  shows "p \<bullet> (set_mset M) = set_mset (p \<bullet> M)"
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2120
by (induct M) (simp_all add: insert_eqvt empty_eqvt)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2121
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2122
lemma supp_set_mset:
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2123
  shows "supp (set_mset M) \<subseteq> supp M"
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2124
  apply (rule supp_fun_app_eqvt)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2125
  unfolding eqvt_def
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2126
  apply(perm_simp)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2127
  apply(simp)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2128
  done
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2129
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2130
lemma Union_finite_multiset:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2131
  fixes M::"'a::fs multiset"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2132
  shows "finite (\<Union>{supp x | x. x \<in># M})"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2133
proof - 
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2134
  have "finite (\<Union>(supp ` {x. x \<in># M}))"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2135
    by (induct M) (simp_all add: Collect_imp_eq Collect_neg_eq finite_supp)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2136
  then show "finite (\<Union>{supp x | x. x \<in># M})"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2137
    by (simp only: image_Collect)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2138
qed
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2139
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2140
lemma Union_supports_multiset:
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2141
  shows "\<Union>{supp x | x. x \<in># M} supports M"
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2142
proof -
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2143
  have sw: "\<And>a b. ((\<And>x. x \<in># M \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> x = x) \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> M = M)"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2144
    unfolding permute_multiset_def by (induct M) simp_all
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2145
  have "(\<Union>x\<in>set_mset M. supp x) supports M"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2146
    by (auto intro!: sw swap_fresh_fresh simp add: fresh_def supports_def)
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2147
  also have "(\<Union>x\<in>set_mset M. supp x) = (\<Union>{supp x | x. x \<in># M})"
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2148
    by auto
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2149
  finally show "(\<Union>{supp x | x. x \<in># M}) supports M" .
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2150
qed
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2151
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2152
lemma Union_included_multiset:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2153
  fixes M::"('a::fs multiset)" 
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2154
  shows "(\<Union>{supp x | x. x \<in># M}) \<subseteq> supp M"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2155
proof -
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2156
  have "(\<Union>{supp x | x. x \<in># M}) = (\<Union>x \<in> set_mset M. supp x)" by auto
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2157
  also have "... = supp (set_mset M)"
3234
08c3ef07cef7 changes from upstream
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3233
diff changeset
  2158
    by (simp add: supp_of_finite_sets)
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2159
  also have " ... \<subseteq> supp M" by (rule supp_set_mset)
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2160
  finally show "(\<Union>{supp x | x. x \<in># M}) \<subseteq> supp M" .
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2161
qed
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2162
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2163
lemma supp_of_multisets:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2164
  fixes M::"('a::fs multiset)"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2165
  shows "(supp M) = (\<Union>{supp x | x. x \<in># M})"
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2166
apply(rule subset_antisym)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2167
apply(rule supp_is_subset)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2168
apply(rule Union_supports_multiset)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2169
apply(rule Union_finite_multiset)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2170
apply(rule Union_included_multiset)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2171
done
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2172
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2173
lemma multisets_supp_finite:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2174
  fixes M::"('a::fs multiset)"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2175
  shows "finite (supp M)"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2176
by (simp only: supp_of_multisets Union_finite_multiset)
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2177
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2178
lemma supp_of_multiset_union:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2179
  fixes M N::"('a::fs) multiset"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2180
  shows "supp (M + N) = supp M \<union> supp N"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2181
  by (auto simp: supp_of_multisets)
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2182
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2183
lemma supp_empty_mset [simp]:
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2184
  shows "supp {#} = {}"
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2185
  unfolding supp_def
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2186
  by simp
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2187
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2188
instance multiset :: (fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2189
  by standard (rule multisets_supp_finite)
3121
878de0084b62 added fs and pt for multisets
Christian Urban <urbanc@in.tum.de>
parents: 3104
diff changeset
  2190
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2191
subsection {* Type @{typ "'a fset"} is finitely supported *}
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2192
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2193
lemma supp_fset [simp]:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2194
  shows "supp (fset S) = supp S"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2195
  unfolding supp_def
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2196
  by (simp add: fset_eqvt fset_cong)
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2197
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2198
lemma supp_empty_fset [simp]:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2199
  shows "supp {||} = {}"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2200
  unfolding supp_def
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2201
  by simp
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2202
2641
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2203
lemma fresh_empty_fset:
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2204
  shows "a \<sharp> {||}"
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2205
unfolding fresh_def
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2206
by (simp)
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2207
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2208
lemma supp_finsert [simp]:
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2209
  fixes x::"'a::fs"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2210
  and   S::"'a fset"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2211
  shows "supp (finsert x S) = supp x \<union> supp S"
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2212
  apply(subst supp_fset[symmetric])
2587
78623a0f294b tuned proof to reduce number of warnings
Christian Urban <urbanc@in.tum.de>
parents: 2586
diff changeset
  2213
  apply(simp add: supp_of_finite_insert)
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2214
  done
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2215
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2216
lemma fresh_finsert:
2641
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2217
  fixes x::"'a::fs"
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2218
  and   S::"'a fset"
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2219
  shows "a \<sharp> finsert x S \<longleftrightarrow> a \<sharp> x \<and> a \<sharp> S"
2641
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2220
  unfolding fresh_def
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  2221
  by simp
2641
592d17e26e09 some further lemmas for fsets
Christian Urban <urbanc@in.tum.de>
parents: 2635
diff changeset
  2222
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2223
lemma fset_finite_supp:
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2224
  fixes S::"('a::fs) fset"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2225
  shows "finite (supp S)"
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2226
  by (induct S) (simp_all add: finite_supp)
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  2227
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2228
lemma supp_union_fset:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2229
  fixes S T::"'a::fs fset"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2230
  shows "supp (S |\<union>| T) = supp S \<union> supp T"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2231
by (induct S) (auto)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2232
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2233
lemma fresh_union_fset:
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2234
  fixes S T::"'a::fs fset"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2235
  shows "a \<sharp> S |\<union>| T \<longleftrightarrow> a \<sharp> S \<and> a \<sharp> T"
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2236
unfolding fresh_def
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2237
by (simp add: supp_union_fset)
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2238
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  2239
instance fset :: (fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2240
  by standard (rule fset_finite_supp)
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  2241
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2242
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  2243
subsection {* Type @{typ "('a, 'b) finfun"} is finitely supported *}
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2244
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2245
lemma fresh_finfun_const:
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  2246
  shows "a \<sharp> (finfun_const b) \<longleftrightarrow> a \<sharp> b"
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2247
  by (simp add: fresh_def supp_def)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2248
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2249
lemma fresh_finfun_update:
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  2250
  shows "\<lbrakk>a \<sharp> f; a \<sharp> x; a \<sharp> y\<rbrakk> \<Longrightarrow> a \<sharp> finfun_update f x y"
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2251
  unfolding fresh_conv_MOST
3189
e46d4ee64221 added eqvt for finfun_apply
Christian Urban <urbanc@in.tum.de>
parents: 3188
diff changeset
  2252
  unfolding finfun_update_eqvt
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2253
  by (elim MOST_rev_mp) (simp)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2254
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2255
lemma supp_finfun_const:
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  2256
  shows "supp (finfun_const b) = supp(b)"
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2257
  by (simp add: supp_def)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2258
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2259
lemma supp_finfun_update:
3188
264253617b5e improved the finfun parts
Christian Urban <urbanc@in.tum.de>
parents: 3187
diff changeset
  2260
  shows "supp (finfun_update f x y) \<subseteq> supp(f, x, y)"
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2261
using fresh_finfun_update
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2262
by (auto simp: fresh_def supp_Pair)
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2263
    
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2264
instance finfun :: (fs, fs) fs
3244
a44479bde681 fixed a problem with two example theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3239
diff changeset
  2265
  apply standard
3187
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2266
  apply(induct_tac x rule: finfun_weak_induct)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2267
  apply(simp add: supp_finfun_const finite_supp)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2268
  apply(rule finite_subset)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2269
  apply(rule supp_finfun_update)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2270
  apply(simp add: supp_Pair finite_supp)
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2271
  done
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2272
b3d97424b130 added finfun-type to Nominal
Christian Urban <urbanc@in.tum.de>
parents: 3185
diff changeset
  2273
2632
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2274
section {* Freshness and Fresh-Star *}
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2275
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2276
lemma fresh_Unit_elim: 
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2277
  shows "(a \<sharp> () \<Longrightarrow> PROP C) \<equiv> PROP C"
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2278
  by (simp add: fresh_Unit)
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2279
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2280
lemma fresh_Pair_elim: 
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2281
  shows "(a \<sharp> (x, y) \<Longrightarrow> PROP C) \<equiv> (a \<sharp> x \<Longrightarrow> a \<sharp> y \<Longrightarrow> PROP C)"
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2282
  by rule (simp_all add: fresh_Pair)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2283
2632
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2284
(* this rule needs to be added before the fresh_prodD is *)
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2285
(* added to the simplifier with mksimps                  *) 
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2286
lemma [simp]:
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2287
  shows "a \<sharp> x1 \<Longrightarrow> a \<sharp> x2 \<Longrightarrow> a \<sharp> (x1, x2)"
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2288
  by (simp add: fresh_Pair)
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2289
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2290
lemma fresh_PairD:
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2291
  shows "a \<sharp> (x, y) \<Longrightarrow> a \<sharp> x"
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2292
  and   "a \<sharp> (x, y) \<Longrightarrow> a \<sharp> y"
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2293
  by (simp_all add: fresh_Pair)
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2294
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2295
declaration {* fn _ =>
3051
a06de111c70e updated to Isabelle 26 Nov
Christian Urban <urbanc@in.tum.de>
parents: 3050
diff changeset
  2296
let
a06de111c70e updated to Isabelle 26 Nov
Christian Urban <urbanc@in.tum.de>
parents: 3050
diff changeset
  2297
  val mksimps_pairs = (@{const_name Nominal2_Base.fresh}, @{thms fresh_PairD}) :: mksimps_pairs
a06de111c70e updated to Isabelle 26 Nov
Christian Urban <urbanc@in.tum.de>
parents: 3050
diff changeset
  2298
in
a06de111c70e updated to Isabelle 26 Nov
Christian Urban <urbanc@in.tum.de>
parents: 3050
diff changeset
  2299
  Simplifier.map_ss (fn ss => Simplifier.set_mksimps (mksimps mksimps_pairs) ss)
a06de111c70e updated to Isabelle 26 Nov
Christian Urban <urbanc@in.tum.de>
parents: 3050
diff changeset
  2300
end
2632
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2301
*}
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2302
3174
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2303
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2304
text {* The fresh-star generalisation of fresh is used in strong
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2305
  induction principles. *}
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2306
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2307
definition 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2308
  fresh_star :: "atom set \<Rightarrow> 'a::pt \<Rightarrow> bool" ("_ \<sharp>* _" [80,80] 80)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2309
where 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2310
  "as \<sharp>* x \<equiv> \<forall>a \<in> as. a \<sharp> x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2311
2507
f5621efe5a20 changed to llncs
Christian Urban <urbanc@in.tum.de>
parents: 2479
diff changeset
  2312
lemma fresh_star_supp_conv:
f5621efe5a20 changed to llncs
Christian Urban <urbanc@in.tum.de>
parents: 2479
diff changeset
  2313
  shows "supp x \<sharp>* y \<Longrightarrow> supp y \<sharp>* x"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2314
by (auto simp: fresh_star_def fresh_def)
2507
f5621efe5a20 changed to llncs
Christian Urban <urbanc@in.tum.de>
parents: 2479
diff changeset
  2315
2675
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2316
lemma fresh_star_perm_set_conv:
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2317
  fixes p::"perm"
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2318
  assumes fresh: "as \<sharp>* p"
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2319
  and     fin: "finite as"
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2320
  shows "supp p \<sharp>* as"
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2321
apply(rule fresh_star_supp_conv)
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2322
apply(simp add: supp_finite_atom_set fin fresh)
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2323
done
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2324
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2325
lemma fresh_star_atom_set_conv:
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2326
  assumes fresh: "as \<sharp>* bs"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2327
  and     fin: "finite as" "finite bs"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2328
  shows "bs \<sharp>* as"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2329
using fresh
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2330
unfolding fresh_star_def fresh_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2331
by (auto simp: supp_finite_atom_set fin)
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2332
2730
eebc24b9cf39 added a lemma about fresh_star and Abs
Christian Urban <urbanc@in.tum.de>
parents: 2708
diff changeset
  2333
lemma atom_fresh_star_disjoint:
eebc24b9cf39 added a lemma about fresh_star and Abs
Christian Urban <urbanc@in.tum.de>
parents: 2708
diff changeset
  2334
  assumes fin: "finite bs" 
eebc24b9cf39 added a lemma about fresh_star and Abs
Christian Urban <urbanc@in.tum.de>
parents: 2708
diff changeset
  2335
  shows "as \<sharp>* bs \<longleftrightarrow> (as \<inter> bs = {})"
eebc24b9cf39 added a lemma about fresh_star and Abs
Christian Urban <urbanc@in.tum.de>
parents: 2708
diff changeset
  2336
eebc24b9cf39 added a lemma about fresh_star and Abs
Christian Urban <urbanc@in.tum.de>
parents: 2708
diff changeset
  2337
unfolding fresh_star_def fresh_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2338
by (auto simp: supp_finite_atom_set fin)
2730
eebc24b9cf39 added a lemma about fresh_star and Abs
Christian Urban <urbanc@in.tum.de>
parents: 2708
diff changeset
  2339
2675
68ccf847507d defined properly substitution
Christian Urban <urbanc@in.tum.de>
parents: 2672
diff changeset
  2340
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2341
lemma fresh_star_Pair:
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2342
  shows "as \<sharp>* (x, y) = (as \<sharp>* x \<and> as \<sharp>* y)" 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2343
  by (auto simp: fresh_star_def fresh_Pair)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2344
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2345
lemma fresh_star_list:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2346
  shows "as \<sharp>* (xs @ ys) \<longleftrightarrow> as \<sharp>* xs \<and> as \<sharp>* ys"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2347
  and   "as \<sharp>* (x # xs) \<longleftrightarrow> as \<sharp>* x \<and> as \<sharp>* xs"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2348
  and   "as \<sharp>* []"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2349
by (auto simp: fresh_star_def fresh_Nil fresh_Cons fresh_append)
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2350
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2351
lemma fresh_star_set:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2352
  fixes xs::"('a::fs) list"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2353
  shows "as \<sharp>* set xs \<longleftrightarrow> as \<sharp>* xs"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2354
unfolding fresh_star_def
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2355
by (simp add: fresh_set)
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2356
2611
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2357
lemma fresh_star_singleton:
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2358
  fixes a::"atom"
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2359
  shows "as \<sharp>* {a} \<longleftrightarrow> as \<sharp>* a"
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2360
  by (simp add: fresh_star_def fresh_finite_insert fresh_set_empty)
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2361
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2362
lemma fresh_star_fset:
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2363
  fixes xs::"('a::fs) list"
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2364
  shows "as \<sharp>* fset S \<longleftrightarrow> as \<sharp>* S"
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2365
by (simp add: fresh_star_def fresh_def) 
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2366
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2367
lemma fresh_star_Un:
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2368
  shows "(as \<union> bs) \<sharp>* x = (as \<sharp>* x \<and> bs \<sharp>* x)"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2369
  by (auto simp: fresh_star_def)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2370
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2371
lemma fresh_star_insert:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2372
  shows "(insert a as) \<sharp>* x = (a \<sharp> x \<and> as \<sharp>* x)"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2373
  by (auto simp: fresh_star_def)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2374
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2375
lemma fresh_star_Un_elim:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2376
  "((as \<union> bs) \<sharp>* x \<Longrightarrow> PROP C) \<equiv> (as \<sharp>* x \<Longrightarrow> bs \<sharp>* x \<Longrightarrow> PROP C)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2377
  unfolding fresh_star_def
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2378
  apply(rule)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2379
  apply(erule meta_mp)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2380
  apply(auto)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2381
  done
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2382
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2383
lemma fresh_star_insert_elim:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2384
  "(insert a as \<sharp>* x \<Longrightarrow> PROP C) \<equiv> (a \<sharp> x \<Longrightarrow> as \<sharp>* x \<Longrightarrow> PROP C)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2385
  unfolding fresh_star_def
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2386
  by rule (simp_all add: fresh_star_def)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2387
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2388
lemma fresh_star_empty_elim:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2389
  "({} \<sharp>* x \<Longrightarrow> PROP C) \<equiv> PROP C"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2390
  by (simp add: fresh_star_def)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2391
2632
e8732350a29f added small example for strong inductions; functions still need a sorry
Christian Urban <urbanc@in.tum.de>
parents: 2614
diff changeset
  2392
lemma fresh_star_Unit_elim: 
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2393
  shows "(a \<sharp>* () \<Longrightarrow> PROP C) \<equiv> PROP C"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2394
  by (simp add: fresh_star_def fresh_Unit) 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2395
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2396
lemma fresh_star_Pair_elim: 
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2397
  shows "(a \<sharp>* (x, y) \<Longrightarrow> PROP C) \<equiv> (a \<sharp>* x \<Longrightarrow> a \<sharp>* y \<Longrightarrow> PROP C)"
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2398
  by (rule, simp_all add: fresh_star_Pair)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2399
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2400
lemma fresh_star_zero:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2401
  shows "as \<sharp>* (0::perm)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2402
  unfolding fresh_star_def
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2403
  by (simp add: fresh_zero_perm)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2404
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2405
lemma fresh_star_plus:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2406
  fixes p q::perm
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2407
  shows "\<lbrakk>a \<sharp>* p;  a \<sharp>* q\<rbrakk> \<Longrightarrow> a \<sharp>* (p + q)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2408
  unfolding fresh_star_def
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2409
  by (simp add: fresh_plus_perm)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2410
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2411
lemma fresh_star_permute_iff:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2412
  shows "(p \<bullet> a) \<sharp>* (p \<bullet> x) \<longleftrightarrow> a \<sharp>* x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2413
  unfolding fresh_star_def
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2414
  by (metis mem_permute_iff permute_minus_cancel(1) fresh_permute_iff)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2415
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2416
lemma fresh_star_eqvt [eqvt]:
2663
54aade5d0fe6 moved high level code from LamTest into the main libraries.
Christian Urban <urbanc@in.tum.de>
parents: 2659
diff changeset
  2417
  shows "p \<bullet> (as \<sharp>* x) \<longleftrightarrow> (p \<bullet> as) \<sharp>* (p \<bullet> x)"
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  2418
unfolding fresh_star_def by simp
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2419
2735
d97e04126a3d a bit more tuning
Christian Urban <urbanc@in.tum.de>
parents: 2733
diff changeset
  2420
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2421
section {* Induction principle for permutations *}
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2422
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2423
lemma smaller_supp:
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2424
  assumes a: "a \<in> supp p"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2425
  shows "supp ((p \<bullet> a \<rightleftharpoons> a) + p) \<subset> supp p"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2426
proof -
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2427
  have "supp ((p \<bullet> a \<rightleftharpoons> a) + p) \<subseteq> supp p"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2428
    unfolding supp_perm by (auto simp: swap_atom)
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2429
  moreover
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2430
  have "a \<notin> supp ((p \<bullet> a \<rightleftharpoons> a) + p)" by (simp add: supp_perm)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2431
  then have "supp ((p \<bullet> a \<rightleftharpoons> a) + p) \<noteq> supp p" using a by auto
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2432
  ultimately 
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2433
  show "supp ((p \<bullet> a \<rightleftharpoons> a) + p) \<subset> supp p" by auto
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2434
qed
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2435
  
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2436
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2437
lemma perm_struct_induct[consumes 1, case_names zero swap]:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2438
  assumes S: "supp p \<subseteq> S"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2439
  and zero: "P 0"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2440
  and swap: "\<And>p a b. \<lbrakk>P p; supp p \<subseteq> S; a \<in> S; b \<in> S; a \<noteq> b; sort_of a = sort_of b\<rbrakk> \<Longrightarrow> P ((a \<rightleftharpoons> b) + p)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2441
  shows "P p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2442
proof -
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2443
  have "finite (supp p)" by (simp add: finite_supp)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2444
  then show "P p" using S
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2445
  proof(induct A\<equiv>"supp p" arbitrary: p rule: finite_psubset_induct)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2446
    case (psubset p)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2447
    then have ih: "\<And>q. supp q \<subset> supp p \<Longrightarrow> P q" by auto
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2448
    have as: "supp p \<subseteq> S" by fact
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2449
    { assume "supp p = {}"
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  2450
      then have "p = 0" by (simp add: supp_perm perm_eq_iff)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2451
      then have "P p" using zero by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2452
    }
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2453
    moreover
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2454
    { assume "supp p \<noteq> {}"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2455
      then obtain a where a0: "a \<in> supp p" by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2456
      then have a1: "p \<bullet> a \<in> S" "a \<in> S" "sort_of (p \<bullet> a) = sort_of a" "p \<bullet> a \<noteq> a"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2457
        using as by (auto simp: supp_atom supp_perm swap_atom)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2458
      let ?q = "(p \<bullet> a \<rightleftharpoons> a) + p"
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2459
      have a2: "supp ?q \<subset> supp p" using a0 smaller_supp by simp
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2460
      then have "P ?q" using ih by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2461
      moreover
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2462
      have "supp ?q \<subseteq> S" using as a2 by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2463
      ultimately  have "P ((p \<bullet> a \<rightleftharpoons> a) + ?q)" using as a1 swap by simp 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2464
      moreover 
2732
9abc4a70540c some slight polishing
Christian Urban <urbanc@in.tum.de>
parents: 2730
diff changeset
  2465
      have "p = (p \<bullet> a \<rightleftharpoons> a) + ?q" by (simp add: perm_eq_iff)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2466
      ultimately have "P p" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2467
    }
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2468
    ultimately show "P p" by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2469
  qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2470
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2471
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2472
lemma perm_simple_struct_induct[case_names zero swap]:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2473
  assumes zero: "P 0"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2474
  and     swap: "\<And>p a b. \<lbrakk>P p; a \<noteq> b; sort_of a = sort_of b\<rbrakk> \<Longrightarrow> P ((a \<rightleftharpoons> b) + p)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2475
  shows "P p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2476
by (rule_tac S="supp p" in perm_struct_induct)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2477
   (auto intro: zero swap)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2478
2669
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2479
lemma perm_struct_induct2[consumes 1, case_names zero swap plus]:
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2480
  assumes S: "supp p \<subseteq> S"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2481
  assumes zero: "P 0"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2482
  assumes swap: "\<And>a b. \<lbrakk>sort_of a = sort_of b; a \<noteq> b; a \<in> S; b \<in> S\<rbrakk> \<Longrightarrow> P (a \<rightleftharpoons> b)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2483
  assumes plus: "\<And>p1 p2. \<lbrakk>P p1; P p2; supp p1 \<subseteq> S; supp p2 \<subseteq> S\<rbrakk> \<Longrightarrow> P (p1 + p2)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2484
  shows "P p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2485
using S
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2486
by (induct p rule: perm_struct_induct)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2487
   (auto intro: zero plus swap simp add: supp_swap)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2488
2669
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2489
lemma perm_simple_struct_induct2[case_names zero swap plus]:
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2490
  assumes zero: "P 0"
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2491
  assumes swap: "\<And>a b. \<lbrakk>sort_of a = sort_of b; a \<noteq> b\<rbrakk> \<Longrightarrow> P (a \<rightleftharpoons> b)"
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2492
  assumes plus: "\<And>p1 p2. \<lbrakk>P p1; P p2\<rbrakk> \<Longrightarrow> P (p1 + p2)"
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2493
  shows "P p"
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2494
by (rule_tac S="supp p" in perm_struct_induct2)
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2495
   (auto intro: zero swap plus)
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2496
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2497
lemma supp_perm_singleton:
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2498
  fixes p::"perm"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2499
  shows "supp p \<subseteq> {b} \<longleftrightarrow> p = 0"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2500
proof -
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2501
  { assume "supp p \<subseteq> {b}"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2502
    then have "p = 0"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2503
      by (induct p rule: perm_struct_induct) (simp_all)
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2504
  }
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2505
  then show "supp p \<subseteq> {b} \<longleftrightarrow> p = 0" by (auto simp: supp_zero_perm)
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2506
qed
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2507
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2508
lemma supp_perm_pair:
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2509
  fixes p::"perm"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2510
  shows "supp p \<subseteq> {a, b} \<longleftrightarrow> p = 0 \<or> p = (b \<rightleftharpoons> a)"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2511
proof -
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2512
  { assume "supp p \<subseteq> {a, b}"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2513
    then have "p = 0 \<or> p = (b \<rightleftharpoons> a)"
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2514
      apply (induct p rule: perm_struct_induct) 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2515
      apply (auto simp: swap_cancel supp_zero_perm supp_swap)
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2516
      apply (simp add: swap_commute)
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2517
      done
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2518
  }
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2519
  then show "supp p \<subseteq> {a, b} \<longleftrightarrow> p = 0 \<or> p = (b \<rightleftharpoons> a)" 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2520
    by (auto simp: supp_zero_perm supp_swap split: if_splits)
2679
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2521
qed
e003e5e36bae added Minimal file to test things
Christian Urban <urbanc@in.tum.de>
parents: 2675
diff changeset
  2522
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2523
lemma supp_perm_eq:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2524
  assumes "(supp x) \<sharp>* p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2525
  shows "p \<bullet> x = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2526
proof -
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2527
  from assms have "supp p \<subseteq> {a. a \<sharp> x}"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2528
    unfolding supp_perm fresh_star_def fresh_def by auto
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2529
  then show "p \<bullet> x = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2530
  proof (induct p rule: perm_struct_induct)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2531
    case zero
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2532
    show "0 \<bullet> x = x" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2533
  next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2534
    case (swap p a b)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2535
    then have "a \<sharp> x" "b \<sharp> x" "p \<bullet> x = x" by simp_all
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2536
    then show "((a \<rightleftharpoons> b) + p) \<bullet> x = x" by (simp add: swap_fresh_fresh)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2537
  qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2538
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2539
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2540
text {* same lemma as above, but proved with a different induction principle *}
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2541
lemma supp_perm_eq_test:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2542
  assumes "(supp x) \<sharp>* p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2543
  shows "p \<bullet> x = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2544
proof -
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2545
  from assms have "supp p \<subseteq> {a. a \<sharp> x}"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2546
    unfolding supp_perm fresh_star_def fresh_def by auto
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2547
  then show "p \<bullet> x = x"
2669
1d1772a89026 the function translating lambda terms to locally nameless lambda terms; still needs a stronger abs_eq_iff lemma...at the moment only proved for restrictions
Christian Urban <urbanc@in.tum.de>
parents: 2668
diff changeset
  2548
  proof (induct p rule: perm_struct_induct2)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2549
    case zero
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2550
    show "0 \<bullet> x = x" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2551
  next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2552
    case (swap a b)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2553
    then have "a \<sharp> x" "b \<sharp> x" by simp_all
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2554
    then show "(a \<rightleftharpoons> b) \<bullet> x = x" by (simp add: swap_fresh_fresh)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2555
  next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2556
    case (plus p1 p2)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2557
    have "p1 \<bullet> x = x" "p2 \<bullet> x = x" by fact+
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2558
    then show "(p1 + p2) \<bullet> x = x" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2559
  qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2560
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2561
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2562
lemma perm_supp_eq:
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2563
  assumes a: "(supp p) \<sharp>* x"
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2564
  shows "p \<bullet> x = x"
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2565
proof -
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2566
  from assms have "supp p \<subseteq> {a. a \<sharp> x}"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2567
    unfolding supp_perm fresh_star_def fresh_def by auto
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2568
  then show "p \<bullet> x = x"
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2569
  proof (induct p rule: perm_struct_induct2)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2570
    case zero
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2571
    show "0 \<bullet> x = x" by simp
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2572
  next
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2573
    case (swap a b)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2574
    then have "a \<sharp> x" "b \<sharp> x" by simp_all
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2575
    then show "(a \<rightleftharpoons> b) \<bullet> x = x" by (simp add: swap_fresh_fresh)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2576
  next
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2577
    case (plus p1 p2)
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2578
    have "p1 \<bullet> x = x" "p2 \<bullet> x = x" by fact+
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2579
    then show "(p1 + p2) \<bullet> x = x" by simp
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2580
  qed
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2581
qed
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  2582
2659
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2583
lemma supp_perm_perm_eq:
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2584
  assumes a: "\<forall>a \<in> supp x. p \<bullet> a = q \<bullet> a"
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2585
  shows "p \<bullet> x = q \<bullet> x"
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2586
proof -
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2587
  from a have "\<forall>a \<in> supp x. (-q + p) \<bullet> a = a" by simp
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2588
  then have "\<forall>a \<in> supp x. a \<notin> supp (-q + p)" 
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2589
    unfolding supp_perm by simp
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2590
  then have "supp x \<sharp>* (-q + p)"
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2591
    unfolding fresh_star_def fresh_def by simp
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2592
  then have "(-q + p) \<bullet> x = x" by (simp only: supp_perm_eq)
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2593
  then show "p \<bullet> x = q \<bullet> x"
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2594
    by (metis permute_minus_cancel permute_plus)
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2595
qed
2907
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2596
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2597
text {* disagreement set *}
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2598
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2599
definition
2908
ad426ba60606 renamed ds to dset (disagreement set)
Christian Urban <urbanc@in.tum.de>
parents: 2907
diff changeset
  2600
  dset :: "perm \<Rightarrow> perm \<Rightarrow> atom set"
2907
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2601
where
2908
ad426ba60606 renamed ds to dset (disagreement set)
Christian Urban <urbanc@in.tum.de>
parents: 2907
diff changeset
  2602
  "dset p q = {a::atom. p \<bullet> a \<noteq> q \<bullet> a}"
2907
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2603
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2604
lemma ds_fresh:
2908
ad426ba60606 renamed ds to dset (disagreement set)
Christian Urban <urbanc@in.tum.de>
parents: 2907
diff changeset
  2605
  assumes "dset p q \<sharp>* x"
2907
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2606
  shows "p \<bullet> x = q \<bullet> x"
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2607
using assms
2908
ad426ba60606 renamed ds to dset (disagreement set)
Christian Urban <urbanc@in.tum.de>
parents: 2907
diff changeset
  2608
unfolding dset_def fresh_star_def fresh_def
2907
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2609
by (auto intro: supp_perm_perm_eq)
9096338a7985 added small lemma about disagreement set
Christian Urban <urbanc@in.tum.de>
parents: 2900
diff changeset
  2610
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2611
lemma atom_set_perm_eq:
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2612
  assumes a: "as \<sharp>* p"
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2613
  shows "p \<bullet> as = as"
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2614
proof -
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2615
  from a have "supp p \<subseteq> {a. a \<notin> as}"
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2616
    unfolding supp_perm fresh_star_def fresh_def by auto
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2617
  then show "p \<bullet> as = as"
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2618
  proof (induct p rule: perm_struct_induct)
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2619
    case zero
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2620
    show "0 \<bullet> as = as" by simp
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2621
  next
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2622
    case (swap p a b)
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2623
    then have "a \<notin> as" "b \<notin> as" "p \<bullet> as = as" by simp_all
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2624
    then show "((a \<rightleftharpoons> b) + p) \<bullet> as = as" by (simp add: swap_set_not_in)
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2625
  qed
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2626
qed
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2627
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2628
section {* Avoiding of atom sets *}
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2629
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2630
text {* 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2631
  For every set of atoms, there is another set of atoms
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2632
  avoiding a finitely supported c and there is a permutation
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2633
  which 'translates' between both sets.
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2634
*}
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2635
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2636
lemma at_set_avoiding_aux:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2637
  fixes Xs::"atom set"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2638
  and   As::"atom set"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2639
  assumes b: "Xs \<subseteq> As"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2640
  and     c: "finite As"
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2641
  shows "\<exists>p. (p \<bullet> Xs) \<inter> As = {} \<and> (supp p) = (Xs \<union> (p \<bullet> Xs))"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2642
proof -
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2643
  from b c have "finite Xs" by (rule finite_subset)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2644
  then show ?thesis using b
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2645
  proof (induct rule: finite_subset_induct)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2646
    case empty
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2647
    have "0 \<bullet> {} \<inter> As = {}" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2648
    moreover
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2649
    have "supp (0::perm) = {} \<union> 0 \<bullet> {}" by (simp add: supp_zero_perm)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2650
    ultimately show ?case by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2651
  next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2652
    case (insert x Xs)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2653
    then obtain p where
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2654
      p1: "(p \<bullet> Xs) \<inter> As = {}" and 
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2655
      p2: "supp p = (Xs \<union> (p \<bullet> Xs))" by blast
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2656
    from `x \<in> As` p1 have "x \<notin> p \<bullet> Xs" by fast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2657
    with `x \<notin> Xs` p2 have "x \<notin> supp p" by fast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2658
    hence px: "p \<bullet> x = x" unfolding supp_perm by simp
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2659
    have "finite (As \<union> p \<bullet> Xs \<union> supp p)"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2660
      using `finite As` `finite Xs`
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2661
      by (simp add: permute_set_eq_image finite_supp)
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2662
    then obtain y where "y \<notin> (As \<union> p \<bullet> Xs \<union> supp p)" "sort_of y = sort_of x"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2663
      by (rule obtain_atom)
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2664
    hence y: "y \<notin> As" "y \<notin> p \<bullet> Xs" "y \<notin> supp p" "sort_of y = sort_of x"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2665
      by simp_all
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2666
    hence py: "p \<bullet> y = y" "x \<noteq> y" using `x \<in> As`
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2667
      by (auto simp: supp_perm)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2668
    let ?q = "(x \<rightleftharpoons> y) + p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2669
    have q: "?q \<bullet> insert x Xs = insert y (p \<bullet> Xs)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2670
      unfolding insert_eqvt
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2671
      using `p \<bullet> x = x` `sort_of y = sort_of x`
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2672
      using `x \<notin> p \<bullet> Xs` `y \<notin> p \<bullet> Xs`
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2673
      by (simp add: swap_atom swap_set_not_in)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2674
    have "?q \<bullet> insert x Xs \<inter> As = {}"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2675
      using `y \<notin> As` `p \<bullet> Xs \<inter> As = {}`
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2676
      unfolding q by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2677
    moreover
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2678
    have "supp (x \<rightleftharpoons> y) \<inter> supp p = {}" using px py `sort_of y = sort_of x`
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2679
      unfolding supp_swap by (simp add: supp_perm)
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2680
    then have "supp ?q = (supp (x \<rightleftharpoons> y) \<union> supp p)" 
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2681
      by (simp add: supp_plus_perm_eq)
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2682
    then have "supp ?q = insert x Xs \<union> ?q \<bullet> insert x Xs"
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2683
      using p2 `sort_of y = sort_of x` `x \<noteq> y` unfolding q supp_swap
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2684
      by auto
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2685
    ultimately show ?case by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2686
  qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2687
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2688
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2689
lemma at_set_avoiding:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2690
  assumes a: "finite Xs"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2691
  and     b: "finite (supp c)"
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2692
  obtains p::"perm" where "(p \<bullet> Xs)\<sharp>*c" and "(supp p) = (Xs \<union> (p \<bullet> Xs))"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2693
  using a b at_set_avoiding_aux [where Xs="Xs" and As="Xs \<union> supp c"]
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2694
  unfolding fresh_star_def fresh_def by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2695
2589
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2696
lemma at_set_avoiding1:
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2697
  assumes "finite xs"
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2698
  and     "finite (supp c)"
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2699
  shows "\<exists>p. (p \<bullet> xs) \<sharp>* c"
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2700
using assms
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2701
apply(erule_tac c="c" in at_set_avoiding)
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2702
apply(auto)
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2703
done
9781db0e2196 completed proofs in Foo2
Christian Urban <urbanc@in.tum.de>
parents: 2588
diff changeset
  2704
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2705
lemma at_set_avoiding2:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2706
  assumes "finite xs"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2707
  and     "finite (supp c)" "finite (supp x)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2708
  and     "xs \<sharp>* x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2709
  shows "\<exists>p. (p \<bullet> xs) \<sharp>* c \<and> supp x \<sharp>* p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2710
using assms
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2711
apply(erule_tac c="(c, x)" in at_set_avoiding)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2712
apply(simp add: supp_Pair)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2713
apply(rule_tac x="p" in exI)
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2714
apply(simp add: fresh_star_Pair)
2507
f5621efe5a20 changed to llncs
Christian Urban <urbanc@in.tum.de>
parents: 2479
diff changeset
  2715
apply(rule fresh_star_supp_conv)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2716
apply(auto simp: fresh_star_def)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2717
done
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2718
2573
6c131c089ce2 added example Foo2.thy
Christian Urban <urbanc@in.tum.de>
parents: 2568
diff changeset
  2719
lemma at_set_avoiding3:
6c131c089ce2 added example Foo2.thy
Christian Urban <urbanc@in.tum.de>
parents: 2568
diff changeset
  2720
  assumes "finite xs"
6c131c089ce2 added example Foo2.thy
Christian Urban <urbanc@in.tum.de>
parents: 2568
diff changeset
  2721
  and     "finite (supp c)" "finite (supp x)"
6c131c089ce2 added example Foo2.thy
Christian Urban <urbanc@in.tum.de>
parents: 2568
diff changeset
  2722
  and     "xs \<sharp>* x"
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2723
  shows "\<exists>p. (p \<bullet> xs) \<sharp>* c \<and> supp x \<sharp>* p \<and> supp p = xs \<union> (p \<bullet> xs)"
2586
3ebc7ecfb0dd disabled the Foo examples, because of heavy work
Christian Urban <urbanc@in.tum.de>
parents: 2573
diff changeset
  2724
using assms
3ebc7ecfb0dd disabled the Foo examples, because of heavy work
Christian Urban <urbanc@in.tum.de>
parents: 2573
diff changeset
  2725
apply(erule_tac c="(c, x)" in at_set_avoiding)
3ebc7ecfb0dd disabled the Foo examples, because of heavy work
Christian Urban <urbanc@in.tum.de>
parents: 2573
diff changeset
  2726
apply(simp add: supp_Pair)
3ebc7ecfb0dd disabled the Foo examples, because of heavy work
Christian Urban <urbanc@in.tum.de>
parents: 2573
diff changeset
  2727
apply(rule_tac x="p" in exI)
2591
35c570891a3a isarfied some of the high-level proofs
Christian Urban <urbanc@in.tum.de>
parents: 2589
diff changeset
  2728
apply(simp add: fresh_star_Pair)
2586
3ebc7ecfb0dd disabled the Foo examples, because of heavy work
Christian Urban <urbanc@in.tum.de>
parents: 2573
diff changeset
  2729
apply(rule fresh_star_supp_conv)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2730
apply(auto simp: fresh_star_def)
2586
3ebc7ecfb0dd disabled the Foo examples, because of heavy work
Christian Urban <urbanc@in.tum.de>
parents: 2573
diff changeset
  2731
done
2573
6c131c089ce2 added example Foo2.thy
Christian Urban <urbanc@in.tum.de>
parents: 2568
diff changeset
  2732
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2733
lemma at_set_avoiding2_atom:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2734
  assumes "finite (supp c)" "finite (supp x)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2735
  and     b: "a \<sharp> x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2736
  shows "\<exists>p. (p \<bullet> a) \<sharp> c \<and> supp x \<sharp>* p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2737
proof -
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2738
  have a: "{a} \<sharp>* x" unfolding fresh_star_def by (simp add: b)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2739
  obtain p where p1: "(p \<bullet> {a}) \<sharp>* c" and p2: "supp x \<sharp>* p"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2740
    using at_set_avoiding2[of "{a}" "c" "x"] assms a by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2741
  have c: "(p \<bullet> a) \<sharp> c" using p1
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2742
    unfolding fresh_star_def Ball_def 
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
  2743
    by(erule_tac x="p \<bullet> a" in allE) (simp add: permute_set_def)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2744
  hence "p \<bullet> a \<sharp> c \<and> supp x \<sharp>* p" using p2 by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2745
  then show "\<exists>p. (p \<bullet> a) \<sharp> c \<and> supp x \<sharp>* p" by blast
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2746
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2747
2614
0d7a1703fe28 a stronger statement for at_set_avoiding
Christian Urban <urbanc@in.tum.de>
parents: 2611
diff changeset
  2748
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2749
section {* Renaming permutations *}
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2750
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2751
lemma set_renaming_perm:
2659
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2752
  assumes b: "finite bs"
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2753
  shows "\<exists>q. (\<forall>b \<in> bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> bs \<union> (p \<bullet> bs)"
2659
619ecb57db38 strengthened renaming lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2657
diff changeset
  2754
using b
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2755
proof (induct)
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2756
  case empty
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2757
  have "(\<forall>b \<in> {}. 0 \<bullet> b = p \<bullet> b) \<and> supp (0::perm) \<subseteq> {} \<union> p \<bullet> {}"
3104
f7c4b8e6918b updated to explicit set type constructor (post Isabelle 3rd January)
Christian Urban <urbanc@in.tum.de>
parents: 3101
diff changeset
  2758
    by (simp add: permute_set_def supp_perm)
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2759
  then show "\<exists>q. (\<forall>b \<in> {}. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> {} \<union> p \<bullet> {}" by blast
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2760
next
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2761
  case (insert a bs)
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2762
  then have " \<exists>q. (\<forall>b \<in> bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> bs \<union> p \<bullet> bs" by simp 
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2763
  then obtain q where *: "\<forall>b \<in> bs. q \<bullet> b = p \<bullet> b" and **: "supp q \<subseteq> bs \<union> p \<bullet> bs"
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2764
    by (metis empty_subsetI insert(3) supp_swap) 
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2765
  { assume 1: "q \<bullet> a = p \<bullet> a"
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2766
    have "\<forall>b \<in> (insert a bs). q \<bullet> b = p \<bullet> b" using 1 * by simp
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2767
    moreover 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2768
    have "supp q \<subseteq> insert a bs \<union> p \<bullet> insert a bs" 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2769
      using ** by (auto simp: insert_eqvt)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2770
    ultimately 
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2771
    have "\<exists>q. (\<forall>b \<in> insert a bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> insert a bs \<union> p \<bullet> insert a bs" by blast
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2772
  }
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2773
  moreover
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2774
  { assume 2: "q \<bullet> a \<noteq> p \<bullet> a"
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2775
    def q' \<equiv> "((q \<bullet> a) \<rightleftharpoons> (p \<bullet> a)) + q"
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2776
    have "\<forall>b \<in> insert a bs. q' \<bullet> b = p \<bullet> b" using 2 * `a \<notin> bs` unfolding q'_def
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2777
      by (auto simp: swap_atom)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2778
    moreover 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2779
    { have "{q \<bullet> a, p \<bullet> a} \<subseteq> insert a bs \<union> p \<bullet> insert a bs"
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2780
        using ** 
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2781
        apply (auto simp: supp_perm insert_eqvt)
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2782
        apply (subgoal_tac "q \<bullet> a \<in> bs \<union> p \<bullet> bs")
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2783
        apply(auto)[1]
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2784
        apply(subgoal_tac "q \<bullet> a \<in> {a. q \<bullet> a \<noteq> a}")
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2785
        apply(blast)
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2786
        apply(simp)
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2787
        done
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  2788
      then have "supp (q \<bullet> a \<rightleftharpoons> p \<bullet> a) \<subseteq> insert a bs \<union> p \<bullet> insert a bs" 
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  2789
        unfolding supp_swap by auto
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2790
      moreover
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2791
      have "supp q \<subseteq> insert a bs \<union> p \<bullet> insert a bs" 
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2792
        using ** by (auto simp: insert_eqvt)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2793
      ultimately 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2794
      have "supp q' \<subseteq> insert a bs \<union> p \<bullet> insert a bs" 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2795
        unfolding q'_def using supp_plus_perm by blast
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2796
    }
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2797
    ultimately 
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2798
    have "\<exists>q. (\<forall>b \<in> insert a bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> insert a bs \<union> p \<bullet> insert a bs" by blast
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2799
  }
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2800
  ultimately show "\<exists>q. (\<forall>b \<in> insert a bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> insert a bs \<union> p \<bullet> insert a bs"
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2801
    by blast
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2802
qed
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2803
2672
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2804
lemma set_renaming_perm2:
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2805
  shows "\<exists>q. (\<forall>b \<in> bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> bs \<union> (p \<bullet> bs)"
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2806
proof -
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2807
  have "finite (bs \<inter> supp p)" by (simp add: finite_supp)
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2808
  then obtain q 
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2809
    where *: "\<forall>b \<in> bs \<inter> supp p. q \<bullet> b = p \<bullet> b" and **: "supp q \<subseteq> (bs \<inter> supp p) \<union> (p \<bullet> (bs \<inter> supp p))"
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2810
    using set_renaming_perm by blast
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2811
  from ** have "supp q \<subseteq> bs \<union> (p \<bullet> bs)" by (auto simp: inter_eqvt)
2672
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2812
  moreover
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2813
  have "\<forall>b \<in> bs - supp p. q \<bullet> b = p \<bullet> b" 
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2814
    apply(auto)
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2815
    apply(subgoal_tac "b \<notin> supp q")
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2816
    apply(simp add: fresh_def[symmetric])
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2817
    apply(simp add: fresh_perm)
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2818
    apply(clarify)
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2819
    apply(rotate_tac 2)
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2820
    apply(drule subsetD[OF **])
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2821
    apply(simp add: inter_eqvt supp_eqvt permute_self)
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2822
    done
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2823
  ultimately have "(\<forall>b \<in> bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> bs \<union> (p \<bullet> bs)" using * by auto
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2824
  then show "\<exists>q. (\<forall>b \<in> bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> bs \<union> (p \<bullet> bs)" by blast
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2825
qed
7e7662890477 removed finiteness assumption from set_rename_perm
Christian Urban <urbanc@in.tum.de>
parents: 2669
diff changeset
  2826
    
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2827
lemma list_renaming_perm:
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2828
  shows "\<exists>q. (\<forall>b \<in> set bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> set bs \<union> (p \<bullet> set bs)"
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2829
proof (induct bs)
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2830
  case (Cons a bs)
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2831
  then have " \<exists>q. (\<forall>b \<in> set bs. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> set bs \<union> p \<bullet> (set bs)"  by simp
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2832
  then obtain q where *: "\<forall>b \<in> set bs. q \<bullet> b = p \<bullet> b" and **: "supp q \<subseteq> set bs \<union> p \<bullet> (set bs)"
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2833
    by (blast)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2834
  { assume 1: "a \<in> set bs"
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2835
    have "q \<bullet> a = p \<bullet> a" using * 1 by (induct bs) (auto)
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2836
    then have "\<forall>b \<in> set (a # bs). q \<bullet> b = p \<bullet> b" using * by simp 
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2837
    moreover 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2838
    have "supp q \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))" using ** by (auto simp: insert_eqvt)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2839
    ultimately 
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2840
    have "\<exists>q. (\<forall>b \<in> set (a # bs). q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))" by blast
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2841
  }
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2842
  moreover
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2843
  { assume 2: "a \<notin> set bs"
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2844
    def q' \<equiv> "((q \<bullet> a) \<rightleftharpoons> (p \<bullet> a)) + q"
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2845
    have "\<forall>b \<in> set (a # bs). q' \<bullet> b = p \<bullet> b" 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2846
      unfolding q'_def using 2 * `a \<notin> set bs` by (auto simp: swap_atom)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2847
    moreover 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2848
    { have "{q \<bullet> a, p \<bullet> a} \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))"
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2849
        using **
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2850
        apply (auto simp: supp_perm insert_eqvt)
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2851
        apply (subgoal_tac "q \<bullet> a \<in> set bs \<union> p \<bullet> set bs")
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2852
        apply(auto)[1]
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2853
        apply(subgoal_tac "q \<bullet> a \<in> {a. q \<bullet> a \<noteq> a}")
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2854
        apply(blast)
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2855
        apply(simp)
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2856
        done
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  2857
      then have "supp (q \<bullet> a \<rightleftharpoons> p \<bullet> a) \<subseteq> set (a # bs) \<union> p \<bullet> set (a # bs)" 
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  2858
        unfolding supp_swap by auto
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2859
      moreover
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2860
      have "supp q \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))" 
3229
b52e8651591f updated to Isabelle changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3226
diff changeset
  2861
        using ** by (auto simp: insert_eqvt)
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2862
      ultimately 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2863
      have "supp q' \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))" 
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2864
        unfolding q'_def using supp_plus_perm by blast
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2865
    }
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2866
    ultimately 
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2867
    have "\<exists>q. (\<forall>b \<in> set (a # bs).  q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))" by blast
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2868
  }
2668
92c001d93225 modified the renaming_perm lemmas
Christian Urban <urbanc@in.tum.de>
parents: 2663
diff changeset
  2869
  ultimately show "\<exists>q. (\<forall>b \<in> set (a # bs). q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> set (a # bs) \<union> p \<bullet> (set (a # bs))"
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2870
    by blast
2771
66ef2a2c64fb more to the pearl paper
Christian Urban <urbanc@in.tum.de>
parents: 2760
diff changeset
  2871
next
66ef2a2c64fb more to the pearl paper
Christian Urban <urbanc@in.tum.de>
parents: 2760
diff changeset
  2872
 case Nil
66ef2a2c64fb more to the pearl paper
Christian Urban <urbanc@in.tum.de>
parents: 2760
diff changeset
  2873
  have "(\<forall>b \<in> set []. 0 \<bullet> b = p \<bullet> b) \<and> supp (0::perm) \<subseteq> set [] \<union> p \<bullet> set []" 
66ef2a2c64fb more to the pearl paper
Christian Urban <urbanc@in.tum.de>
parents: 2760
diff changeset
  2874
    by (simp add: supp_zero_perm)
66ef2a2c64fb more to the pearl paper
Christian Urban <urbanc@in.tum.de>
parents: 2760
diff changeset
  2875
  then show "\<exists>q. (\<forall>b \<in> set []. q \<bullet> b = p \<bullet> b) \<and> supp q \<subseteq> set [] \<union> p \<bullet> (set [])" by blast
2599
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2876
qed
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2877
d6fe94028a5d moved general theorems into the libraries
Christian Urban <urbanc@in.tum.de>
parents: 2591
diff changeset
  2878
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  2879
section {* Concrete Atoms Types *}
1962
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2880
1972
40db835442a0 deleted left-over code
Christian Urban <urbanc@in.tum.de>
parents: 1971
diff changeset
  2881
text {*
40db835442a0 deleted left-over code
Christian Urban <urbanc@in.tum.de>
parents: 1971
diff changeset
  2882
  Class @{text at_base} allows types containing multiple sorts of atoms.
40db835442a0 deleted left-over code
Christian Urban <urbanc@in.tum.de>
parents: 1971
diff changeset
  2883
  Class @{text at} only allows types with a single sort.
40db835442a0 deleted left-over code
Christian Urban <urbanc@in.tum.de>
parents: 1971
diff changeset
  2884
*}
40db835442a0 deleted left-over code
Christian Urban <urbanc@in.tum.de>
parents: 1971
diff changeset
  2885
1962
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2886
class at_base = pt +
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2887
  fixes atom :: "'a \<Rightarrow> atom"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2888
  assumes atom_eq_iff [simp]: "atom a = atom b \<longleftrightarrow> a = b"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2889
  assumes atom_eqvt: "p \<bullet> (atom a) = atom (p \<bullet> a)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2890
3197
25d11b449e92 definition of an auxiliary graph in nominal-primrec definitions
Christian Urban <urbanc@in.tum.de>
parents: 3195
diff changeset
  2891
declare atom_eqvt [eqvt]
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  2892
1962
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2893
class at = at_base +
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2894
  assumes sort_of_atom_eq [simp]: "sort_of (atom a) = sort_of (atom b)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2895
2900
d66430c7c4f1 an alternative FCB for Abs_lst1; seems simpler but not as simple as I thought; not sure whether it generalises to multiple binders.
Christian Urban <urbanc@in.tum.de>
parents: 2891
diff changeset
  2896
lemma sort_ineq [simp]:
d66430c7c4f1 an alternative FCB for Abs_lst1; seems simpler but not as simple as I thought; not sure whether it generalises to multiple binders.
Christian Urban <urbanc@in.tum.de>
parents: 2891
diff changeset
  2897
  assumes "sort_of (atom a) \<noteq> sort_of (atom b)"
d66430c7c4f1 an alternative FCB for Abs_lst1; seems simpler but not as simple as I thought; not sure whether it generalises to multiple binders.
Christian Urban <urbanc@in.tum.de>
parents: 2891
diff changeset
  2898
  shows "atom a \<noteq> atom b"
d66430c7c4f1 an alternative FCB for Abs_lst1; seems simpler but not as simple as I thought; not sure whether it generalises to multiple binders.
Christian Urban <urbanc@in.tum.de>
parents: 2891
diff changeset
  2899
using assms by metis
d66430c7c4f1 an alternative FCB for Abs_lst1; seems simpler but not as simple as I thought; not sure whether it generalises to multiple binders.
Christian Urban <urbanc@in.tum.de>
parents: 2891
diff changeset
  2900
1962
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2901
lemma supp_at_base: 
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2902
  fixes a::"'a::at_base"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2903
  shows "supp a = {atom a}"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2904
  by (simp add: supp_atom [symmetric] supp_def atom_eqvt)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2905
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2906
lemma fresh_at_base: 
2891
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  2907
  shows  "sort_of a \<noteq> sort_of (atom b) \<Longrightarrow> a \<sharp> b"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  2908
  and "a \<sharp> b \<longleftrightarrow> a \<noteq> atom b"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  2909
  unfolding fresh_def 
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  2910
  apply(simp_all add: supp_at_base)
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  2911
  apply(metis)
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  2912
  done
3185
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2913
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2914
(* solves the freshness only if the inequality can be shown by the
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2915
   simproc below *)  
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2916
lemma fresh_ineq_at_base [simp]:
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2917
  shows "a \<noteq> atom b \<Longrightarrow> a \<sharp> b"
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2918
  by (simp add: fresh_at_base)
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2919
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2920
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2921
lemma fresh_atom_at_base [simp]: 
2609
666ffc8a92a9 freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
Christian Urban <urbanc@in.tum.de>
parents: 2599
diff changeset
  2922
  fixes b::"'a::at_base"
666ffc8a92a9 freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
Christian Urban <urbanc@in.tum.de>
parents: 2599
diff changeset
  2923
  shows "a \<sharp> atom b \<longleftrightarrow> a \<sharp> b"
666ffc8a92a9 freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
Christian Urban <urbanc@in.tum.de>
parents: 2599
diff changeset
  2924
  by (simp add: fresh_def supp_at_base supp_atom)
666ffc8a92a9 freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
Christian Urban <urbanc@in.tum.de>
parents: 2599
diff changeset
  2925
2611
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2926
lemma fresh_star_atom_at_base: 
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2927
  fixes b::"'a::at_base"
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2928
  shows "as \<sharp>* atom b \<longleftrightarrow> as \<sharp>* b"
3d101f2f817c simple cases for strong inducts done; infrastructure for the difficult ones is there
Christian Urban <urbanc@in.tum.de>
parents: 2609
diff changeset
  2929
  by (simp add: fresh_star_def fresh_atom_at_base)
2609
666ffc8a92a9 freshness theorem in strong exhausts; (temporarily includes a cheat_tac to make all tests go through)
Christian Urban <urbanc@in.tum.de>
parents: 2599
diff changeset
  2930
3174
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2931
lemma if_fresh_at_base [simp]:
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2932
  shows "atom a \<sharp> x \<Longrightarrow> P (if a = x then t else s) = P s"
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2933
  and   "atom a \<sharp> x \<Longrightarrow> P (if x = a then t else s) = P s"
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2934
by (simp_all add: fresh_at_base)
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2935
3185
3641530002d6 added a rule about inequality of freshness between atoms to the simplifier
Christian Urban <urbanc@in.tum.de>
parents: 3184
diff changeset
  2936
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
  2937
simproc_setup fresh_ineq ("x \<noteq> (y::'a::at_base)") = {* fn _ => fn ctxt => fn ctrm =>
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  2938
  case Thm.term_of ctrm of @{term "HOL.Not"} $ (Const (@{const_name HOL.eq}, _) $ lhs $ rhs) =>
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2939
    let  
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2940
      fun first_is_neg lhs rhs [] = NONE
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2941
        | first_is_neg lhs rhs (thm::thms) =
3174
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2942
          (case Thm.prop_of thm of
3233
9ae285ce814e updated changes from upstream (AFP)
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3231
diff changeset
  2943
             _ $ (@{term "HOL.Not"} $ (Const (@{const_name HOL.eq}, _) $ l $ r)) =>
3174
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2944
               (if l = lhs andalso r = rhs then SOME(thm)
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2945
                else if r = lhs andalso l = rhs then SOME(thm RS @{thm not_sym})
3176
31372760c2fb fixed bug in simproc (also in the exec-version)
Christian Urban <urbanc@in.tum.de>
parents: 3175
diff changeset
  2946
                else first_is_neg lhs rhs thms)  
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2947
        | _ => first_is_neg lhs rhs thms)
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2948
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2949
      val simp_thms = @{thms fresh_Pair fresh_at_base atom_eq_iff}
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2950
      val prems = Simplifier.prems_of ctxt
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2951
         |> filter (fn thm => case Thm.prop_of thm of                    
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2952
            _ $ (Const (@{const_name fresh}, ty) $ (_ $ a) $ b) => 
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2953
            (let 
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2954
               val atms = a :: HOLogic.strip_tuple b
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2955
             in
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2956
               member (op=) atms lhs andalso member (op=) atms rhs
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2957
             end) 
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2958
            | _ => false)
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  2959
         |> map (simplify (put_simpset HOL_basic_ss ctxt addsimps simp_thms))
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  2960
         |> map (HOLogic.conj_elims ctxt)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2961
         |> flat
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2962
    in 
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2963
      case first_is_neg lhs rhs prems of
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2964
        SOME(thm) => SOME(thm RS @{thm Eq_TrueI})
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2965
      | NONE => NONE
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2966
    end
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  2967
  | _ => NONE
3174
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2968
*}
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2969
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  2970
1962
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2971
instance at_base < fs
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2972
proof qed (simp add: supp_at_base)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2973
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2974
lemma at_base_infinite [simp]:
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2975
  shows "infinite (UNIV :: 'a::at_base set)" (is "infinite ?U")
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2976
proof
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2977
  obtain a :: 'a where "True" by auto
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2978
  assume "finite ?U"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2979
  hence "finite (atom ` ?U)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2980
    by (rule finite_imageI)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2981
  then obtain b where b: "b \<notin> atom ` ?U" "sort_of b = sort_of (atom a)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2982
    by (rule obtain_atom)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2983
  from b(2) have "b = atom ((atom a \<rightleftharpoons> b) \<bullet> a)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2984
    unfolding atom_eqvt [symmetric]
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2985
    by (simp add: swap_atom)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2986
  hence "b \<in> atom ` ?U" by simp
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2987
  with b(1) show "False" by simp
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2988
qed
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2989
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2990
lemma swap_at_base_simps [simp]:
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2991
  fixes x y::"'a::at_base"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2992
  shows "sort_of (atom x) = sort_of (atom y) \<Longrightarrow> (atom x \<rightleftharpoons> atom y) \<bullet> x = y"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2993
  and   "sort_of (atom x) = sort_of (atom y) \<Longrightarrow> (atom x \<rightleftharpoons> atom y) \<bullet> y = x"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2994
  and   "atom x \<noteq> a \<Longrightarrow> atom x \<noteq> b \<Longrightarrow> (a \<rightleftharpoons> b) \<bullet> x = x"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2995
  unfolding atom_eq_iff [symmetric]
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2996
  unfolding atom_eqvt [symmetric]
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2997
  by simp_all
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2998
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  2999
lemma obtain_at_base:
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3000
  assumes X: "finite X"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3001
  obtains a::"'a::at_base" where "atom a \<notin> X"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3002
proof -
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3003
  have "inj (atom :: 'a \<Rightarrow> atom)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3004
    by (simp add: inj_on_def)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3005
  with X have "finite (atom -` X :: 'a set)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3006
    by (rule finite_vimageI)
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3007
  with at_base_infinite have "atom -` X \<noteq> (UNIV :: 'a set)"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3008
    by auto
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3009
  then obtain a :: 'a where "atom a \<notin> X"
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3010
    by auto
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3011
  thus ?thesis ..
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3012
qed
84a13d1e2511 moved mk_atom into the library; that meant that concrete atom classes need to be in Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1941
diff changeset
  3013
2685
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3014
lemma obtain_fresh':
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3015
  assumes fin: "finite (supp x)"
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3016
  obtains a::"'a::at_base" where "atom a \<sharp> x"
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3017
using obtain_at_base[where X="supp x"]
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  3018
by (auto simp: fresh_def fin)
2685
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3019
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3020
lemma obtain_fresh:
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3021
  fixes x::"'b::fs"
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3022
  obtains a::"'a::at_base" where "atom a \<sharp> x"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  3023
  by (rule obtain_fresh') (auto simp: finite_supp)
2685
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3024
1973
fc5ce7f22b74 use the more general type-class at_base
Christian Urban <urbanc@in.tum.de>
parents: 1972
diff changeset
  3025
lemma supp_finite_set_at_base:
1971
8daf6ff5e11a simpliied and moved the remaining lemmas about the atom-function to Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1962
diff changeset
  3026
  assumes a: "finite S"
8daf6ff5e11a simpliied and moved the remaining lemmas about the atom-function to Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1962
diff changeset
  3027
  shows "supp S = atom ` S"
2565
6bf332360510 moved most material fron Nominal2_FSet into the Nominal_Base theory
Christian Urban <urbanc@in.tum.de>
parents: 2560
diff changeset
  3028
apply(simp add: supp_of_finite_sets[OF a])
2466
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  3029
apply(simp add: supp_at_base)
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  3030
apply(auto)
47c840599a6b cleaned a bit various thy-files in Nominal-General
Christian Urban <urbanc@in.tum.de>
parents: 2378
diff changeset
  3031
done
1971
8daf6ff5e11a simpliied and moved the remaining lemmas about the atom-function to Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1962
diff changeset
  3032
2743
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3033
(* FIXME 
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3034
lemma supp_cofinite_set_at_base:
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3035
  assumes a: "finite (UNIV - S)"
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3036
  shows "supp S = atom ` (UNIV - S)"
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3037
apply(rule finite_supp_unique)
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3038
*)
7085ab735de7 equivariance for All and Ex can be proved in terms of their definition
Christian Urban <urbanc@in.tum.de>
parents: 2742
diff changeset
  3039
2657
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3040
lemma fresh_finite_set_at_base:
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3041
  fixes a::"'a::at_base"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3042
  assumes a: "finite S"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3043
  shows "atom a \<sharp> S \<longleftrightarrow> a \<notin> S"
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3044
  unfolding fresh_def
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3045
  apply(simp add: supp_finite_set_at_base[OF a])
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3046
  apply(subst inj_image_mem_iff)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3047
  apply(simp add: inj_on_def)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3048
  apply(simp)
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3049
  done
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3050
2776
8e0f0b2b51dd more on pearl-paper
Christian Urban <urbanc@in.tum.de>
parents: 2771
diff changeset
  3051
lemma fresh_at_base_permute_iff [simp]:
2683
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  3052
  fixes a::"'a::at_base"
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  3053
  shows "atom (p \<bullet> a) \<sharp> p \<bullet> x \<longleftrightarrow> atom a \<sharp> x"
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  3054
  unfolding atom_eqvt[symmetric]
3183
313e6f2cdd89 added permutation simplification to the simplifier; this makes the simplifier more powerful, but it potentially loops more often
Christian Urban <urbanc@in.tum.de>
parents: 3180
diff changeset
  3055
  by (simp only: fresh_permute_iff)
2683
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  3056
3221
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  3057
lemma fresh_at_base_permI: 
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  3058
  shows "atom a \<sharp> p \<Longrightarrow> p \<bullet> a = a"
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  3059
by (simp add: fresh_def supp_perm)
ea327a4c4f43 added some lemmas
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3219
diff changeset
  3060
2657
1ea9c059fc0f a few lemmas about freshness for at and at_base
Christian Urban <urbanc@in.tum.de>
parents: 2641
diff changeset
  3061
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3062
section {* Infrastructure for concrete atom types *}
1971
8daf6ff5e11a simpliied and moved the remaining lemmas about the atom-function to Nominal2_Base
Christian Urban <urbanc@in.tum.de>
parents: 1962
diff changeset
  3063
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3064
definition
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3065
  flip :: "'a::at_base \<Rightarrow> 'a \<Rightarrow> perm" ("'(_ \<leftrightarrow> _')")
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3066
where
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3067
  "(a \<leftrightarrow> b) = (atom a \<rightleftharpoons> atom b)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3068
3191
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3069
lemma flip_fresh_fresh:
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3070
  assumes "atom a \<sharp> x" "atom b \<sharp> x"
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3071
  shows "(a \<leftrightarrow> b) \<bullet> x = x"
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3072
using assms
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3073
by (simp add: flip_def swap_fresh_fresh)
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3074
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3075
lemma flip_self [simp]: "(a \<leftrightarrow> a) = 0"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3076
  unfolding flip_def by (rule swap_self)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3077
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3078
lemma flip_commute: "(a \<leftrightarrow> b) = (b \<leftrightarrow> a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3079
  unfolding flip_def by (rule swap_commute)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3080
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3081
lemma minus_flip [simp]: "- (a \<leftrightarrow> b) = (a \<leftrightarrow> b)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3082
  unfolding flip_def by (rule minus_swap)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3083
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3084
lemma add_flip_cancel: "(a \<leftrightarrow> b) + (a \<leftrightarrow> b) = 0"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3085
  unfolding flip_def by (rule swap_cancel)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3086
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3087
lemma permute_flip_cancel [simp]: "(a \<leftrightarrow> b) \<bullet> (a \<leftrightarrow> b) \<bullet> x = x"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3088
  unfolding permute_plus [symmetric] add_flip_cancel by simp
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3089
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3090
lemma permute_flip_cancel2 [simp]: "(a \<leftrightarrow> b) \<bullet> (b \<leftrightarrow> a) \<bullet> x = x"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3091
  by (simp add: flip_commute)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3092
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  3093
lemma flip_eqvt [eqvt]: 
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3094
  shows "p \<bullet> (a \<leftrightarrow> b) = (p \<bullet> a \<leftrightarrow> p \<bullet> b)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3095
  unfolding flip_def
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3096
  by (simp add: swap_eqvt atom_eqvt)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3097
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3098
lemma flip_at_base_simps [simp]:
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3099
  shows "sort_of (atom a) = sort_of (atom b) \<Longrightarrow> (a \<leftrightarrow> b) \<bullet> a = b"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3100
  and   "sort_of (atom a) = sort_of (atom b) \<Longrightarrow> (a \<leftrightarrow> b) \<bullet> b = a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3101
  and   "\<lbrakk>a \<noteq> c; b \<noteq> c\<rbrakk> \<Longrightarrow> (a \<leftrightarrow> b) \<bullet> c = c"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3102
  and   "sort_of (atom a) \<noteq> sort_of (atom b) \<Longrightarrow> (a \<leftrightarrow> b) \<bullet> x = x"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3103
  unfolding flip_def
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3104
  unfolding atom_eq_iff [symmetric]
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3105
  unfolding atom_eqvt [symmetric]
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3106
  by simp_all
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3107
3245
017e33849f4d updated to Isabelle 2016-1
Christian Urban <urbanc@in.tum.de>
parents: 3244
diff changeset
  3108
text {* the following two lemmas do not hold for @{text at_base}, 
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3109
  only for single sort atoms from at *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3110
3191
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3111
lemma flip_triple:
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3112
  fixes a b c::"'a::at"
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3113
  assumes "a \<noteq> b" and "c \<noteq> b"
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3114
  shows "(a \<leftrightarrow> c) + (b \<leftrightarrow> c) + (a \<leftrightarrow> c) = (a \<leftrightarrow> b)"
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3115
  unfolding flip_def
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3116
  by (rule swap_triple) (simp_all add: assms)
0440bc1a2438 streamlined definition of alpha-equivalence for single binders (used flip instead of swap)
Christian Urban <urbanc@in.tum.de>
parents: 3189
diff changeset
  3117
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3118
lemma permute_flip_at:
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3119
  fixes a b c::"'a::at"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3120
  shows "(a \<leftrightarrow> b) \<bullet> c = (if c = a then b else if c = b then a else c)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3121
  unfolding flip_def
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3122
  apply (rule atom_eq_iff [THEN iffD1])
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3123
  apply (subst atom_eqvt [symmetric])
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3124
  apply (simp add: swap_atom)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3125
  done
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3126
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3127
lemma flip_at_simps [simp]:
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3128
  fixes a b::"'a::at"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3129
  shows "(a \<leftrightarrow> b) \<bullet> a = b" 
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3130
  and   "(a \<leftrightarrow> b) \<bullet> b = a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3131
  unfolding permute_flip_at by simp_all
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3132
2683
42c0d011a177 ported some of the old proofs to serve as testcases
Christian Urban <urbanc@in.tum.de>
parents: 2679
diff changeset
  3133
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3134
subsection {* Syntax for coercing at-elements to the atom-type *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3135
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3136
syntax
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3137
  "_atom_constrain" :: "logic \<Rightarrow> type \<Rightarrow> logic" ("_:::_" [4, 0] 3)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3138
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3139
translations
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3140
  "_atom_constrain a t" => "CONST atom (_constrain a t)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3141
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3142
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3143
subsection {* A lemma for proving instances of class @{text at}. *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3144
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3145
setup {* Sign.add_const_constraint (@{const_name "permute"}, NONE) *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3146
setup {* Sign.add_const_constraint (@{const_name "atom"}, NONE) *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3147
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3148
text {*
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3149
  New atom types are defined as subtypes of @{typ atom}.
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3150
*}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3151
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3152
lemma exists_eq_simple_sort: 
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3153
  shows "\<exists>a. a \<in> {a. sort_of a = s}"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3154
  by (rule_tac x="Atom s 0" in exI, simp)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3155
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3156
lemma exists_eq_sort: 
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3157
  shows "\<exists>a. a \<in> {a. sort_of a \<in> range sort_fun}"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3158
  by (rule_tac x="Atom (sort_fun x) y" in exI, simp)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3159
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3160
lemma at_base_class:
2847
Christian Urban <urbanc@in.tum.de>
parents: 2820
diff changeset
  3161
  fixes sort_fun :: "'b \<Rightarrow> atom_sort"
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3162
  fixes Rep :: "'a \<Rightarrow> atom" and Abs :: "atom \<Rightarrow> 'a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3163
  assumes type: "type_definition Rep Abs {a. sort_of a \<in> range sort_fun}"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3164
  assumes atom_def: "\<And>a. atom a = Rep a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3165
  assumes permute_def: "\<And>p a. p \<bullet> a = Abs (p \<bullet> Rep a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3166
  shows "OFCLASS('a, at_base_class)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3167
proof
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3168
  interpret type_definition Rep Abs "{a. sort_of a \<in> range sort_fun}" by (rule type)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3169
  have sort_of_Rep: "\<And>a. sort_of (Rep a) \<in> range sort_fun" using Rep by simp
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3170
  fix a b :: 'a and p p1 p2 :: perm
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3171
  show "0 \<bullet> a = a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3172
    unfolding permute_def by (simp add: Rep_inverse)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3173
  show "(p1 + p2) \<bullet> a = p1 \<bullet> p2 \<bullet> a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3174
    unfolding permute_def by (simp add: Abs_inverse sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3175
  show "atom a = atom b \<longleftrightarrow> a = b"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3176
    unfolding atom_def by (simp add: Rep_inject)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3177
  show "p \<bullet> atom a = atom (p \<bullet> a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3178
    unfolding permute_def atom_def by (simp add: Abs_inverse sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3179
qed
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3180
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3181
(*
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3182
lemma at_class:
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3183
  fixes s :: atom_sort
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3184
  fixes Rep :: "'a \<Rightarrow> atom" and Abs :: "atom \<Rightarrow> 'a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3185
  assumes type: "type_definition Rep Abs {a. sort_of a \<in> range (\<lambda>x::unit. s)}"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3186
  assumes atom_def: "\<And>a. atom a = Rep a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3187
  assumes permute_def: "\<And>p a. p \<bullet> a = Abs (p \<bullet> Rep a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3188
  shows "OFCLASS('a, at_class)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3189
proof
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3190
  interpret type_definition Rep Abs "{a. sort_of a \<in> range (\<lambda>x::unit. s)}" by (rule type)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3191
  have sort_of_Rep: "\<And>a. sort_of (Rep a) = s" using Rep by (simp add: image_def)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3192
  fix a b :: 'a and p p1 p2 :: perm
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3193
  show "0 \<bullet> a = a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3194
    unfolding permute_def by (simp add: Rep_inverse)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3195
  show "(p1 + p2) \<bullet> a = p1 \<bullet> p2 \<bullet> a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3196
    unfolding permute_def by (simp add: Abs_inverse sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3197
  show "sort_of (atom a) = sort_of (atom b)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3198
    unfolding atom_def by (simp add: sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3199
  show "atom a = atom b \<longleftrightarrow> a = b"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3200
    unfolding atom_def by (simp add: Rep_inject)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3201
  show "p \<bullet> atom a = atom (p \<bullet> a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3202
    unfolding permute_def atom_def by (simp add: Abs_inverse sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3203
qed
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3204
*)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3205
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3206
lemma at_class:
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3207
  fixes s :: atom_sort
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3208
  fixes Rep :: "'a \<Rightarrow> atom" and Abs :: "atom \<Rightarrow> 'a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3209
  assumes type: "type_definition Rep Abs {a. sort_of a = s}"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3210
  assumes atom_def: "\<And>a. atom a = Rep a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3211
  assumes permute_def: "\<And>p a. p \<bullet> a = Abs (p \<bullet> Rep a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3212
  shows "OFCLASS('a, at_class)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3213
proof
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3214
  interpret type_definition Rep Abs "{a. sort_of a = s}" by (rule type)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3215
  have sort_of_Rep: "\<And>a. sort_of (Rep a) = s" using Rep by (simp add: image_def)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3216
  fix a b :: 'a and p p1 p2 :: perm
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3217
  show "0 \<bullet> a = a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3218
    unfolding permute_def by (simp add: Rep_inverse)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3219
  show "(p1 + p2) \<bullet> a = p1 \<bullet> p2 \<bullet> a"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3220
    unfolding permute_def by (simp add: Abs_inverse sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3221
  show "sort_of (atom a) = sort_of (atom b)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3222
    unfolding atom_def by (simp add: sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3223
  show "atom a = atom b \<longleftrightarrow> a = b"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3224
    unfolding atom_def by (simp add: Rep_inject)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3225
  show "p \<bullet> atom a = atom (p \<bullet> a)"
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3226
    unfolding permute_def atom_def by (simp add: Abs_inverse sort_of_Rep)
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3227
qed
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3228
2891
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3229
lemma at_class_sort:
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3230
  fixes s :: atom_sort
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3231
  fixes Rep :: "'a \<Rightarrow> atom" and Abs :: "atom \<Rightarrow> 'a"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3232
  fixes a::"'a"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3233
  assumes type: "type_definition Rep Abs {a. sort_of a = s}"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3234
  assumes atom_def: "\<And>a. atom a = Rep a"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3235
  shows "sort_of (atom a) = s"
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3236
  using atom_def type
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3237
  unfolding type_definition_def by simp
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3238
304dfe6cc83a the simplifier can simplify "sort (atom a)" if a is a concrete atom type declared with atom_decl
Christian Urban <urbanc@in.tum.de>
parents: 2868
diff changeset
  3239
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3240
setup {* Sign.add_const_constraint
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3241
  (@{const_name "permute"}, SOME @{typ "perm \<Rightarrow> 'a::pt \<Rightarrow> 'a"}) *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3242
setup {* Sign.add_const_constraint
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3243
  (@{const_name "atom"}, SOME @{typ "'a::at_base \<Rightarrow> atom"}) *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3244
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3245
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3246
section {* Library functions for the nominal infrastructure *}
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3247
3201
3e6f4320669f removed "use" - replaced by "ML_file"
Christian Urban <urbanc@in.tum.de>
parents: 3197
diff changeset
  3248
ML_file "nominal_library.ML"
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3249
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3250
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3251
section {* The freshness lemma according to Andy Pitts *}
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3252
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3253
lemma freshness_lemma:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3254
  fixes h :: "'a::at \<Rightarrow> 'b::pt"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3255
  assumes a: "\<exists>a. atom a \<sharp> (h, h a)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3256
  shows  "\<exists>x. \<forall>a. atom a \<sharp> h \<longrightarrow> h a = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3257
proof -
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3258
  from a obtain b where a1: "atom b \<sharp> h" and a2: "atom b \<sharp> h b"
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  3259
    by (auto simp: fresh_Pair)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3260
  show "\<exists>x. \<forall>a. atom a \<sharp> h \<longrightarrow> h a = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3261
  proof (intro exI allI impI)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3262
    fix a :: 'a
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3263
    assume a3: "atom a \<sharp> h"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3264
    show "h a = h b"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3265
    proof (cases "a = b")
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3266
      assume "a = b"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3267
      thus "h a = h b" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3268
    next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3269
      assume "a \<noteq> b"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3270
      hence "atom a \<sharp> b" by (simp add: fresh_at_base)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3271
      with a3 have "atom a \<sharp> h b" 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3272
        by (rule fresh_fun_app)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3273
      with a2 have d1: "(atom b \<rightleftharpoons> atom a) \<bullet> (h b) = (h b)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3274
        by (rule swap_fresh_fresh)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3275
      from a1 a3 have d2: "(atom b \<rightleftharpoons> atom a) \<bullet> h = h"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3276
        by (rule swap_fresh_fresh)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3277
      from d1 have "h b = (atom b \<rightleftharpoons> atom a) \<bullet> (h b)" by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3278
      also have "\<dots> = ((atom b \<rightleftharpoons> atom a) \<bullet> h) ((atom b \<rightleftharpoons> atom a) \<bullet> b)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3279
        by (rule permute_fun_app_eq)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3280
      also have "\<dots> = h a"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3281
        using d2 by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3282
      finally show "h a = h b"  by simp
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3283
    qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3284
  qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3285
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3286
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3287
lemma freshness_lemma_unique:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3288
  fixes h :: "'a::at \<Rightarrow> 'b::pt"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3289
  assumes a: "\<exists>a. atom a \<sharp> (h, h a)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3290
  shows "\<exists>!x. \<forall>a. atom a \<sharp> h \<longrightarrow> h a = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3291
proof (rule ex_ex1I)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3292
  from a show "\<exists>x. \<forall>a. atom a \<sharp> h \<longrightarrow> h a = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3293
    by (rule freshness_lemma)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3294
next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3295
  fix x y
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3296
  assume x: "\<forall>a. atom a \<sharp> h \<longrightarrow> h a = x"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3297
  assume y: "\<forall>a. atom a \<sharp> h \<longrightarrow> h a = y"
3174
8f51702e1f2e improved handling in the simplifier for inequalities derived from freshness assumptions
Christian Urban <urbanc@in.tum.de>
parents: 3167
diff changeset
  3298
  from a x y show "x = y" 
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  3299
    by (auto simp: fresh_Pair)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3300
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3301
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3302
text {* packaging the freshness lemma into a function *}
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3303
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3304
definition
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3305
  Fresh :: "('a::at \<Rightarrow> 'b::pt) \<Rightarrow> 'b"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3306
where
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3307
  "Fresh h = (THE x. \<forall>a. atom a \<sharp> h \<longrightarrow> h a = x)"
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3308
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3309
lemma Fresh_apply:
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3310
  fixes h :: "'a::at \<Rightarrow> 'b::pt"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3311
  assumes a: "\<exists>a. atom a \<sharp> (h, h a)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3312
  assumes b: "atom a \<sharp> h"
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3313
  shows "Fresh h = h a"
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3314
unfolding Fresh_def
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3315
proof (rule the_equality)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3316
  show "\<forall>a'. atom a' \<sharp> h \<longrightarrow> h a' = h a"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3317
  proof (intro strip)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3318
    fix a':: 'a
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3319
    assume c: "atom a' \<sharp> h"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3320
    from a have "\<exists>x. \<forall>a. atom a \<sharp> h \<longrightarrow> h a = x" by (rule freshness_lemma)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3321
    with b c show "h a' = h a" by auto
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3322
  qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3323
next
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3324
  fix fr :: 'b
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3325
  assume "\<forall>a. atom a \<sharp> h \<longrightarrow> h a = fr"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3326
  with b show "fr = h a" by auto
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3327
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3328
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3329
lemma Fresh_apply':
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3330
  fixes h :: "'a::at \<Rightarrow> 'b::pt"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3331
  assumes a: "atom a \<sharp> h" "atom a \<sharp> h a"
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3332
  shows "Fresh h = h a"
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3333
  apply (rule Fresh_apply)
3223
c9a1c6f50ff5 restricted fresh_ineq simproc so that it is faster
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3221
diff changeset
  3334
  apply (auto simp: fresh_Pair intro: a)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3335
  done
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3336
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
  3337
simproc_setup Fresh_simproc ("Fresh (h::'a::at \<Rightarrow> 'b::pt)") = {* fn _ => fn ctxt => fn ctrm =>
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3338
  let
3239
67370521c09c updated for Isabelle 2015
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3237
diff changeset
  3339
     val _ $ h = Thm.term_of ctrm
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3340
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3341
     val cfresh = @{const_name fresh}
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3342
     val catom  = @{const_name atom}
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3343
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
  3344
     val atoms = Simplifier.prems_of ctxt
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3345
      |> map_filter (fn thm => case Thm.prop_of thm of                    
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3346
           _ $ (Const (cfresh, _) $ (Const (catom, _) $ atm) $ _) => SOME (atm) | _ => NONE)
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3347
      |> distinct (op=)
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3348
     
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3349
     fun get_thm atm = 
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3350
       let
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3351
         val goal1 = HOLogic.mk_Trueprop (mk_fresh (mk_atom atm) h)
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3352
         val goal2 = HOLogic.mk_Trueprop (mk_fresh (mk_atom atm) (h $ atm))
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3353
 
3218
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
  3354
         val thm1 = Goal.prove ctxt [] [] goal1 (K (asm_simp_tac ctxt 1)) 
89158f401b07 updated to simplifier changes
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 3216
diff changeset
  3355
         val thm2 = Goal.prove ctxt [] [] goal2 (K (asm_simp_tac ctxt 1)) 
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3356
       in
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3357
         SOME (@{thm Fresh_apply'} OF [thm1, thm2] RS eq_reflection)
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3358
       end handle ERROR _ => NONE
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3359
  in
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3360
    get_first get_thm atoms
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3361
  end
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3362
*}
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3363
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3364
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3365
lemma Fresh_eqvt:
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3366
  fixes h :: "'a::at \<Rightarrow> 'b::pt"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3367
  assumes a: "\<exists>a. atom a \<sharp> (h, h a)"
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3368
  shows "p \<bullet> (Fresh h) = Fresh (p \<bullet> h)"
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3369
proof -
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3370
  from a obtain a::"'a::at" where fr: "atom a \<sharp> h" "atom a \<sharp> h a"
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3371
    by (metis fresh_Pair)
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3372
  then have fr_p: "atom (p \<bullet> a) \<sharp> (p \<bullet> h)" "atom (p \<bullet> a) \<sharp> (p \<bullet> h) (p \<bullet> a)"
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3373
    by (metis atom_eqvt fresh_permute_iff eqvt_apply)+
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3374
  have "p \<bullet> (Fresh h) = p \<bullet> (h a)" using fr by simp
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3375
  also have "... = (p \<bullet> h) (p \<bullet> a)" by simp
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3376
  also have "... = Fresh (p \<bullet> h)" using fr_p by simp
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3377
  finally show "p \<bullet> (Fresh h) = Fresh (p \<bullet> h)" .
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3378
qed
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3379
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3380
lemma Fresh_supports:
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3381
  fixes h :: "'a::at \<Rightarrow> 'b::pt"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3382
  assumes a: "\<exists>a. atom a \<sharp> (h, h a)"
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3383
  shows "(supp h) supports (Fresh h)"
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3384
  apply (simp add: supports_def fresh_def [symmetric])
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3385
  apply (simp add: Fresh_eqvt [OF a] swap_fresh_fresh)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3386
  done
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3387
3178
a331468b2f5a renamed fresh_fun to Fresh; added a simproc that deals with freshness of functions
Christian Urban <urbanc@in.tum.de>
parents: 3176
diff changeset
  3388
notation Fresh (binder "FRESH " 10)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3389
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3390
lemma FRESH_f_iff:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3391
  fixes P :: "'a::at \<Rightarrow> 'b::pure"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3392
  fixes f :: "'b \<Rightarrow> 'c::pure"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3393
  assumes P: "finite (supp P)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3394
  shows "(FRESH x. f (P x)) = f (FRESH x. P x)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3395
proof -
2685
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3396
  obtain a::'a where "atom a \<sharp> P" using P by (rule obtain_fresh')
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3397
  then show "(FRESH x. f (P x)) = f (FRESH x. P x)"
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3398
    by (simp add: pure_fresh)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3399
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3400
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3401
lemma FRESH_binop_iff:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3402
  fixes P :: "'a::at \<Rightarrow> 'b::pure"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3403
  fixes Q :: "'a::at \<Rightarrow> 'c::pure"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3404
  fixes binop :: "'b \<Rightarrow> 'c \<Rightarrow> 'd::pure"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3405
  assumes P: "finite (supp P)" 
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3406
  and     Q: "finite (supp Q)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3407
  shows "(FRESH x. binop (P x) (Q x)) = binop (FRESH x. P x) (FRESH x. Q x)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3408
proof -
2685
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3409
  from assms have "finite (supp (P, Q))" by (simp add: supp_Pair)
1df873b63cb2 added obtain_fresh lemma; tuned Lambda.thy
Christian Urban <urbanc@in.tum.de>
parents: 2683
diff changeset
  3410
  then obtain a::'a where "atom a \<sharp> (P, Q)" by (rule obtain_fresh') 
3184
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3411
  then show ?thesis
ae1defecd8c0 a simproc for simplifying Fresh when there is a sufficiently fresh atom
Christian Urban <urbanc@in.tum.de>
parents: 3183
diff changeset
  3412
    by (simp add: pure_fresh)
2470
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3413
qed
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3414
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3415
lemma FRESH_conj_iff:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3416
  fixes P Q :: "'a::at \<Rightarrow> bool"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3417
  assumes P: "finite (supp P)" and Q: "finite (supp Q)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3418
  shows "(FRESH x. P x \<and> Q x) \<longleftrightarrow> (FRESH x. P x) \<and> (FRESH x. Q x)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3419
using P Q by (rule FRESH_binop_iff)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3420
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3421
lemma FRESH_disj_iff:
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3422
  fixes P Q :: "'a::at \<Rightarrow> bool"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3423
  assumes P: "finite (supp P)" and Q: "finite (supp Q)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3424
  shows "(FRESH x. P x \<or> Q x) \<longleftrightarrow> (FRESH x. P x) \<or> (FRESH x. Q x)"
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3425
using P Q by (rule FRESH_binop_iff)
bdb1eab47161 moved everything out of Nominal_Supp
Christian Urban <urbanc@in.tum.de>
parents: 2467
diff changeset
  3426
3214
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
  3427
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3428
section {* Automation for creating concrete atom types *}
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3429
3214
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
  3430
text {* At the moment only single-sort concrete atoms are supported. *}
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3431
3201
3e6f4320669f removed "use" - replaced by "ML_file"
Christian Urban <urbanc@in.tum.de>
parents: 3197
diff changeset
  3432
ML_file "nominal_atoms.ML"
2467
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3433
67b3933c3190 got rid of Nominal_Atoms (folded into Nominal2_Base)
Christian Urban <urbanc@in.tum.de>
parents: 2466
diff changeset
  3434
3214
13ab4f0a0b0e Various changes to support Nominal2 commands in local contexts.
webertj
parents: 3213
diff changeset
  3435
section {* Automatic equivariance procedure for inductive definitions *}
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  3436
3201
3e6f4320669f removed "use" - replaced by "ML_file"
Christian Urban <urbanc@in.tum.de>
parents: 3197
diff changeset
  3437
ML_file "nominal_eqvt.ML"
2733
5f6fefdbf055 split the library into a basics file; merged Nominal_Eqvt into Nominal_Base
Christian Urban <urbanc@in.tum.de>
parents: 2732
diff changeset
  3438
1062
dfea9e739231 rollback of the test
Christian Urban <urbanc@in.tum.de>
parents: 1061
diff changeset
  3439
end