src/HOL/ex/Tuple.thy
author wenzelm
Tue, 03 Oct 2000 01:14:52 +0200
changeset 10131 546686f0a6fb
parent 9503 3324cbbecef8
child 10357 0d0cac129618
permissions -rw-r--r--
range declared as syntax;
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
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     5
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     6
Properly nested products (see also theory Prod).
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     7
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     8
Unquestionably, this should be used as the standard representation of
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
     9
tuples in HOL, but it breaks many existing theories!
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    10
*)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    11
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    12
theory Tuple = HOL:
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    13
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    14
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    15
(** abstract syntax **)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    16
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    17
typedecl unit
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    18
typedecl ('a, 'b) prod
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    19
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    20
consts
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    21
  Pair :: "'a => 'b => ('a, 'b) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    22
  fst :: "('a, 'b) prod => 'a"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    23
  snd :: "('a, 'b) prod => 'b"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    24
  split :: "('a => 'b => 'c) => ('a, 'b) prod => 'c"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    25
  "()" :: unit  ("'(')")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    26
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    27
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    28
(** concrete syntax **)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    29
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    30
(* tuple types *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    31
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    32
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    33
  tuple_type_args
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    34
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    35
  "_tuple_type_arg"  :: "type => tuple_type_args"                    ("_" [21] 21)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    36
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ */ _" [21, 20] 20)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    37
  "_tuple_type"      :: "type => tuple_type_args => type"            ("(_ */ _)" [21, 20] 20)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    38
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    39
syntax (symbols)
9503
wenzelm
parents: 9353
diff changeset
    40
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ \<times>/ _" [21, 20] 20)
wenzelm
parents: 9353
diff changeset
    41
  "_tuple_type"      :: "type => tuple_type_args => type"          ("(_ \<times>/ _)" [21, 20] 20)
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    42
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    43
syntax (HTML output)
9503
wenzelm
parents: 9353
diff changeset
    44
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ \<times>/ _" [21, 20] 20)
wenzelm
parents: 9353
diff changeset
    45
  "_tuple_type"      :: "type => tuple_type_args => type"          ("(_ \<times>/ _)" [21, 20] 20)
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    46
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    47
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    48
  (type) "'a * 'b" == (type) "('a, ('b, unit) prod) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    49
  (type) "('a, ('b, 'cs) _tuple_type_args) _tuple_type" ==
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    50
    (type) "('a, ('b, 'cs) _tuple_type) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    51
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    52
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    53
(* tuples *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    54
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    55
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    56
  tuple_args
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    57
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    58
  "_tuple"      :: "'a => tuple_args => 'b"             ("(1'(_,/ _'))")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    59
  "_tuple_arg"  :: "'a => tuple_args"                   ("_")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    60
  "_tuple_args" :: "'a => tuple_args => tuple_args"     ("_,/ _")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    61
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    62
  "(x, y)" == "Pair x (Pair y ())"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    63
  "_tuple x (_tuple_args y zs)" == "Pair x (_tuple y zs)"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    64
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    65
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    66
(* tuple patterns *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    67
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    68
(*extends pre-defined type "pttrn" syntax used in abstractions*)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    69
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    70
  tuple_pat_args
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