src/HOL/Induct/Com.thy
author paulson
Wed May 07 12:50:26 1997 +0200 (1997-05-07)
changeset 3120 c58423c20740
child 3146 922a60451382
permissions -rw-r--r--
New directory to contain examples of (co)inductive definitions
paulson@3120
     1
(*  Title:      HOL/Induct/Com
paulson@3120
     2
    ID:         $Id$
paulson@3120
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
paulson@3120
     4
    Copyright   1997  University of Cambridge
paulson@3120
     5
paulson@3120
     6
Example of Mutual Induction via Iteratived Inductive Definitions: Commands
paulson@3120
     7
*)
paulson@3120
     8
paulson@3120
     9
Com = Arith +
paulson@3120
    10
paulson@3120
    11
types loc
paulson@3120
    12
      state = "loc => nat"
paulson@3120
    13
      n2n2n = "nat => nat => nat"
paulson@3120
    14
paulson@3120
    15
arities loc :: term
paulson@3120
    16
paulson@3120
    17
(*To avoid a mutually recursive datatype declaration, expressions and commands
paulson@3120
    18
  are combined to form a single datatype.*)
paulson@3120
    19
datatype
paulson@3120
    20
  exp = N nat
paulson@3120
    21
      | X loc
paulson@3120
    22
      | Op n2n2n exp exp
paulson@3120
    23
      | valOf exp exp          ("VALOF _ RESULTIS _"  60)
paulson@3120
    24
      | SKIP
paulson@3120
    25
      | ":="  loc exp          (infixl  60)
paulson@3120
    26
      | Semi  exp exp          ("_;;_"  [60, 60] 10)
paulson@3120
    27
      | Cond  exp exp exp      ("IF _ THEN _ ELSE _"  60)
paulson@3120
    28
      | While exp exp          ("WHILE _ DO _"  60)
paulson@3120
    29
paulson@3120
    30
(** Execution of commands **)
paulson@3120
    31
consts  exec    :: "((exp*state) * (nat*state)) set => ((exp*state)*state)set"
paulson@3120
    32
       "@exec"  :: "((exp*state) * (nat*state)) set => 
paulson@3120
    33
                    [exp*state,state] => bool"     ("_/ -[_]-> _" [50,0,50] 50)
paulson@3120
    34
paulson@3120
    35
translations  "csig -[eval]-> s" == "(csig,s) : exec eval"
paulson@3120
    36
paulson@3120
    37
constdefs assign :: [state,nat,loc] => state    ("_[_'/_]" [95,0,0] 95)
paulson@3120
    38
  "s[m/x] ==  (%y. if y=x then m else s y)"
paulson@3120
    39
paulson@3120
    40
paulson@3120
    41
(*Command execution.  Natural numbers represent Booleans: 0=True, 1=False*)
paulson@3120
    42
inductive "exec eval"
paulson@3120
    43
  intrs
paulson@3120
    44
    Skip    "(SKIP,s) -[eval]-> s"
paulson@3120
    45
paulson@3120
    46
    Assign  "((e,s), (v,s')) : eval ==> (x := e, s) -[eval]-> s'[v/x]"
paulson@3120
    47
paulson@3120
    48
    Semi    "[| (c0,s) -[eval]-> s2; (c1,s2) -[eval]-> s1 |] 
paulson@3120
    49
            ==> (c0 ;; c1, s) -[eval]-> s1"
paulson@3120
    50
paulson@3120
    51
    IfTrue "[| ((e,s), (0,s')) : eval;  (c0,s') -[eval]-> s1 |] 
paulson@3120
    52
            ==> (IF e THEN c0 ELSE c1, s) -[eval]-> s1"
paulson@3120
    53
paulson@3120
    54
    IfFalse "[| ((e,s), (1,s')) : eval;  (c1,s') -[eval]-> s1 |] 
paulson@3120
    55
             ==> (IF e THEN c0 ELSE c1, s) -[eval]-> s1"
paulson@3120
    56
paulson@3120
    57
    WhileFalse "((e,s), (1,s1)) : eval ==> (WHILE e DO c, s) -[eval]-> s1"
paulson@3120
    58
paulson@3120
    59
    WhileTrue  "[| ((e,s), (0,s1)) : eval;
paulson@3120
    60
                (c,s1) -[eval]-> s2;  (WHILE e DO c, s2) -[eval]-> s3 |] 
paulson@3120
    61
                ==> (WHILE e DO c, s) -[eval]-> s3"
paulson@3120
    62
paulson@3120
    63
constdefs
paulson@3120
    64
    Unique   :: "['a, 'b, ('a*'b) set] => bool"
paulson@3120
    65
    "Unique x y r == ALL y'. (x,y'): r --> y = y'"
paulson@3120
    66
paulson@3120
    67
    Function :: "('a*'b) set => bool"
paulson@3120
    68
    "Function r == ALL x y. (x,y): r --> Unique x y r"
paulson@3120
    69
end