src/HOL/ex/Points.thy
author wenzelm
Mon, 16 Nov 1998 10:41:08 +0100
changeset 5869 b279a84ac11c
parent 5753 c90b5f7d0c61
child 6737 03f0ff7ee029
permissions -rw-r--r--
added read;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5753
wenzelm
parents: 5741
diff changeset
     1
(*  Title:      HOL/ex/Points.thy
wenzelm
parents: 5741
diff changeset
     2
    ID:         $Id$
wenzelm
parents: 5741
diff changeset
     3
    Author:     Wolfgang Naraschewski and Markus Wenzel, TU Muenchen
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
     4
5753
wenzelm
parents: 5741
diff changeset
     5
Basic use of extensible records in HOL, including the famous points
wenzelm
parents: 5741
diff changeset
     6
and coloured points.
wenzelm
parents: 5741
diff changeset
     7
*)
wenzelm
parents: 5741
diff changeset
     8
wenzelm
parents: 5741
diff changeset
     9
Points = Main +
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    10
139a25a1e01e Example for records
narasche
parents:
diff changeset
    11
5753
wenzelm
parents: 5741
diff changeset
    12
(** points **)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    13
139a25a1e01e Example for records
narasche
parents:
diff changeset
    14
record point =
139a25a1e01e Example for records
narasche
parents:
diff changeset
    15
  x :: nat
139a25a1e01e Example for records
narasche
parents:
diff changeset
    16
  y :: nat
139a25a1e01e Example for records
narasche
parents:
diff changeset
    17
5753
wenzelm
parents: 5741
diff changeset
    18
(*
wenzelm
parents: 5741
diff changeset
    19
  To find out, which theorems are produced by the record declaration,
wenzelm
parents: 5741
diff changeset
    20
  type the following commands:
wenzelm
parents: 5741
diff changeset
    21
wenzelm
parents: 5741
diff changeset
    22
    thms "point.simps";
wenzelm
parents: 5741
diff changeset
    23
    thms "point.iffs";
wenzelm
parents: 5741
diff changeset
    24
    thms "point.update_defs";
wenzelm
parents: 5741
diff changeset
    25
wenzelm
parents: 5741
diff changeset
    26
  The set of theorems "point.simps" is added automatically to the
wenzelm
parents: 5741
diff changeset
    27
  standard simpset, "point.iffs" is added to the claset and simpset.
wenzelm
parents: 5741
diff changeset
    28
*)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    29
139a25a1e01e Example for records
narasche
parents:
diff changeset
    30
5753
wenzelm
parents: 5741
diff changeset
    31
(*
wenzelm
parents: 5741
diff changeset
    32
  Record declarations define new type abbreviations:
wenzelm
parents: 5741
diff changeset
    33
wenzelm
parents: 5741
diff changeset
    34
    point = (| x :: nat, y :: nat |)
wenzelm
parents: 5741
diff changeset
    35
    'a point_scheme = (| x :: nat, y :: nat, ... :: 'a |)
wenzelm
parents: 5741
diff changeset
    36
wenzelm
parents: 5741
diff changeset
    37
  Extensions `...' must be in type class `more'!
wenzelm
parents: 5741
diff changeset
    38
*)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    39
139a25a1e01e Example for records
narasche
parents:
diff changeset
    40
consts foo1 :: point
139a25a1e01e Example for records
narasche
parents:
diff changeset
    41
consts foo2 :: "(| x :: nat, y :: nat |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    42
consts foo3 :: 'a => ('a::more) point_scheme
139a25a1e01e Example for records
narasche
parents:
diff changeset
    43
consts foo4 :: "'a => (| x :: nat, y :: nat, ... :: 'a |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    44
139a25a1e01e Example for records
narasche
parents:
diff changeset
    45
5753
wenzelm
parents: 5741
diff changeset
    46
