src/HOL/Predicate_Compile_Examples/Specialisation_Examples.thy
author wenzelm
Tue, 05 Nov 2019 14:28:00 +0100
changeset 71047 87c132cf5860
parent 69597 ff784d5a5bfb
permissions -rw-r--r--
more options;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
     1
theory Specialisation_Examples
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 63167
diff changeset
     2
imports Main "HOL-Library.Predicate_Compile_Alternative_Defs"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
     3
begin
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
     4
45125
c15b0faeb70a increasing values_timeout to avoid SML_makeall failures on our current tests
bulwahn
parents: 42463
diff changeset
     5
declare [[values_timeout = 960.0]]
42142
d24a93025feb raised various timeouts to accommodate sluggish SML/NJ
krauss
parents: 41413
diff changeset
     6
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
     7
section \<open>Specialisation Examples\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
     8
39919
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
     9
primrec nth_el'
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    10
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    11
  "nth_el' [] i = None"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    12
| "nth_el' (x # xs) i = (case i of 0 => Some x | Suc j => nth_el' xs j)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    13
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    14
definition
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    15
  "greater_than_index xs = (\<forall>i x. nth_el' xs i = Some x --> x > i)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    16
36257
3f3e9f18f302 adopting examples to changes in the predicate compiler
bulwahn
parents: 36054
diff changeset
    17
code_pred (expected_modes: i => bool) [inductify, skip_proof, specialise] greater_than_index .
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67480
diff changeset
    18
ML_val \<open>Core_Data.intros_of \<^context> \<^const_name>\<open>specialised_nth_el'P\<close>\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    19
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    20
thm greater_than_index.equation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    21
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    22
values [expected "{()}"] "{x. greater_than_index [1,2,4,6]}"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    23
values [expected "{}"] "{x. greater_than_index [0,2,3,2]}"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    24
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    25
subsection \<open>Common subterms\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    26
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    27
text \<open>If a predicate is called with common subterms as arguments,
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    28
  this predicate should be specialised. 
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    29
\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    30
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    31
definition max_nat :: "nat => nat => nat"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    32
  where "max_nat a b = (if a <= b then b else a)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    33
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    34
lemma [code_pred_inline]:
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    35
  "max = max_nat"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
    36
by (simp add: fun_eq_iff max_def max_nat_def)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    37
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    38
definition
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    39
  "max_of_my_Suc x = max x (Suc x)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    40
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    41
text \<open>In this example, max is specialised, hence the mode o => i => bool is possible\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    42
36257
3f3e9f18f302 adopting examples to changes in the predicate compiler
bulwahn
parents: 36054
diff changeset
    43
code_pred (modes: o => i => bool) [inductify, specialise, skip_proof] max_of_my_Suc .
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    44
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    45
thm max_of_my_SucP.equation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    46
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 67480
diff changeset
    47
ML_val \<open>Core_Data.intros_of \<^context> \<^const_name>\<open>specialised_max_natP\<close>\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    48
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    49
values "{x. max_of_my_SucP x 6}"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    50
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    51
subsection \<open>Sorts\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    52
67480
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    53
inductive sorted :: "'a::linorder list \<Rightarrow> bool" where
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    54
  Nil [simp]: "sorted []"
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    55
| Cons: "\<forall>y\<in>set xs. x \<le> y \<Longrightarrow> sorted xs \<Longrightarrow> sorted (x # xs)"
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    56
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    57
lemma sorted_single [simp]: "sorted [x]"
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    58
by (rule sorted.Cons) auto
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    59
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    60
lemma sorted_many: "x \<le> y \<Longrightarrow> sorted (y # zs) \<Longrightarrow> sorted (x # y # zs)"
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    61
by (rule sorted.Cons) (cases "y # zs" rule: sorted.cases, auto)
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    62
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    63
lemma sorted_many_eq [simp]:
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    64
  "sorted (x # y # zs) \<longleftrightarrow> x \<le> y \<and> sorted (y # zs)"
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    65
by (auto intro: sorted_many elim: sorted.cases)
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    66
39919
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    67
declare sorted.Nil [code_pred_intro]
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    68
  sorted_single [code_pred_intro]
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    69
  sorted_many [code_pred_intro]
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    70
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 53072
diff changeset
    71
