src/CCL/ex/Nat.thy
author wenzelm
Tue, 18 Jul 2006 02:22:38 +0200
changeset 20140 98acc6d0fab6
parent 17456 bcf7544875b2
child 24825 c4f13ab78f9d
permissions -rw-r--r--
removed obsolete ML files;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     1
(*  Title:      CCL/ex/Nat.thy
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1474
3f7d67927fe2 expanded tabs
clasohm
parents: 1149
diff changeset
     3
    Author:     Martin Coen, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     7
header {* Programs defined over the natural numbers *}
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     8
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     9
theory Nat
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    10
imports Wfd
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    11
begin
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
consts
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    15
  not   :: "i=>i"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    16
  "#+"  :: "[i,i]=>i"            (infixr 60)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    17
  "#*"  :: "[i,i]=>i"            (infixr 60)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    18
  "#-"  :: "[i,i]=>i"            (infixr 60)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    19
  "##"  :: "[i,i]=>i"            (infixr 60)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    20
  "#<"  :: "[i,i]=>i"            (infixr 60)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    21
  "#<=" :: "[i,i]=>i"            (infixr 60)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    22
  ackermann :: "[i,i]=>i"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    24
defs
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    26
  not_def:     "not(b) == if b then false else true"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    28
  add_def:     "a #+ b == nrec(a,b,%x g. succ(g))"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    29
  mult_def:    "a #* b == nrec(a,zero,%x g. b #+ g)"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    30
  sub_def:     "a #- b == letrec sub x y be ncase(y,x,%yy. ncase(x,zero,%xx. sub(xx,yy)))
1149
5750eba8820d removed \...\ inside strings
clasohm
parents: 0
diff changeset
    31
                        in sub(a,b)"
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    32
  le_def:     "a #<= b == letrec le x y be ncase(x,true,%xx. ncase(y,false,%yy. le(xx,yy)))
1149
5750eba8820d removed \...\ inside strings
clasohm
parents: 0
diff changeset
    33
                        in le(a,b)"
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    34
  lt_def:     "a #< b == not(b #<= a)"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    36
  div_def:    "a ## b == letrec div x y be if x #< y then zero else succ(div(x#-y,y))
1149
5750eba8820d removed \...\ inside strings
clasohm
parents: 0
diff changeset
    37
                       in div(a,b)"
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    38
  ack_def:
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    39
  "ackermann(a,b) == letrec ack n m be ncase(n,succ(m),%x.
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 1474
diff changeset
    40
                          ncase(m,ack(x,succ(zero)),%y. ack(x,ack(succ(x),y))))
1149
5750eba8820d removed \...\ inside strings
clasohm
parents: 0
diff changeset
    41
                    in ack(a,b)"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    43
lemmas nat_defs = not_def add_def mult_def sub_def le_def lt_def ack_def napply_def
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    44
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    45
lemma natBs [simp]:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    46
  "not(true) = false"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    47
  "not(false) = true"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    48
  "zero #+ n = n"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    49
  "succ(n) #+ m = succ(n #+ m)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    50
  "zero #* n = zero"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    51
  "succ(n) #* m = m #+ (n #* m)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    52
  "f^zero`a = a"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    53
  "f^succ(n)`a = f(f^n`a)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    54
  by (simp_all add: nat_defs)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    55
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    56
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    57
lemma napply_f: "n:Nat ==> f^n`f(a) = f^succ(n)`a"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    58
  apply (erule Nat_ind)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    59
   apply simp_all
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    60
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    61
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    62
lemma addT: "[| a:Nat;  b:Nat |] ==> a #+ b : Nat"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    63
  apply (unfold add_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    64
  apply (tactic {* typechk_tac [] 1 *})
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    65
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    66
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    67
lemma multT: "[| a:Nat;  b:Nat |] ==> a #* b : Nat"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    68
  apply (unfold add_def mult_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    69
  apply (tactic {* typechk_tac [] 1 *})
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    70
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    71
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    72
(* Defined to return zero if a<b *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    73
lemma subT: "[| a:Nat;  b:Nat |] ==> a #- b : Nat"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    74
  apply (unfold sub_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    75
  apply (tactic {* typechk_tac [] 1 *})
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    76
  apply (tactic clean_ccs_tac)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    77
  apply (erule NatPRI [THEN wfstI, THEN NatPR_wf [THEN wmap_wf, THEN wfI]])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    78
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    79
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    80
lemma leT: "[| a:Nat;  b:Nat |] ==> a #<= b : Bool"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    81
  apply (unfold le_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    82
  apply (tactic {* typechk_tac [] 1 *})
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    83
  apply (tactic clean_ccs_tac)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    84
  apply (erule NatPRI [THEN wfstI, THEN NatPR_wf [THEN wmap_wf, THEN wfI]])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    85
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    86
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    87
lemma ltT: "[| a:Nat;  b:Nat |] ==> a #< b : Bool"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    88
  apply (unfold not_def lt_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    89
  apply (tactic {* typechk_tac [thm "leT"] 1 *})
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    90
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    91
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    92
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    93
subsection {* Termination Conditions for Ackermann's Function *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    94
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    95
lemmas relI = NatPR_wf [THEN NatPR_wf [THEN lex_wf, THEN wfI]]
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    96
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    97
lemma "[| a:Nat;  b:Nat |] ==> ackermann(a,b) : Nat"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    98
  apply (unfold ack_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    99
  apply (tactic "gen_ccs_tac [] 1")
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   100
  apply (erule NatPRI [THEN lexI1 [THEN relI]] NatPRI [THEN lexI2 [THEN relI]])+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   101
  done
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
   102
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104