src/HOL/ex/Tuple.thy
author wenzelm
Thu, 15 Sep 2005 17:17:04 +0200
changeset 17416 5093a587da16
parent 17388 495c799df31d
permissions -rw-r--r--
fixed type;
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
10357
wenzelm
parents: 9503
diff changeset
     6
header {* Properly nested products *}
wenzelm
parents: 9503
diff changeset
     7
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 14981
diff changeset
     8
theory Tuple imports HOL begin
9353
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
subsection {* Abstract syntax *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    12
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    13
typedecl unit
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    14
typedecl ('a, 'b) prod
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    15
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    16
consts
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    17
  Pair :: "'a => 'b => ('a, 'b) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    18
  fst :: "('a, 'b) prod => 'a"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    19
  snd :: "('a, 'b) prod => 'b"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    20
  split :: "('a => 'b => 'c) => ('a, 'b) prod => 'c"
11606
43abedd4467e renamed "()" to Unity;
wenzelm
parents: 10357
diff changeset
    21
  Unity :: unit    ("'(')")
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    22
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    23
10357
wenzelm
parents: 9503
diff changeset
    24
subsection {* Concrete syntax *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    25
10357
wenzelm
parents: 9503
diff changeset
    26
subsubsection {* Tuple types *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    27
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    28
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    29
  tuple_type_args
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    30
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    31
  "_tuple_type_arg"  :: "type => tuple_type_args"                    ("_" [21] 21)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    32
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ */ _" [21, 20] 20)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    33
  "_tuple_type"      :: "type => tuple_type_args => type"            ("(_ */ _)" [21, 20] 20)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    34
12114
a8e860c86252 eliminated old "symbols" syntax, use "xsymbols" instead;
wenzelm
parents: 11606
diff changeset
    35
syntax (xsymbols)
9503
wenzelm
parents: 9353
diff changeset
    36
  "_tuple_type_args" :: "type => tuple_type_args => tuple_type_args" ("_ \<times>/ _" [21, 20] 20)
wenzelm
parents: 9353
diff changeset
    37
  "_tuple_type"      :: "type => tuple_type_args => type"          ("(_ \<times>/ _)" [21, 20] 20)
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    38
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    39
syntax (HTML output)
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
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    44
  (type) "'a * 'b" == (type) "('a, ('b, unit) prod) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    45
  (type) "('a, ('b, 'cs) _tuple_type_args) _tuple_type" ==
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    46
    (type) "('a, ('b, 'cs) _tuple_type) prod"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    47
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    48
10357
wenzelm
parents: 9503
diff changeset
    49
subsubsection {* Tuples *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    50
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    51
nonterminals
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    52
  tuple_args
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    53
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    54
  "_tuple"      :: "'a => tuple_args => 'b"             ("(1'(_,/ _'))")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    55
  "_tuple_arg"  :: "'a => tuple_args"                   ("_")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    56
  "_tuple_args" :: "'a => tuple_args => tuple_args"     ("_,/ _")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    57
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    58
  "(x, y)" == "Pair x (Pair y ())"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    59
  "_tuple x (_tuple_args y zs)" == "Pair x (_tuple y zs)"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    60
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    61
10357
wenzelm
parents: 9503
diff changeset
    62
subsubsection {* Tuple patterns *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    63
10357
wenzelm
parents: 9503
diff changeset
    64
nonterminals tuple_pat_args
wenzelm
parents: 9503
diff changeset
    65
  -- {* extends pre-defined type "pttrn" syntax used in abstractions *}
9353
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    66
syntax
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    67
  "_tuple_pat_arg"  :: "pttrn => tuple_pat_args"                     ("_")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    68
  "_tuple_pat_args" :: "pttrn => tuple_pat_args => tuple_pat_args"   ("_,/ _")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    69
  "_tuple_pat"      :: "pttrn => tuple_pat_args => pttrn"            ("'(_,/ _')")
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    70
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    71
translations
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    72
  "%(x,y). b" => "split (%x. split (%y. (_K b) :: unit => _))"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    73
  "%(x,y). b" <= "split (%x. split (%y. _K b))"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    74
  "_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
    75
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    76
(* FIXME test *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    77
  (*the following rules accommodate tuples in `case C ... (x,y,...) ... => ...' where
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    78
     (x,y,...) is parsed as `Pair x (Pair y ...)' because it is logic, not pttrn*)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    79
  "_abs (Pair x (Pair y ())) b" => "%(x,y). b"
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    80
  "_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
    81
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    82
(* FIXME improve handling of nested patterns *)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    83
typed_print_translation {*
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    84
  let
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    85
    fun split_tr' _ T1
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    86
            (Abs (x, xT, Const ("split", T2) $ Abs (y, yT, Abs (_, Type ("unit", []), b))) :: ts) =
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    87
          if Term.loose_bvar1 (b, 0) then raise Match
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    88
          else Term.list_comb
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    89
            (Const ("split", T1) $ Abs (x, xT, Const ("split", T2) $
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    90
              Abs (y, yT, Syntax.const "_K" $ Term.incr_boundvars ~1 b)), ts)
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    91
      | split_tr' _ _ _ = raise Match;
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    92
  in [("split", split_tr')] end
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    93
*}
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    94
93cd32adc402 added ex/Tuple.thy;
wenzelm
parents:
diff changeset
    95
end