code_pred sorted
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 53072
diff changeset
    72
proof -
39919
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    73
  assume "sorted xa"
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    74
  assume 1: "xa = [] \<Longrightarrow> thesis"
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    75
  assume 2: "\<And>x. xa = [x] \<Longrightarrow> thesis"
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    76
  assume 3: "\<And>x y zs. xa = x # y # zs \<Longrightarrow> x \<le> y \<Longrightarrow> sorted (y # zs) \<Longrightarrow> thesis"
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    77
  show thesis proof (cases xa)
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    78
    case Nil with 1 show ?thesis .
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    79
  next
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    80
    case (Cons x xs) show ?thesis proof (cases xs)
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    81
      case Nil with Cons 2 show ?thesis by simp
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    82
    next
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 53072
diff changeset
    83
      case (Cons y zs)
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 53072
diff changeset
    84
      show ?thesis
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 53072
diff changeset
    85
      proof (rule 3)
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    86
        from Cons \<open>xa = x # xs\<close> show "xa = x # y # zs" by simp
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    87
        with \<open>sorted xa\<close> show "x \<le> y" and "sorted (y # zs)" by simp_all
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 53072
diff changeset
    88
      qed
39919
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    89
    qed
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    90
  qed
9f6503aaa77d adjusted to inductive characterization of sorted
haftmann
parents: 39302
diff changeset
    91
qed
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    92
thm sorted.equation
67480
f261aefbe702 made sorted fun again
nipkow
parents: 67479
diff changeset
    93
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    94
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    95
section \<open>Specialisation in POPLmark theory\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    96
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    97
notation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    98
  Some ("\<lfloor>_\<rfloor>")
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
    99
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   100
notation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   101
  None ("\<bottom>")
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   102
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   103
notation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   104
  length ("\<parallel>_\<parallel>")
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   105
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   106
notation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   107
  Cons ("_ \<Colon>/ _" [66, 65] 65)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   108
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   109
primrec
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   110
  nth_el :: "'a list \<Rightarrow> nat \<Rightarrow> 'a option" ("_\<langle>_\<rangle>" [90, 0] 91)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   111
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   112
  "[]\<langle>i\<rangle> = \<bottom>"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   113
| "(x # xs)\<langle>i\<rangle> = (case i of 0 \<Rightarrow> \<lfloor>x\<rfloor> | Suc j \<Rightarrow> xs \<langle>j\<rangle>)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   114
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   115
primrec assoc :: "('a \<times> 'b) list \<Rightarrow> 'a \<Rightarrow> 'b option" ("_\<langle>_\<rangle>\<^sub>?" [90, 0] 91)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   116
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   117
  "[]\<langle>a\<rangle>\<^sub>? = \<bottom>"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   118
| "(x # xs)\<langle>a\<rangle>\<^sub>? = (if fst x = a then \<lfloor>snd x\<rfloor> else xs\<langle>a\<rangle>\<^sub>?)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   119
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   120
primrec unique :: "('a \<times> 'b) list \<Rightarrow> bool"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   121
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   122
  "unique [] = True"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   123
| "unique (x # xs) = (xs\<langle>fst x\<rangle>\<^sub>? = \<bottom> \<and> unique xs)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   124
58310
91ea607a34d8 updated news
blanchet
parents: 58249
diff changeset
   125
datatype type =
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   126
    TVar nat
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   127
  | Top
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   128
  | Fun type type    (infixr "\<rightarrow>" 200)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   129
  | TyAll type type  ("(3\<forall><:_./ _)" [0, 10] 10)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   130
58310
91ea607a34d8 updated news
blanchet
parents: 58249
diff changeset
   131
datatype binding = VarB type | TVarB type
42463
f270e3e18be5 modernized specifications;
wenzelm
parents: 42187
diff changeset
   132
