ex/Simult.thy
author clasohm
Wed, 02 Nov 1994 11:50:09 +0100
changeset 156 fd1be45b64bf
parent 127 d9527f97246e
child 195 df6b3bd14dcb
permissions -rw-r--r--
added IOA to isabelle/HOL
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
     1
(*  Title: 	HOL/ex/Simult
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  University of Cambridge
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
114
b7f57e0ab47c HOL/ex/Term, Simult: updated for new Split
lcp
parents: 72
diff changeset
     6
A simultaneous recursive type definition: trees & forests
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
This is essentially the same data structure that on ex/term.ML, which is
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
     9
simpler because it uses list as a new type former.  The approach in this
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
file may be superior for other simultaneous recursions.
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    11
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    12
The inductive definition package does not help defining this sort of mutually
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    13
recursive data structure because it uses Inl, Inr instead of In0, In1.
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
Simult = List +
72
30e80f028c57 removal of obsolete type-declaration syntax
lcp
parents: 48
diff changeset
    17
30e80f028c57 removal of obsolete type-declaration syntax
lcp
parents: 48
diff changeset
    18
types    'a tree
30e80f028c57 removal of obsolete type-declaration syntax
lcp
parents: 48
diff changeset
    19
         'a forest
30e80f028c57 removal of obsolete type-declaration syntax
lcp
parents: 48
diff changeset
    20
30e80f028c57 removal of obsolete type-declaration syntax
lcp
parents: 48
diff changeset
    21
arities  tree,forest :: (term)term
30e80f028c57 removal of obsolete type-declaration syntax
lcp
parents: 48
diff changeset
    22
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
consts
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    24
  TF          :: "'a item set => 'a item set"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    25
  FNIL        :: "'a item"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    26
  TCONS,FCONS :: "['a item, 'a item] => 'a item"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    27
  Rep_Tree    :: "'a tree => 'a item"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    28
  Abs_Tree    :: "'a item => 'a tree"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    29
  Rep_Forest  :: "'a forest => 'a item"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    30
  Abs_Forest  :: "'a item => 'a forest"
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
  Tcons       :: "['a, 'a forest] => 'a tree"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    32
  Fcons       :: "['a tree, 'a forest] => 'a forest"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
  Fnil        :: "'a forest"
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    34
  TF_rec      :: "['a item, ['a item , 'a item, 'b]=>'b,     \
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    35
\                 'b, ['a item , 'a item, 'b, 'b]=>'b] => 'b"
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    36
  tree_rec    :: "['a tree, ['a, 'a forest, 'b]=>'b,          \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
\                 'b, ['a tree, 'a forest, 'b, 'b]=>'b] => 'b"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    38
  forest_rec  :: "['a forest, ['a, 'a forest, 'b]=>'b,        \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    39
\                  'b, ['a tree, 'a forest, 'b, 'b]=>'b] => 'b"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    40
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    41
defs
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    42
     (*the concrete constants*)
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    43
  TCONS_def 	"TCONS(M,N) == In0(M $ N)"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    44
  FNIL_def	"FNIL       == In1(NIL)"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    45
  FCONS_def	"FCONS(M,N) == In1(CONS(M,N))"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    46
     (*the abstract constants*)
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    47
  Tcons_def 	"Tcons(a,ts) == Abs_Tree(TCONS(Leaf(a), Rep_Forest(ts)))"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    48
  Fnil_def  	"Fnil        == Abs_Forest(FNIL)"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    49
  Fcons_def 	"Fcons(t,ts) == Abs_Forest(FCONS(Rep_Tree(t), Rep_Forest(ts)))"
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    50
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    51
  TF_def	"TF(A) == lfp(%Z. A <*> Part(Z,In1) \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    52
\                           <+> ({Numb(0)} <+> Part(Z,In0) <*> Part(Z,In1)))"
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    53
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    54
rules
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    55
  (*faking a type definition for tree...*)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    56
  Rep_Tree 	   "Rep_Tree(n): Part(TF(range(Leaf)),In0)"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
  Rep_Tree_inverse "Abs_Tree(Rep_Tree(t)) = t"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
  Abs_Tree_inverse "z: Part(TF(range(Leaf)),In0) ==> Rep_Tree(Abs_Tree(z)) = z"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    59
    (*faking a type definition for forest...*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    60
  Rep_Forest 	     "Rep_Forest(n): Part(TF(range(Leaf)),In1)"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    61
  Rep_Forest_inverse "Abs_Forest(Rep_Forest(ts)) = ts"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    62
  Abs_Forest_inverse 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    63
	"z: Part(TF(range(Leaf)),In1) ==> Rep_Forest(Abs_Forest(z)) = z"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    64
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    65
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    66
defs
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    67
     (*recursion*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    68
  TF_rec_def	
127
d9527f97246e INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 114
diff changeset
    69
   "TF_rec(M,b,c,d) == wfrec(trancl(pred_sexp), M, 			\
114
b7f57e0ab47c HOL/ex/Term, Simult: updated for new Split
lcp
parents: 72
diff changeset
    70
\               Case(Split(%x y g. b(x,y,g(y))),		\
b7f57e0ab47c HOL/ex/Term, Simult: updated for new Split
lcp
parents: 72
diff changeset
    71
\	              List_case(%g.c, %x y g. d(x,y,g(x),g(y)))))"
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    72
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    73
  tree_rec_def
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    74
   "tree_rec(t,b,c,d) == \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    75
\   TF_rec(Rep_Tree(t), %x y r. b(Inv(Leaf,x), Abs_Forest(y), r), \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    76
\          c, %x y rt rf. d(Abs_Tree(x), Abs_Forest(y), rt, rf))"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    77
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    78
  forest_rec_def
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    79
   "forest_rec(tf,b,c,d) == \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    80
\   TF_rec(Rep_Forest(tf), %x y r. b(Inv(Leaf,x), Abs_Forest(y), r), \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    81
\          c, %x y rt rf. d(Abs_Tree(x), Abs_Forest(y), rt, rf))"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    82
end