src/HOL/IMPP/EvenOdd.thy
author wenzelm
Sat, 06 Oct 2001 00:02:46 +0200
changeset 11704 3c50a2cd6f00
parent 11701 3d51fbf81c17
child 15354 9234f5765d9c
permissions -rw-r--r--
* sane numerals (stage 2): plain "num" syntax (removed "#");

(*  Title:      HOL/IMPP/EvenOdd.thy
    ID:         $Id$
    Author:     David von Oheimb
    Copyright   1999 TUM

Example of mutually recursive procedures verified with Hoare logic
*)

EvenOdd = Misc +

constdefs even :: nat => bool
  "even n == 2 dvd n"

consts
  Even, Odd :: pname
rules 
  Even_neq_Odd "Even ~= Odd"
  Arg_neq_Res  "Arg  ~= Res"

constdefs
  evn :: com
 "evn == IF (%s. s<Arg>=0)
         THEN Loc Res:==(%s. 0)
         ELSE(Loc Res:=CALL Odd(%s. s<Arg> - 1);;
              Loc Arg:=CALL Odd(%s. s<Arg> - 1);;
              Loc Res:==(%s. s<Res> * s<Arg>))"
  odd :: com
 "odd == IF (%s. s<Arg>=0)
         THEN Loc Res:==(%s. 1)
         ELSE(Loc Res:=CALL Even (%s. s<Arg> - 1))"

defs
  bodies_def "bodies == [(Even,evn),(Odd,odd)]"
  
consts
  Z_eq_Arg_plus   :: nat => nat assn ("Z=Arg+_" [50]50)
 "even_Z=(Res=0)" ::        nat assn ("Res'_ok")
defs
  Z_eq_Arg_plus_def "Z=Arg+n == %Z s.      Z =  s<Arg>+n"
  Res_ok_def       "Res_ok   == %Z s. even Z = (s<Res>=0)"

end