type_synonym env = "binding list"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   133
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   134
primrec is_TVarB :: "binding \<Rightarrow> bool"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   135
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   136
  "is_TVarB (VarB T) = False"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   137
| "is_TVarB (TVarB T) = True"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   138
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   139
primrec type_ofB :: "binding \<Rightarrow> type"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   140
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   141
  "type_ofB (VarB T) = T"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   142
| "type_ofB (TVarB T) = T"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   143
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   144
primrec mapB :: "(type \<Rightarrow> type) \<Rightarrow> binding \<Rightarrow> binding"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   145
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   146
  "mapB f (VarB T) = VarB (f T)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   147
| "mapB f (TVarB T) = TVarB (f T)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   148
58310
91ea607a34d8 updated news
blanchet
parents: 58249
diff changeset
   149
datatype trm =
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   150
    Var nat
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   151
  | Abs type trm   ("(3\<lambda>:_./ _)" [0, 10] 10)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   152
  | TAbs type trm  ("(3\<lambda><:_./ _)" [0, 10] 10)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   153
  | App trm trm    (infixl "\<bullet>" 200)
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   154
  | TApp trm type  (infixl "\<bullet>\<^sub>\<tau>" 200)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   155
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   156
primrec liftT :: "nat \<Rightarrow> nat \<Rightarrow> type \<Rightarrow> type" ("\<up>\<^sub>\<tau>")
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   157
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   158
  "\<up>\<^sub>\<tau> n k (TVar i) = (if i < k then TVar i else TVar (i + n))"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   159
| "\<up>\<^sub>\<tau> n k Top = Top"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   160
| "\<up>\<^sub>\<tau> n k (T \<rightarrow> U) = \<up>\<^sub>\<tau> n k T \<rightarrow> \<up>\<^sub>\<tau> n k U"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   161
| "\<up>\<^sub>\<tau> n k (\<forall><:T. U) = (\<forall><:\<up>\<^sub>\<tau> n k T. \<up>\<^sub>\<tau> n (k + 1) U)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   162
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   163
primrec lift :: "nat \<Rightarrow> nat \<Rightarrow> trm \<Rightarrow> trm" ("\<up>")
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   164
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   165
  "\<up> n k (Var i) = (if i < k then Var i else Var (i + n))"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   166
| "\<up> n k (\<lambda>:T. t) = (\<lambda>:\<up>\<^sub>\<tau> n k T. \<up> n (k + 1) t)"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   167
| "\<up> n k (\<lambda><:T. t) = (\<lambda><:\<up>\<^sub>\<tau> n k T. \<up> n (k + 1) t)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   168
| "\<up> n k (s \<bullet> t) = \<up> n k s \<bullet> \<up> n k t"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   169
| "\<up> n k (t \<bullet>\<^sub>\<tau> T) = \<up> n k t \<bullet>\<^sub>\<tau> \<up>\<^sub>\<tau> n k T"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   170
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   171
primrec substTT :: "type \<Rightarrow> nat \<Rightarrow> type \<Rightarrow> type"  ("_[_ \<mapsto>\<^sub>\<tau> _]\<^sub>\<tau>" [300, 0, 0] 300)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   172
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   173
  "(TVar i)[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau> =
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   174
     (if k < i then TVar (i - 1) else if i = k then \<up>\<^sub>\<tau> k 0 S else TVar i)"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   175
| "Top[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau> = Top"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   176
| "(T \<rightarrow> U)[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau> = T[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau> \<rightarrow> U[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau>"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   177
| "(\<forall><:T. U)[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau> = (\<forall><:T[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau>. U[k+1 \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau>)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   178
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   179
primrec decT :: "nat \<Rightarrow> nat \<Rightarrow> type \<Rightarrow> type"  ("\<down>\<^sub>\<tau>")
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   180
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   181
  "\<down>\<^sub>\<tau> 0 k T = T"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   182
