eliminated legacy 'axioms';
authorwenzelm
Thu, 28 Feb 2013 14:10:54 +0100
changeset 5244551e158e988a5
parent 52444 943ad9c0d99d
child 52446 473303ef6e34
eliminated legacy 'axioms';
src/CTT/CTT.thy
     1.1 --- a/src/CTT/CTT.thy	Thu Feb 28 13:54:45 2013 +0100
     1.2 +++ b/src/CTT/CTT.thy	Thu Feb 28 14:10:54 2013 +0100
     1.3 @@ -93,175 +93,174 @@
     1.4    "_PROD"   :: "[idt,t,t] => t"     ("(3\<Pi> _\<in>_./ _)"    10)
     1.5    "_SUM"    :: "[idt,t,t] => t"     ("(3\<Sigma> _\<in>_./ _)" 10)
     1.6  
     1.7 -axioms
     1.8 -
     1.9    (*Reduction: a weaker notion than equality;  a hack for simplification.
    1.10      Reduce[a,b] means either that  a=b:A  for some A or else that "a" and "b"
    1.11      are textually identical.*)
    1.12  
    1.13    (*does not verify a:A!  Sound because only trans_red uses a Reduce premise
    1.14      No new theorems can be proved about the standard judgements.*)
    1.15 -  refl_red: "Reduce[a,a]"
    1.16 -  red_if_equal: "a = b : A ==> Reduce[a,b]"
    1.17 -  trans_red: "[| a = b : A;  Reduce[b,c] |] ==> a = c : A"
    1.18 +axiomatization where
    1.19 +  refl_red: "\<And>a. Reduce[a,a]" and
    1.20 +  red_if_equal: "\<And>a b A. a = b : A ==> Reduce[a,b]" and
    1.21 +  trans_red: "\<And>a b c A. [| a = b : A;  Reduce[b,c] |] ==> a = c : A" and
    1.22  
    1.23    (*Reflexivity*)
    1.24  
    1.25 -  refl_type: "A type ==> A = A"
    1.26 -  refl_elem: "a : A ==> a = a : A"
    1.27 +  refl_type: "\<And>A. A type ==> A = A" and
    1.28 +  refl_elem: "\<And>a A. a : A ==> a = a : A" and
    1.29  
    1.30    (*Symmetry*)
    1.31  
    1.32 -  sym_type:  "A = B ==> B = A"
    1.33 -  sym_elem:  "a = b : A ==> b = a : A"
    1.34 +  sym_type:  "\<And>A B. A = B ==> B = A" and
    1.35 +  sym_elem:  "\<And>a b A. a = b : A ==> b = a : A" and
    1.36  
    1.37    (*Transitivity*)
    1.38  
    1.39 -  trans_type:   "[| A = B;  B = C |] ==> A = C"
    1.40 -  trans_elem:   "[| a = b : A;  b = c : A |] ==> a = c : A"
    1.41 +  trans_type:   "\<And>A B C. [| A = B;  B = C |] ==> A = C" and
    1.42 +  trans_elem:   "\<And>a b c A. [| a = b : A;  b = c : A |] ==> a = c : A" and
    1.43  
    1.44 -  equal_types:  "[| a : A;  A = B |] ==> a : B"
    1.45 -  equal_typesL: "[| a = b : A;  A = B |] ==> a = b : B"
    1.46 +  equal_types:  "\<And>a A B. [| a : A;  A = B |] ==> a : B" and
    1.47 +  equal_typesL: "\<And>a b A B. [| a = b : A;  A = B |] ==> a = b : B" and
    1.48  
    1.49    (*Substitution*)
    1.50  
    1.51 -  subst_type:   "[| a : A;  !!z. z:A ==> B(z) type |] ==> B(a) type"
    1.52 -  subst_typeL:  "[| a = c : A;  !!z. z:A ==> B(z) = D(z) |] ==> B(a) = D(c)"
    1.53 +  subst_type:   "\<And>a A B. [| a : A;  !!z. z:A ==> B(z) type |] ==> B(a) type" and
    1.54 +  subst_typeL:  "\<And>a c A B D. [| a = c : A;  !!z. z:A ==> B(z) = D(z) |] ==> B(a) = D(c)" and
    1.55  
    1.56 -  subst_elem:   "[| a : A;  !!z. z:A ==> b(z):B(z) |] ==> b(a):B(a)"
    1.57 +  subst_elem:   "\<And>a b A B. [| a : A;  !!z. z:A ==> b(z):B(z) |] ==> b(a):B(a)" and
    1.58    subst_elemL:
    1.59 -    "[| a=c : A;  !!z. z:A ==> b(z)=d(z) : B(z) |] ==> b(a)=d(c) : B(a)"
    1.60 +    "\<And>a b c d A B. [| a=c : A;  !!z. z:A ==> b(z)=d(z) : B(z) |] ==> b(a)=d(c) : B(a)" and
    1.61  
    1.62  
    1.63    (*The type N -- natural numbers*)
    1.64  
    1.65 -  NF: "N type"
    1.66 -  NI0: "0 : N"
    1.67 -  NI_succ: "a : N ==> succ(a) : N"
    1.68 -  NI_succL:  "a = b : N ==> succ(a) = succ(b) : N"
    1.69 +  NF: "N type" and
    1.70 +  NI0: "0 : N" and
    1.71 +  NI_succ: "\<And>a. a : N ==> succ(a) : N" and
    1.72 +  NI_succL:  "\<And>a b. a = b : N ==> succ(a) = succ(b) : N" and
    1.73  
    1.74    NE:
    1.75 -   "[| p: N;  a: C(0);  !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) |]
    1.76 -   ==> rec(p, a, %u v. b(u,v)) : C(p)"
    1.77 +   "\<And>p a b C. [| p: N;  a: C(0);  !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) |]
    1.78 +   ==> rec(p, a, %u v. b(u,v)) : C(p)" and
    1.79  
    1.80    NEL:
    1.81 -   "[| p = q : N;  a = c : C(0);
    1.82 +   "\<And>p q a b c d C. [| p = q : N;  a = c : C(0);
    1.83        !!u v. [| u: N; v: C(u) |] ==> b(u,v) = d(u,v): C(succ(u)) |]
    1.84 -   ==> rec(p, a, %u v. b(u,v)) = rec(q,c,d) : C(p)"
    1.85 +   ==> rec(p, a, %u v. b(u,v)) = rec(q,c,d) : C(p)" and
    1.86  
    1.87    NC0:
    1.88 -   "[| a: C(0);  !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) |]
    1.89 -   ==> rec(0, a, %u v. b(u,v)) = a : C(0)"
    1.90 +   "\<And>a b C. [| a: C(0);  !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) |]
    1.91 +   ==> rec(0, a, %u v. b(u,v)) = a : C(0)" and
    1.92  
    1.93    NC_succ:
    1.94 -   "[| p: N;  a: C(0);
    1.95 +   "\<And>p a b C. [| p: N;  a: C(0);
    1.96         !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) |] ==>
    1.97 -   rec(succ(p), a, %u v. b(u,v)) = b(p, rec(p, a, %u v. b(u,v))) : C(succ(p))"
    1.98 +   rec(succ(p), a, %u v. b(u,v)) = b(p, rec(p, a, %u v. b(u,v))) : C(succ(p))" and
    1.99  
   1.100    (*The fourth Peano axiom.  See page 91 of Martin-Lof's book*)
   1.101    zero_ne_succ:
   1.102 -    "[| a: N;  0 = succ(a) : N |] ==> 0: F"
   1.103 +    "\<And>a. [| a: N;  0 = succ(a) : N |] ==> 0: F" and
   1.104  
   1.105  
   1.106    (*The Product of a family of types*)
   1.107  
   1.108 -  ProdF:  "[| A type; !!x. x:A ==> B(x) type |] ==> PROD x:A. B(x) type"
   1.109 +  ProdF:  "\<And>A B. [| A type; !!x. x:A ==> B(x) type |] ==> PROD x:A. B(x) type" and
   1.110  
   1.111    ProdFL:
   1.112 -   "[| A = C;  !!x. x:A ==> B(x) = D(x) |] ==>
   1.113 -   PROD x:A. B(x) = PROD x:C. D(x)"
   1.114 +   "\<And>A B C D. [| A = C;  !!x. x:A ==> B(x) = D(x) |] ==>
   1.115 +   PROD x:A. B(x) = PROD x:C. D(x)" and
   1.116  
   1.117    ProdI:
   1.118 -   "[| A type;  !!x. x:A ==> b(x):B(x)|] ==> lam x. b(x) : PROD x:A. B(x)"
   1.119 +   "\<And>b A B. [| A type;  !!x. x:A ==> b(x):B(x)|] ==> lam x. b(x) : PROD x:A. B(x)" and
   1.120  
   1.121    ProdIL:
   1.122 -   "[| A type;  !!x. x:A ==> b(x) = c(x) : B(x)|] ==>
   1.123 -   lam x. b(x) = lam x. c(x) : PROD x:A. B(x)"
   1.124 +   "\<And>b c A B. [| A type;  !!x. x:A ==> b(x) = c(x) : B(x)|] ==>
   1.125 +   lam x. b(x) = lam x. c(x) : PROD x:A. B(x)" and
   1.126  
   1.127 -  ProdE:  "[| p : PROD x:A. B(x);  a : A |] ==> p`a : B(a)"
   1.128 -  ProdEL: "[| p=q: PROD x:A. B(x);  a=b : A |] ==> p`a = q`b : B(a)"
   1.129 +  ProdE:  "\<And>p a A B. [| p : PROD x:A. B(x);  a : A |] ==> p`a : B(a)" and
   1.130 +  ProdEL: "\<And>p q a b A B. [| p=q: PROD x:A. B(x);  a=b : A |] ==> p`a = q`b : B(a)" and
   1.131  
   1.132    ProdC:
   1.133 -   "[| a : A;  !!x. x:A ==> b(x) : B(x)|] ==>
   1.134 -   (lam x. b(x)) ` a = b(a) : B(a)"
   1.135 +   "\<And>a b A B. [| a : A;  !!x. x:A ==> b(x) : B(x)|] ==>
   1.136 +   (lam x. b(x)) ` a = b(a) : B(a)" and
   1.137  
   1.138    ProdC2:
   1.139 -   "p : PROD x:A. B(x) ==> (lam x. p`x) = p : PROD x:A. B(x)"
   1.140 +   "\<And>p A B. p : PROD x:A. B(x) ==> (lam x. p`x) = p : PROD x:A. B(x)" and
   1.141  
   1.142  
   1.143    (*The Sum of a family of types*)
   1.144  
   1.145 -  SumF:  "[| A type;  !!x. x:A ==> B(x) type |] ==> SUM x:A. B(x) type"
   1.146 +  SumF:  "\<And>A B. [| A type;  !!x. x:A ==> B(x) type |] ==> SUM x:A. B(x) type" and
   1.147    SumFL:
   1.148 -    "[| A = C;  !!x. x:A ==> B(x) = D(x) |] ==> SUM x:A. B(x) = SUM x:C. D(x)"
   1.149 +    "\<And>A B C D. [| A = C;  !!x. x:A ==> B(x) = D(x) |] ==> SUM x:A. B(x) = SUM x:C. D(x)" and
   1.150  
   1.151 -  SumI:  "[| a : A;  b : B(a) |] ==> <a,b> : SUM x:A. B(x)"
   1.152 -  SumIL: "[| a=c:A;  b=d:B(a) |] ==> <a,b> = <c,d> : SUM x:A. B(x)"
   1.153 +  SumI:  "\<And>a b A B. [| a : A;  b : B(a) |] ==> <a,b> : SUM x:A. B(x)" and
   1.154 +  SumIL: "\<And>a b c d A B. [| a=c:A;  b=d:B(a) |] ==> <a,b> = <c,d> : SUM x:A. B(x)" and
   1.155  
   1.156    SumE:
   1.157 -    "[| p: SUM x:A. B(x);  !!x y. [| x:A; y:B(x) |] ==> c(x,y): C(<x,y>) |]
   1.158 -    ==> split(p, %x y. c(x,y)) : C(p)"
   1.159 +    "\<And>p c A B C. [| p: SUM x:A. B(x);  !!x y. [| x:A; y:B(x) |] ==> c(x,y): C(<x,y>) |]
   1.160 +    ==> split(p, %x y. c(x,y)) : C(p)" and
   1.161  
   1.162    SumEL:
   1.163 -    "[| p=q : SUM x:A. B(x);
   1.164 +    "\<And>p q c d A B C. [| p=q : SUM x:A. B(x);
   1.165         !!x y. [| x:A; y:B(x) |] ==> c(x,y)=d(x,y): C(<x,y>)|]
   1.166 -    ==> split(p, %x y. c(x,y)) = split(q, % x y. d(x,y)) : C(p)"
   1.167 +    ==> split(p, %x y. c(x,y)) = split(q, % x y. d(x,y)) : C(p)" and
   1.168  
   1.169    SumC:
   1.170 -    "[| a: A;  b: B(a);  !!x y. [| x:A; y:B(x) |] ==> c(x,y): C(<x,y>) |]
   1.171 -    ==> split(<a,b>, %x y. c(x,y)) = c(a,b) : C(<a,b>)"
   1.172 +    "\<And>a b c A B C. [| a: A;  b: B(a);  !!x y. [| x:A; y:B(x) |] ==> c(x,y): C(<x,y>) |]
   1.173 +    ==> split(<a,b>, %x y. c(x,y)) = c(a,b) : C(<a,b>)" and
   1.174  
   1.175 -  fst_def:   "fst(a) == split(a, %x y. x)"
   1.176 -  snd_def:   "snd(a) == split(a, %x y. y)"
   1.177 +  fst_def:   "\<And>a. fst(a) == split(a, %x y. x)" and
   1.178 +  snd_def:   "\<And>a. snd(a) == split(a, %x y. y)" and
   1.179  
   1.180  
   1.181    (*The sum of two types*)
   1.182  
   1.183 -  PlusF:   "[| A type;  B type |] ==> A+B type"
   1.184 -  PlusFL:  "[| A = C;  B = D |] ==> A+B = C+D"
   1.185 +  PlusF:   "\<And>A B. [| A type;  B type |] ==> A+B type" and
   1.186 +  PlusFL:  "\<And>A B C D. [| A = C;  B = D |] ==> A+B = C+D" and
   1.187  
   1.188 -  PlusI_inl:   "[| a : A;  B type |] ==> inl(a) : A+B"
   1.189 -  PlusI_inlL: "[| a = c : A;  B type |] ==> inl(a) = inl(c) : A+B"
   1.190 +  PlusI_inl:   "\<And>a A B. [| a : A;  B type |] ==> inl(a) : A+B" and
   1.191 +  PlusI_inlL: "\<And>a c A B. [| a = c : A;  B type |] ==> inl(a) = inl(c) : A+B" and
   1.192  
   1.193 -  PlusI_inr:   "[| A type;  b : B |] ==> inr(b) : A+B"
   1.194 -  PlusI_inrL: "[| A type;  b = d : B |] ==> inr(b) = inr(d) : A+B"
   1.195 +  PlusI_inr:   "\<And>b A B. [| A type;  b : B |] ==> inr(b) : A+B" and
   1.196 +  PlusI_inrL: "\<And>b d A B. [| A type;  b = d : B |] ==> inr(b) = inr(d) : A+B" and
   1.197  
   1.198    PlusE:
   1.199 -    "[| p: A+B;  !!x. x:A ==> c(x): C(inl(x));
   1.200 +    "\<And>p c d A B C. [| p: A+B;  !!x. x:A ==> c(x): C(inl(x));
   1.201                  !!y. y:B ==> d(y): C(inr(y)) |]
   1.202 -    ==> when(p, %x. c(x), %y. d(y)) : C(p)"
   1.203 +    ==> when(p, %x. c(x), %y. d(y)) : C(p)" and
   1.204  
   1.205    PlusEL:
   1.206 -    "[| p = q : A+B;  !!x. x: A ==> c(x) = e(x) : C(inl(x));
   1.207 +    "\<And>p q c d e f A B C. [| p = q : A+B;  !!x. x: A ==> c(x) = e(x) : C(inl(x));
   1.208                       !!y. y: B ==> d(y) = f(y) : C(inr(y)) |]
   1.209 -    ==> when(p, %x. c(x), %y. d(y)) = when(q, %x. e(x), %y. f(y)) : C(p)"
   1.210 +    ==> when(p, %x. c(x), %y. d(y)) = when(q, %x. e(x), %y. f(y)) : C(p)" and
   1.211  
   1.212    PlusC_inl:
   1.213 -    "[| a: A;  !!x. x:A ==> c(x): C(inl(x));
   1.214 +    "\<And>a c d A C. [| a: A;  !!x. x:A ==> c(x): C(inl(x));
   1.215                !!y. y:B ==> d(y): C(inr(y)) |]
   1.216 -    ==> when(inl(a), %x. c(x), %y. d(y)) = c(a) : C(inl(a))"
   1.217 +    ==> when(inl(a), %x. c(x), %y. d(y)) = c(a) : C(inl(a))" and
   1.218  
   1.219    PlusC_inr:
   1.220 -    "[| b: B;  !!x. x:A ==> c(x): C(inl(x));
   1.221 +    "\<And>b c d A B C. [| b: B;  !!x. x:A ==> c(x): C(inl(x));
   1.222                !!y. y:B ==> d(y): C(inr(y)) |]
   1.223 -    ==> when(inr(b), %x. c(x), %y. d(y)) = d(b) : C(inr(b))"
   1.224 +    ==> when(inr(b), %x. c(x), %y. d(y)) = d(b) : C(inr(b))" and
   1.225  
   1.226  
   1.227    (*The type Eq*)
   1.228  
   1.229 -  EqF:    "[| A type;  a : A;  b : A |] ==> Eq(A,a,b) type"
   1.230 -  EqFL: "[| A=B;  a=c: A;  b=d : A |] ==> Eq(A,a,b) = Eq(B,c,d)"
   1.231 -  EqI: "a = b : A ==> eq : Eq(A,a,b)"
   1.232 -  EqE: "p : Eq(A,a,b) ==> a = b : A"
   1.233 +  EqF:    "\<And>a b A. [| A type;  a : A;  b : A |] ==> Eq(A,a,b) type" and
   1.234 +  EqFL: "\<And>a b c d A B. [| A=B;  a=c: A;  b=d : A |] ==> Eq(A,a,b) = Eq(B,c,d)" and
   1.235 +  EqI: "\<And>a b A. a = b : A ==> eq : Eq(A,a,b)" and
   1.236 +  EqE: "\<And>p a b A. p : Eq(A,a,b) ==> a = b : A" and
   1.237  
   1.238    (*By equality of types, can prove C(p) from C(eq), an elimination rule*)
   1.239 -  EqC: "p : Eq(A,a,b) ==> p = eq : Eq(A,a,b)"
   1.240 +  EqC: "\<And>p a b A. p : Eq(A,a,b) ==> p = eq : Eq(A,a,b)" and
   1.241  
   1.242    (*The type F*)
   1.243  
   1.244 -  FF: "F type"
   1.245 -  FE: "[| p: F;  C type |] ==> contr(p) : C"
   1.246 -  FEL:  "[| p = q : F;  C type |] ==> contr(p) = contr(q) : C"
   1.247 +  FF: "F type" and
   1.248 +  FE: "\<And>p C. [| p: F;  C type |] ==> contr(p) : C" and
   1.249 +  FEL:  "\<And>p q C. [| p = q : F;  C type |] ==> contr(p) = contr(q) : C" and
   1.250  
   1.251    (*The type T
   1.252       Martin-Lof's book (page 68) discusses elimination and computation.
   1.253 @@ -269,11 +268,11 @@
   1.254       but with an extra premise C(x) type x:T.
   1.255       Also computation can be derived from elimination. *)
   1.256  
   1.257 -  TF: "T type"
   1.258 -  TI: "tt : T"
   1.259 -  TE: "[| p : T;  c : C(tt) |] ==> c : C(p)"
   1.260 -  TEL: "[| p = q : T;  c = d : C(tt) |] ==> c = d : C(p)"
   1.261 -  TC: "p : T ==> p = tt : T"
   1.262 +  TF: "T type" and
   1.263 +  TI: "tt : T" and
   1.264 +  TE: "\<And>p c C. [| p : T;  c : C(tt) |] ==> c : C(p)" and
   1.265 +  TEL: "\<And>p q c d C. [| p = q : T;  c = d : C(tt) |] ==> c = d : C(p)" and
   1.266 +  TC: "\<And>p. p : T ==> p = tt : T"
   1.267  
   1.268  
   1.269  subsection "Tactics and derived rules for Constructive Type Theory"