(* Introducing concrete records and record schemes *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    47
5753
wenzelm
parents: 5741
diff changeset
    48
defs
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    49
  foo1_def "foo1 == (| x = 1, y = 0 |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    50
  foo3_def "foo3 ext == (| x = 1, y = 0, ... = ext |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    51
139a25a1e01e Example for records
narasche
parents:
diff changeset
    52
5753
wenzelm
parents: 5741
diff changeset
    53
(* Record selection and record update *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    54
5753
wenzelm
parents: 5741
diff changeset
    55
constdefs
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    56
  getX :: ('a::more) point_scheme => nat
139a25a1e01e Example for records
narasche
parents:
diff changeset
    57
  "getX r == x r"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    58
  setX :: ('a::more) point_scheme => nat => 'a point_scheme
139a25a1e01e Example for records
narasche
parents:
diff changeset
    59
  "setX r n == r (| x := n |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    60
139a25a1e01e Example for records
narasche
parents:
diff changeset
    61
5753
wenzelm
parents: 5741
diff changeset
    62
(* concrete records are type instances of record schemes *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    63
139a25a1e01e Example for records
narasche
parents:
diff changeset
    64
constdefs
139a25a1e01e Example for records
narasche
parents:
diff changeset
    65
  foo5 :: nat
5753
wenzelm
parents: 5741
diff changeset
    66
  "foo5 == getX (| x = 1, y = 0 |)"
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    67
139a25a1e01e Example for records
narasche
parents:
diff changeset
    68
5753
wenzelm
parents: 5741
diff changeset
    69
(* manipulating the `...' (more-part) *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    70
139a25a1e01e Example for records
narasche
parents:
diff changeset
    71
constdefs
139a25a1e01e Example for records
narasche
parents:
diff changeset
    72
  incX :: ('a::more) point_scheme => 'a point_scheme
5753
wenzelm
parents: 5741
diff changeset
    73
  "incX r == (| x = Suc (x r), y = y r, ... = point.more r |)"
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    74
5753
wenzelm
parents: 5741
diff changeset
    75
(*alternative definition*)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    76
constdefs
139a25a1e01e Example for records
narasche
parents:
diff changeset
    77
  incX' :: ('a::more) point_scheme => 'a point_scheme
139a25a1e01e Example for records
narasche
parents:
diff changeset
    78
  "incX' r == r (| x := Suc (x r) |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    79
139a25a1e01e Example for records
narasche
parents:
diff changeset
    80
139a25a1e01e Example for records
narasche
parents:
diff changeset
    81
5753
wenzelm
parents: 5741
diff changeset
    82
(** coloured points: record extension **)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    83
139a25a1e01e Example for records
narasche
parents:
diff changeset
    84
datatype colour = Red | Green | Blue
139a25a1e01e Example for records
narasche
parents:
diff changeset
    85
139a25a1e01e Example for records
narasche
parents:
diff changeset
    86
record cpoint = point +
139a25a1e01e Example for records
narasche
parents:
diff changeset
    87
  colour :: colour
139a25a1e01e Example for records
narasche
parents:
diff changeset
    88
139a25a1e01e Example for records
narasche
parents:
diff changeset
    89
5753
wenzelm
parents: 5741
diff changeset
    90
(*
wenzelm
parents: 5741
diff changeset
    91
  The record declaration defines new type constructors:
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    92
5753
wenzelm
parents: 5741
diff changeset
    93
    cpoint = (| x :: nat, y :: nat, colour :: colour |)
wenzelm
parents: 5741
diff changeset
    94
    'a cpoint_scheme = (| x :: nat, y :: nat, colour :: colour, ... :: 'a |)
wenzelm
parents: 5741
diff changeset
    95
*)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
    96
139a25a1e01e Example for records
narasche
parents:
diff changeset
    97
consts foo6 :: cpoint
139a25a1e01e Example for records
narasche
parents:
diff changeset
    98
consts foo7 :: "(| x :: nat, y :: nat, colour :: colour |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
    99
consts foo8 :: ('a::more) cpoint_scheme
139a25a1e01e Example for records
narasche
parents:
diff changeset
   100
consts foo9 :: "(| x :: nat, y :: nat, colour :: colour, ... :: 'a |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
   101
139a25a1e01e Example for records
narasche
parents:
diff changeset
   102
5753
wenzelm
parents: 5741
diff changeset
   103
(* functions on point schemes work for cpoints as well *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   104
5753
wenzelm
parents: 5741
diff changeset
   105
constdefs
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   106
  foo10 :: nat
139a25a1e01e Example for records
narasche
parents:
diff changeset
   107
  "foo10 == getX (| x = 2, y = 0, colour = Blue |)"
139a25a1e01e Example for records
narasche
parents:
diff changeset
   108
139a25a1e01e Example for records
narasche
parents:
diff changeset
   109
5753
wenzelm
parents: 5741
diff changeset
   110
(* non-coercive structural subtyping *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   111
5753
wenzelm
parents: 5741
diff changeset
   112
(*foo11 has type cpoint, not type point*)                       (*Great!*)
wenzelm
parents: 5741
diff changeset
   113
constdefs
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   114
  foo11 :: cpoint
5753
wenzelm
parents: 5741
diff changeset
   115
  "foo11 == setX (| x = 2, y = 0, colour = Blue |) 0"
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   116
139a25a1e01e Example for records
narasche
parents:
diff changeset
   117
139a25a1e01e Example for records
narasche
parents:
diff changeset
   118
5753
wenzelm
parents: 5741
diff changeset
   119
(** other features **)
wenzelm
parents: 5741
diff changeset
   120
wenzelm
parents: 5741
diff changeset
   121
(* field names contribute to record identity *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   122
139a25a1e01e Example for records
narasche
parents:
diff changeset
   123
record point' =
139a25a1e01e Example for records
narasche
parents:
diff changeset
   124
  x' :: nat
139a25a1e01e Example for records
narasche
parents:
diff changeset
   125
  y' :: nat
139a25a1e01e Example for records
narasche
parents:
diff changeset
   126
139a25a1e01e Example for records
narasche
parents:
diff changeset
   127
consts
139a25a1e01e Example for records
narasche
parents:
diff changeset
   128
  foo12 :: nat
5753
wenzelm
parents: 5741
diff changeset
   129
(*"foo12 == getX (| x' = 2, y' = 0 |)"*)        (*invalid*)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   130
139a25a1e01e Example for records
narasche
parents:
diff changeset
   131
5753
wenzelm
parents: 5741
diff changeset
   132
(* polymorphic records *)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   133
139a25a1e01e Example for records
narasche
parents:
diff changeset
   134
record 'a point'' = point +
139a25a1e01e Example for records
narasche
parents:
diff changeset
   135
  content :: 'a
139a25a1e01e Example for records
narasche
parents:
diff changeset
   136
139a25a1e01e Example for records
narasche
parents:
diff changeset
   137
types cpoint'' = colour point''
139a25a1e01e Example for records
narasche
parents:
diff changeset
   138
139a25a1e01e Example for records
narasche
parents:
diff changeset
   139
139a25a1e01e Example for records
narasche
parents:
diff changeset
   140
5753
wenzelm
parents: 5741
diff changeset
   141
(*Have a lot of fun!*)
5741
139a25a1e01e Example for records
narasche
parents:
diff changeset
   142
139a25a1e01e Example for records
narasche
parents:
diff changeset
   143
end