| "\<down>\<^sub>\<tau> (Suc n) k T = \<down>\<^sub>\<tau> n k (T[k \<mapsto>\<^sub>\<tau> Top]\<^sub>\<tau>)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   183
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   184
primrec subst :: "trm \<Rightarrow> nat \<Rightarrow> trm \<Rightarrow> trm"  ("_[_ \<mapsto> _]" [300, 0, 0] 300)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   185
where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   186
  "(Var i)[k \<mapsto> s] = (if k < i then Var (i - 1) else if i = k then \<up> k 0 s else Var i)"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   187
| "(t \<bullet> u)[k \<mapsto> s] = t[k \<mapsto> s] \<bullet> u[k \<mapsto> s]"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   188
| "(t \<bullet>\<^sub>\<tau> T)[k \<mapsto> s] = t[k \<mapsto> s] \<bullet>\<^sub>\<tau> \<down>\<^sub>\<tau> 1 k T"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   189
| "(\<lambda>:T. t)[k \<mapsto> s] = (\<lambda>:\<down>\<^sub>\<tau> 1 k T. t[k+1 \<mapsto> s])"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   190
| "(\<lambda><:T. t)[k \<mapsto> s] = (\<lambda><:\<down>\<^sub>\<tau> 1 k T. t[k+1 \<mapsto> s])"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   191
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   192
primrec substT :: "trm \<Rightarrow> nat \<Rightarrow> type \<Rightarrow> trm"    ("_[_ \<mapsto>\<^sub>\<tau> _]" [300, 0, 0] 300)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   193
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   194
  "(Var i)[k \<mapsto>\<^sub>\<tau> S] = (if k < i then Var (i - 1) else Var i)"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   195
| "(t \<bullet> u)[k \<mapsto>\<^sub>\<tau> S] = t[k \<mapsto>\<^sub>\<tau> S] \<bullet> u[k \<mapsto>\<^sub>\<tau> S]"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   196
| "(t \<bullet>\<^sub>\<tau> T)[k \<mapsto>\<^sub>\<tau> S] = t[k \<mapsto>\<^sub>\<tau> S] \<bullet>\<^sub>\<tau> T[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau>"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   197
| "(\<lambda>:T. t)[k \<mapsto>\<^sub>\<tau> S] = (\<lambda>:T[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau>. t[k+1 \<mapsto>\<^sub>\<tau> S])"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   198
| "(\<lambda><:T. t)[k \<mapsto>\<^sub>\<tau> S] = (\<lambda><:T[k \<mapsto>\<^sub>\<tau> S]\<^sub>\<tau>. t[k+1 \<mapsto>\<^sub>\<tau> S])"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   199
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   200
primrec liftE :: "nat \<Rightarrow> nat \<Rightarrow> env \<Rightarrow> env" ("\<up>\<^sub>e")
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   201
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   202
  "\<up>\<^sub>e n k [] = []"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   203
| "\<up>\<^sub>e n k (B \<Colon> \<Gamma>) = mapB (\<up>\<^sub>\<tau> n (k + \<parallel>\<Gamma>\<parallel>)) B \<Colon> \<up>\<^sub>e n k \<Gamma>"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   204
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   205
primrec substE :: "env \<Rightarrow> nat \<Rightarrow> type \<Rightarrow> env"  ("_[_ \<mapsto>\<^sub>\<tau> _]\<^sub>e" [300, 0, 0] 300)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   206
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   207
  "[][k \<mapsto>\<^sub>\<tau> T]\<^sub>e = []"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   208
| "(B \<Colon> \<Gamma>)[k \<mapsto>\<^sub>\<tau> T]\<^sub>e = mapB (\<lambda>U. U[k + \<parallel>\<Gamma>\<parallel> \<mapsto>\<^sub>\<tau> T]\<^sub>\<tau>) B \<Colon> \<Gamma>[k \<mapsto>\<^sub>\<tau> T]\<^sub>e"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   209
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   210
primrec decE :: "nat \<Rightarrow> nat \<Rightarrow> env \<Rightarrow> env"  ("\<down>\<^sub>e")
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   211
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   212
  "\<down>\<^sub>e 0 k \<Gamma> = \<Gamma>"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   213
