src/HOL/ex/Tuple.thy
author nipkow
Wed, 18 Aug 2004 11:09:40 +0200
changeset 15140 322485b816ac
parent 14981 e73f8140af78
child 16417 9bc16273c2d4
permissions -rw-r--r--
import -> imports
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/ex/Tuple.thy
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     4
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     5
Properly nested products (see also theory Prod).
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     6
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     7
Unquestionably, this should be used as the standard representation of
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     8
tuples in HOL, but it breaks many existing theories!
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     9
*)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    10
10357
wenzelm
parents: 9503
diff changeset
    11
header {* Properly nested products *}
wenzelm
parents: 9503
diff changeset
    12
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    13
theory Tuple = HOL:
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    14
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    15
10357
wenzelm
parents: 9503
diff changeset
    16
subsection {* Abstract syntax *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    17
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    18
typedecl unit
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    19
typedecl ('a, 'b) prod
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    20
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    21
consts
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    22
  Pair :: "'a => 'b => ('a, 'b) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    23
  fst :: "('a, 'b) prod => 'a"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    24
  snd :: "('a, 'b) prod => 'b"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    25
  split :: "('a => 'b => 'c) => ('a, 'b) prod => 'c"
11606
43abedd4467e renamed "()" to Unity;
wenzelm
parents: 10357
diff changeset
    26
  Unity :: unit    ("'(')")
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    27
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    28
10357
wenzelm
parents: 9503
diff changeset
    29
subsection {* Concrete syntax *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    30
10357
wenzelm
parents: 9503
diff changeset
    31
subsubsection {* Tuple types *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    32
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    33
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    34
  tuple_type_args
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    35
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    36
  "_tuple_type_arg"  :: "type => tuple_type_args"                    ("_" [21] 21)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    37
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ */ _" [21, 20] 20)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    38
  "_tuple_type"      :: "type => tuple_type_args => type"            ("(_ */ _)" [21, 20] 20)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    39
12114
a8e860c86252 eliminated old "symbols" syntax, use "xsymbols" instead;
wenzelm
parents: 11606
diff changeset
    40
syntax (xsymbols)
9503
wenzelm
parents: 9353
diff changeset
    41
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ \<times>/ _" [21, 20] 20)
wenzelm
parents: 9353
diff changeset
    42
  "_tuple_type"      :: "type => tuple_type_args => type"          ("(_ \<times>/ _)" [21, 20] 20)
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    43
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    44
syntax (HTML output)
9503
wenzelm
parents: 9353
diff changeset
    45
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ \<times>/ _" [21, 20] 20)
wenzelm
parents: 9353
diff changeset
    46
  "_tuple_type"      :: "type => tuple_type_args => type"          ("(_ \<times>/ _)" [21, 20] 20)
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    47
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    48
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    49
  (type) "'a * 'b" == (type) "('a, ('b, unit) prod) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    50
  (type) "('a, ('b, 'cs) _tuple_type_args) _tuple_type" ==
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    51
    (type) "('a, ('b, 'cs) _tuple_type) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    52
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    53
10357
wenzelm
parents: 9503
diff changeset
    54
subsubsection {* Tuples *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    55
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    56
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    57
  tuple_args
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    58
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    59
  "_tuple"      :: "'a => tuple_args => 'b"             ("(1'(_,/ _'))")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    60
  "_tuple_arg"  :: "'a => tuple_args"                   ("_")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    61
  "_tuple_args" :: "'a => tuple_args => tuple_args"     ("_,/ _")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    62
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    63
  "(x, y)" == "Pair x (Pair y ())"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    64
  "_tuple x (_tuple_args y zs)" == "Pair x (_tuple y zs)"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    65
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    66
10357
wenzelm
parents: 9503
diff changeset
    67
subsubsection {* Tuple patterns *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    68
10357
wenzelm
parents: 9503
diff changeset
    69
nonterminals tuple_pat_args
wenzelm
parents: 9503
diff changeset
    70
  -- {* extends pre-defined type "pttrn" syntax used in abstractions *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    71
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    72
  "_tuple_pat_arg"  :: "pttrn => tuple_pat_args"                     ("_")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    73
  "_tuple_pat_args" :: "pttrn => tuple_pat_args => tuple_pat_args"   ("_,/ _")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    74
  "_tuple_pat"      :: "pttrn => tuple_pat_args => pttrn"            ("'(_,/ _')")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    75
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    76
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    77
  "%(x,y). b" => "split (%x. split (%y. (_K b) :: unit => _))"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    78
  "%(x,y). b" <= "split (%x. split (%y. _K b))"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    79
  "_abs (_tuple_pat x (_tuple_pat_args y zs)) b" == "split (%x. (_abs (_tuple_pat y zs) b))"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    80
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    81
(* FIXME test *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    82
  (*the following rules accommodate tuples in `case C ... (x,y,...) ... => ...' where
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    83
     (x,y,...) is parsed as `Pair x (Pair y ...)' because it is logic, not pttrn*)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    84
  "_abs (Pair x (Pair y ())) b" => "%(x,y). b"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    85
  "_abs (Pair x (_abs (_tuple_pat y zs) b))" => "_abs (_tuple_pat x (_tuple_pat_args y zs)) b"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    86
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    87
(* FIXME improve handling of nested patterns *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    88
typed_print_translation {*
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    89
  let
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    90
    fun split_tr' _ T1
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    91
            (Abs (x, xT, Const ("split", T2) $ Abs (y, yT, Abs (_, Type ("unit", []), b))) :: ts) =
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    92
          if Term.loose_bvar1 (b, 0) then raise Match
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    93
          else Term.list_comb
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    94
            (Const ("split", T1) $ Abs (x, xT, Const ("split", T2) $
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    95
              Abs (y, yT, Syntax.const "_K" $ Term.incr_boundvars ~1 b)), ts)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    96
      | split_tr' _ _ _ = raise Match;
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    97
  in [("split", split_tr')] end
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    98
*}
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    99
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
   100
end