src/HOL/Hoare/Hoare.thy
author paulson
Fri, 25 Sep 1998 14:05:13 +0200
changeset 5565 301a3a4d3dc7
parent 5183 89f162de39cf
child 5646 7c2ddbaf8b8c
permissions -rw-r--r--
patched obsolete code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
     1
(*  Title:      HOL/Hoare/Hoare.thy
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
     3
    Author:     Norbert Galm & Tobias Nipkow
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     4
    Copyright   1995 TUM
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     5
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     6
Sugared semantic embedding of Hoare logic.
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     7
*)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     8
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
     9
Hoare = Arith +
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    10
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    11
types
5007
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    12
  pvar = nat                                    (* encoding of program variables ( < 26! ) *)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    13
  'a state = pvar => 'a                         (* program state *)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    14
  'a exp = 'a state => 'a                       (* denotation of expressions *)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    15
  'a bexp = 'a state => bool                    (* denotation of boolean expressions *)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    16
  'a com = 'a state => 'a state => bool         (* denotation of programs *)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    17
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    18
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    19
(* program syntax *)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    20
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    21
nonterminals
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    22
  prog
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    23
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    24
syntax
5007
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    25
  "@Skip"       :: prog                         ("SKIP")
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    26
  "@Assign"     :: [id, 'a] => prog             ("_ := _")
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    27
  "@Seq"        :: [prog, prog] => prog         ("_;//_" [0,1000] 999)
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    28
  "@If"         :: [bool, prog, prog] => prog   ("IF _//THEN//  (_)//ELSE//  (_)//END")
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    29
  "@While"      :: [bool, bool, prog] => prog   ("WHILE _//DO {_}//  (_)//END")
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    30
  "@Spec"       :: [bool, prog, bool] => bool   ("{_}//_//{_}")
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    31
5007
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    32
0ebd6c91088a nonterminals prog;
wenzelm
parents: 3842
diff changeset
    33
(* denotational semantics *)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    34
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    35
constdefs
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    36
  Skip          :: 'a com
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    37
  "Skip s s' == (s=s')"
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    38
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    39
  Assign        :: [pvar, 'a exp] => 'a com
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2901
diff changeset
    40
  "Assign v e s s' == (s' = (%x. if x=v then e(s) else s(x)))"
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    41
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    42
  Seq           :: ['a com, 'a com] => 'a com
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    43
  "Seq c c' s s' == ? s''. c s s'' & c' s'' s'"
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    44
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    45
  Cond          :: ['a bexp, 'a com, 'a com] => 'a com
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    46
  "Cond b c c' s s' == (b(s) --> c s s') & (~b s --> c' s s')"
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    47
2901
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    48
consts
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    49
  Iter          :: [nat, 'a bexp, 'a com] => 'a com
5183
89f162de39cf Adapted to new datatype package.
berghofe
parents: 5007
diff changeset
    50
89f162de39cf Adapted to new datatype package.
berghofe
parents: 5007
diff changeset
    51
primrec
2901
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    52
  "Iter 0 b c = (%s s'.~b(s) & (s=s'))"
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    53
  "Iter (Suc n) b c = (%s s'. b(s) & Seq c (Iter n b c) s s')"
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    54
2901
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    55
constdefs
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    56
  While         :: ['a bexp, 'a bexp, 'a com] => 'a com
4e92704cf320 renamed variable 'inv'
nipkow
parents: 2708
diff changeset
    57
  "While b I c s s' == ? n. Iter n b c s s'"
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    58
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    59
  Spec          :: ['a bexp, 'a com, 'a bexp] => bool
1558
9c6ebfab4e05 added constdefs section
clasohm
parents: 1476
diff changeset
    60
  "Spec p c q == !s s'. c s s' --> p s --> q s'"
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    61
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    62
end
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    63
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    64
ML
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    65
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    66
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    67
(*** term manipulation ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    68
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    69
(* name_in_term:bool (name:string,trm:term) bestimmt, ob in trm der Name name als Konstante,
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    70
   freie Var., scheme-Variable oder als Name fuer eine Lambda-Abstraktion vorkommt *)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    71
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    72
fun name_in_term (name,Const (s,t))    = (name=s)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    73
  | name_in_term (name,Free (s,t))     = (name=s)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    74
  | name_in_term (name,Var (ix,t))  = (name= string_of_indexname ix)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    75
  | name_in_term (name,Abs (s,t,trm))  = (name=s) orelse
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    76
                                         (name_in_term (name,trm))
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    77
  | name_in_term (name,trm1 $ trm2)    = (name_in_term (name,trm1)) orelse
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    78
                                         (name_in_term (name,trm2))
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    79
  | name_in_term (_,_)                 = false;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    80
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    81
(* variant_name:string (name:string,trm:term) liefert einen von name
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    82
   abgewandelten Namen (durch Anhaengen von genuegend vielen "_"), der nicht
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    83
   in trm vorkommt. Im Gegensatz zu variant_abs beruecktsichtigt es auch Namen
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    84
   von scheme-Variablen und von Lambda-Abstraktionen in trm *)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    85
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    86
(*This could be done more simply by calling Term.variant, supplying a list of
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    87
  all free, bound and scheme variables in the term.*)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    88
fun variant_name (name,trm) = if name_in_term (name,trm)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    89
			      then variant_name (name ^ "_",trm)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
    90
                              else name;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    91
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    92
(* subst_term:term (von:term,nach:term,trm:term) liefert den Term, der aus
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    93
trm entsteht, wenn alle Teilterme, die gleich von sind, durch nach ersetzt
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    94
wurden *)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
    95
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    96
fun subst_term (von,nach,Abs (s,t,trm)) =if von=Abs (s,t,trm)
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    97
                                                then nach
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    98
                                                else Abs (s,t,subst_term (von,nach,trm))
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
    99
  | subst_term (von,nach,trm1 $ trm2)   =if von=trm1 $ trm2
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   100
                                                then nach
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   101
                                                else subst_term (von,nach,trm1) $ subst_term (von,nach,trm2)
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   102
  | subst_term (von,nach,trm)           =if von=trm
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   103
                                                then nach
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   104
                                                else trm;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   105
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   106
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   107
(* Translation between program vars ("a" - "z") and their encoding as
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   108
   natural numbers: "a" <==> 0, "b" <==> Suc(0), ..., "z" <==> 25 *)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   109
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   110
fun is_pvarID s = size s=1 andalso "a"<=s andalso s<="z";
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   111
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   112
fun pvarID2pvar s =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   113
  let fun rest2pvar (i,arg) =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   114
            if i=0 then arg else rest2pvar(i-1, Syntax.const "Suc" $ arg)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   115
  in rest2pvar(ord s - ord "a", Syntax.const "0") end;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   116
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   117
fun pvar2pvarID trm     =
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   118
        let
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   119
                fun rest2pvarID (Const("0",_),i)                =chr (i + ord "a")
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   120
                  | rest2pvarID (Const("Suc",_) $ trm,i)        =rest2pvarID (trm,i+1)
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   121
        in
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   122
                rest2pvarID (trm,0)
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   123
        end;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   124
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   125
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   126
(*** parse translations: syntax -> semantics ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   127
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   128
(* term_tr:term (name:string,trm:term) ersetzt in trm alle freien Variablen, die eine pvarID
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   129
   darstellen, durch name $ pvarID2pvar(pvarID). Beispiel:
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   130
   bei name="s" und dem Term "a=b & a=X" wird der Term "s(0)=s(Suc(0)) & s(0)=X" geliefert *)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   131
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   132
fun term_tr (name,Free (s,t)) = if is_pvarID s
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   133
                                then Syntax.free name $ pvarID2pvar s
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   134
                                else Free (s,t)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   135
  | term_tr (name,Abs (s,t,trm)) = Abs (s,t,term_tr (name,trm))
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   136
  | term_tr (name,trm1 $ trm2)  = term_tr (name,trm1) $ term_tr (name,trm2)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   137
  | term_tr (name,trm) = trm;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   138
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   139
fun bool_tr B =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   140
  let val name = variant_name("s",B)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   141
  in Abs (name,dummyT,abstract_over (Syntax.free name,term_tr (name,B))) end;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   142
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   143
fun exp_tr E =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   144
  let val name = variant_name("s",E)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   145
  in Abs (name,dummyT,abstract_over (Syntax.free name,term_tr (name,E))) end;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   146
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   147
fun prog_tr (Const ("@Skip",_)) = Syntax.const "Skip"
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   148
  | prog_tr (Const ("@Assign",_) $ Free (V,_) $ E) =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   149
      if is_pvarID V
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   150
      then Syntax.const "Assign" $ pvarID2pvar V $ exp_tr E
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   151
      else error("Not a valid program variable: " ^ quote V)
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   152
  | prog_tr (Const ("@Seq",_) $ C $ C') =
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   153
      Syntax.const "Seq" $ prog_tr C $ prog_tr C'
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   154
  | prog_tr (Const ("@If",_) $ B $ C $ C') =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   155
      Syntax.const "Cond" $ bool_tr B $ prog_tr C $ prog_tr C'
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   156
  | prog_tr (Const ("@While",_) $ B $ INV $ C) =
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   157
      Syntax.const "While" $ bool_tr B $ bool_tr INV $ prog_tr C;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   158
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   159
fun spec_tr [P,C,Q] = Syntax.const "Spec" $ bool_tr P $ prog_tr C $ bool_tr Q;
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   160
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   161
val parse_translation = [("@Spec",spec_tr)];
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   162
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   163
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   164
(*** print translations: semantics -> syntax ***)
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   165
2708
c3b86dcd340a added comment: print translations do not mark tokens;
wenzelm
parents: 2239
diff changeset
   166
(* Note: does not mark tokens *)
c3b86dcd340a added comment: print translations do not mark tokens;
wenzelm
parents: 2239
diff changeset
   167
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   168
(* term_tr':term (name:string,trm:term) ersetzt in trm alle Vorkommen von name $ pvar durch
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   169
   entsprechende freie Variablen, welche die pvarID zu pvar darstellen. Beispiel:
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1384
diff changeset
   170
        bei name="s" und dem Term "s(0)=s(Suc(0)) & s(0)=X" wird der Term "a=b & a=X" geliefert *)
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   171
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   172
fun term_tr' (name,Free (s,t) $ trm) =
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   173
      if name=s then Syntax.free (pvar2pvarID trm)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   174
      else Free (s,t) $ term_tr' (name,trm)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   175
  | term_tr' (name,Abs (s,t,trm)) = Abs (s,t,term_tr' (name,trm))
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   176
  | term_tr' (name,trm1 $ trm2) = term_tr' (name,trm1) $ term_tr' (name,trm2)
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   177
  | term_tr' (name,trm) = trm;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   178
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   179
fun bexp_tr' (Abs(_,_,b)) = term_tr' (variant_abs ("s",dummyT,b));
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   180
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   181
fun exp_tr' (Abs(_,_,e)) = term_tr' (variant_abs ("s",dummyT,e));
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   182
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   183
fun com_tr' (Const ("Skip",_)) = Syntax.const "@Skip"
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   184
  | com_tr' (Const ("Assign",_) $ v $ e) =
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   185
      Syntax.const "@Assign" $ Syntax.free (pvar2pvarID v) $ exp_tr' e
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   186
  | com_tr' (Const ("Seq",_) $ c $ c') =
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   187
      Syntax.const "@Seq" $ com_tr' c $ com_tr' c'
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   188
  | com_tr' (Const ("Cond",_) $ b $ c $ c') =
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   189
       Syntax.const "@If" $ bexp_tr' b $ com_tr' c $ com_tr' c'
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   190
  | com_tr' (Const ("While",_) $ b $ inv $ c) =
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   191
       Syntax.const "@While" $ bexp_tr' b $ bexp_tr' inv $ com_tr' c;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   192
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   193
fun spec_tr' [p,c,q] =
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   194
       Syntax.const "@Spec" $ bexp_tr' p $ com_tr' c $ bexp_tr' q;
1335
5e1c0540f285 New directory.
nipkow
parents:
diff changeset
   195
5565
301a3a4d3dc7 patched obsolete code
paulson
parents: 5183
diff changeset
   196
val print_translation = [("Spec",spec_tr')];