| "\<down>\<^sub>e (Suc n) k \<Gamma> = \<down>\<^sub>e n k (\<Gamma>[k \<mapsto>\<^sub>\<tau> Top]\<^sub>e)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   214
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   215
inductive
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   216
  well_formed :: "env \<Rightarrow> type \<Rightarrow> bool"  ("_ \<turnstile>\<^sub>w\<^sub>f _" [50, 50] 50)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   217
where
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   218
  wf_TVar: "\<Gamma>\<langle>i\<rangle> = \<lfloor>TVarB T\<rfloor> \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f TVar i"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   219
| wf_Top: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f Top"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   220
| wf_arrow: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f T \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f U \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f T \<rightarrow> U"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   221
| wf_all: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f T \<Longrightarrow> TVarB T \<Colon> \<Gamma> \<turnstile>\<^sub>w\<^sub>f U \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f (\<forall><:T. U)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   222
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   223
inductive
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   224
  well_formedE :: "env \<Rightarrow> bool"  ("_ \<turnstile>\<^sub>w\<^sub>f" [50] 50)
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   225
  and well_formedB :: "env \<Rightarrow> binding \<Rightarrow> bool"  ("_ \<turnstile>\<^sub>w\<^sub>f\<^sub>B _" [50, 50] 50)
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   226
where
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   227
  "\<Gamma> \<turnstile>\<^sub>w\<^sub>f\<^sub>B B \<equiv> \<Gamma> \<turnstile>\<^sub>w\<^sub>f type_ofB B"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   228
| wf_Nil: "[] \<turnstile>\<^sub>w\<^sub>f"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   229
| wf_Cons: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f\<^sub>B B \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f \<Longrightarrow> B \<Colon> \<Gamma> \<turnstile>\<^sub>w\<^sub>f"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   230
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   231
inductive_cases well_formed_cases:
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   232
  "\<Gamma> \<turnstile>\<^sub>w\<^sub>f TVar i"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   233
  "\<Gamma> \<turnstile>\<^sub>w\<^sub>f Top"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   234
  "\<Gamma> \<turnstile>\<^sub>w\<^sub>f T \<rightarrow> U"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   235
  "\<Gamma> \<turnstile>\<^sub>w\<^sub>f (\<forall><:T. U)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   236
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   237
inductive_cases well_formedE_cases:
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   238
  "B \<Colon> \<Gamma> \<turnstile>\<^sub>w\<^sub>f"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   239
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   240
inductive
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   241
  subtyping :: "env \<Rightarrow> type \<Rightarrow> type \<Rightarrow> bool"  ("_ \<turnstile> _ <: _" [50, 50, 50] 50)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   242
where
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   243
  SA_Top: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f S \<Longrightarrow> \<Gamma> \<turnstile> S <: Top"
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   244
| SA_refl_TVar: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f \<Longrightarrow> \<Gamma> \<turnstile>\<^sub>w\<^sub>f TVar i \<Longrightarrow> \<Gamma> \<turnstile> TVar i <: TVar i"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   245
| SA_trans_TVar: "\<Gamma>\<langle>i\<rangle> = \<lfloor>TVarB U\<rfloor> \<Longrightarrow>
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   246
    \<Gamma> \<turnstile> \<up>\<^sub>\<tau> (Suc i) 0 U <: T \<Longrightarrow> \<Gamma> \<turnstile> TVar i <: T"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   247
| SA_arrow: "\<Gamma> \<turnstile> T\<^sub>1 <: S\<^sub>1 \<Longrightarrow> \<Gamma> \<turnstile> S\<^sub>2 <: T\<^sub>2 \<Longrightarrow> \<Gamma> \<turnstile> S\<^sub>1 \<rightarrow> S\<^sub>2 <: T\<^sub>1 \<rightarrow> T\<^sub>2"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   248
| SA_all: "\<Gamma> \<turnstile> T\<^sub>1 <: S\<^sub>1 \<Longrightarrow> TVarB T\<^sub>1 \<Colon> \<Gamma> \<turnstile> S\<^sub>2 <: T\<^sub>2 \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   249
    \<Gamma> \<turnstile> (\<forall><:S\<^sub>1. S\<^sub>2) <: (\<forall><:T\<^sub>1. T\<^sub>2)"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   250
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   251
inductive
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   252
  typing :: "env \<Rightarrow> trm \<Rightarrow> type \<Rightarrow> bool"    ("_ \<turnstile> _ : _" [50, 50, 50] 50)
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   253
where
53072
acc495621d72 prefer plain subscript;
wenzelm
parents: 53015
diff changeset
   254
  T_Var: "\<Gamma> \<turnstile>\<^sub>w\<^sub>f \<Longrightarrow> \<Gamma>\<langle>i\<rangle> = \<lfloor>VarB U\<rfloor> \<Longrightarrow> T = \<up>\<^sub>\<tau> (Suc i) 0 U \<Longrightarrow> \<Gamma> \<turnstile> Var i : T"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   255
| T_Abs: "VarB T\<^sub>1 \<Colon> \<Gamma> \<turnstile> t\<^sub>2 : T\<^sub>2 \<Longrightarrow> \<Gamma> \<turnstile> (\<lambda>:T\<^sub>1. t\<^sub>2) : T\<^sub>1 \<rightarrow> \<down>\<^sub>\<tau> 1 0 T\<^sub>2"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   256
| T_App: "\<Gamma> \<turnstile> t\<^sub>1 : T\<^sub>11 \<rightarrow> T\<^sub>12 \<Longrightarrow> \<Gamma> \<turnstile> t\<^sub>2 : T\<^sub>11 \<Longrightarrow> \<Gamma> \<turnstile> t\<^sub>1 \<bullet> t\<^sub>2 : T\<^sub>12"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   257
| T_TAbs: "TVarB T\<^sub>1 \<Colon> \<Gamma> \<turnstile> t\<^sub>2 : T\<^sub>2 \<Longrightarrow> \<Gamma> \<turnstile> (\<lambda><:T\<^sub>1. t\<^sub>2) : (\<forall><:T\<^sub>1. T\<^sub>2)"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   258
| T_TApp: "\<Gamma> \<turnstile> t\<^sub>1 : (\<forall><:T\<^sub>11. T\<^sub>12) \<Longrightarrow> \<Gamma> \<turnstile> T\<^sub>2 <: T\<^sub>11 \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 51272
diff changeset
   259
    \<Gamma> \<turnstile> t\<^sub>1 \<bullet>\<^sub>\<tau> T\<^sub>2 : T\<^sub>12[0 \<mapsto>\<^sub>\<tau> T\<^sub>2]\<^sub>\<tau>"
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   260
| T_Sub: "\<Gamma> \<turnstile> t : S \<Longrightarrow> \<Gamma> \<turnstile> S <: T \<Longrightarrow> \<Gamma> \<turnstile> t : T"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   261
36257
3f3e9f18f302 adopting examples to changes in the predicate compiler
bulwahn
parents: 36054
diff changeset
   262
code_pred [inductify, skip_proof, specialise] typing .
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   263
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   264
thm typing.equation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   265
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   266
values 6 "{(E, t, T). typing E t T}"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   267
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   268
subsection \<open>Higher-order predicate\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   269
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   270
code_pred [inductify] mapB .
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   271
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   272
subsection \<open>Multiple instances\<close>
36033
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   273
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   274
inductive subtype_refl' where
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   275
  "\<Gamma> \<turnstile> t : T ==> \<not> (\<Gamma> \<turnstile> T <: T) ==> subtype_refl' t T"
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   276
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   277
code_pred (modes: i => i => bool, o => i => bool, i => o => bool, o => o => bool) [inductify] subtype_refl' .
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   278
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   279
thm subtype_refl'.equation
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   280
7106f079bd05 adding specialisation examples of the predicate compiler
bulwahn
parents:
diff changeset
   281
45125
c15b0faeb70a increasing values_timeout to avoid SML_makeall failures on our current tests
bulwahn
parents: 42463
diff changeset
   282
end