(* Title: ZF/IMP/Com.thy ID: $Id: Com.thy,v 1.19 2005/06/17 14:15:10 haftmann Exp $ Author: Heiko Loetzbeyer and Robert Sandner, TU München *) header {* Arithmetic expressions, boolean expressions, commands *} theory Com imports Main begin subsection {* Arithmetic expressions *} consts loc :: i aexp :: i datatype \ "univ(loc \ (nat -> nat) \ ((nat \ nat) -> nat))" aexp = N ("n \ nat") | X ("x \ loc") | Op1 ("f \ nat -> nat", "a \ aexp") | Op2 ("f \ (nat \ nat) -> nat", "a0 \ aexp", "a1 \ aexp") consts evala :: i syntax "_evala" :: "[i, i] => o" (infixl "-a->" 50) translations "p -a-> n" == " \ evala" inductive domains "evala" \ "(aexp \ (loc -> nat)) \ nat" intros N: "[| n \ nat; sigma \ loc->nat |] ==> -a-> n" X: "[| x \ loc; sigma \ loc->nat |] ==> -a-> sigma`x" Op1: "[| -a-> n; f \ nat -> nat |] ==> -a-> f`n" Op2: "[| -a-> n0; -a-> n1; f \ (nat\nat) -> nat |] ==> -a-> f`" type_intros aexp.intros apply_funtype subsection {* Boolean expressions *} consts bexp :: i datatype \ "univ(aexp \ ((nat \ nat)->bool))" bexp = true | false | ROp ("f \ (nat \ nat)->bool", "a0 \ aexp", "a1 \ aexp") | noti ("b \ bexp") | andi ("b0 \ bexp", "b1 \ bexp") (infixl 60) | ori ("b0 \ bexp", "b1 \ bexp") (infixl 60) consts evalb :: i syntax "_evalb" :: "[i,i] => o" (infixl "-b->" 50) translations "p -b-> b" == " \ evalb" inductive domains "evalb" \ "(bexp \ (loc -> nat)) \ bool" intros true: "[| sigma \ loc -> nat |] ==> -b-> 1" false: "[| sigma \ loc -> nat |] ==> -b-> 0" ROp: "[| -a-> n0; -a-> n1; f \ (nat*nat)->bool |] ==> -b-> f` " noti: "[| -b-> w |] ==> -b-> not(w)" andi: "[| -b-> w0; -b-> w1 |] ==> -b-> (w0 and w1)" ori: "[| -b-> w0; -b-> w1 |] ==> -b-> (w0 or w1)" type_intros bexp.intros apply_funtype and_type or_type bool_1I bool_0I not_type type_elims evala.dom_subset [THEN subsetD, elim_format] subsection {* Commands *} consts com :: i datatype com = skip ("\" []) | assignment ("x \ loc", "a \ aexp") (infixl "\" 60) | semicolon ("c0 \ com", "c1 \ com") ("_\ _" [60, 60] 10) | while ("b \ bexp", "c \ com") ("\ _ \ _" 60) | if ("b \ bexp", "c0 \ com", "c1 \ com") ("\ _ \ _ \ _" 60) consts evalc :: i syntax "_evalc" :: "[i, i] => o" (infixl "-c->" 50) translations "p -c-> s" == " \ evalc" inductive domains "evalc" \ "(com \ (loc -> nat)) \ (loc -> nat)" intros skip: "[| sigma \ loc -> nat |] ==> <\,sigma> -c-> sigma" assign: "[| m \ nat; x \ loc; -a-> m |] ==> a,sigma> -c-> sigma(x:=m)" semi: "[| -c-> sigma2; -c-> sigma1 |] ==> c1, sigma> -c-> sigma1" if1: "[| b \ bexp; c1 \ com; sigma \ loc->nat; -b-> 1; -c-> sigma1 |] ==> <\ b \ c0 \ c1, sigma> -c-> sigma1" if0: "[| b \ bexp; c0 \ com; sigma \ loc->nat; -b-> 0; -c-> sigma1 |] ==> <\ b \ c0 \ c1, sigma> -c-> sigma1" while0: "[| c \ com; -b-> 0 |] ==> <\ b \ c,sigma> -c-> sigma" while1: "[| c \ com; -b-> 1; -c-> sigma2; <\ b \ c, sigma2> -c-> sigma1 |] ==> <\ b \ c, sigma> -c-> sigma1" type_intros com.intros update_type type_elims evala.dom_subset [THEN subsetD, elim_format] evalb.dom_subset [THEN subsetD, elim_format] subsection {* Misc lemmas *} lemmas evala_1 [simp] = evala.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD1] and evala_2 [simp] = evala.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD2] and evala_3 [simp] = evala.dom_subset [THEN subsetD, THEN SigmaD2] lemmas evalb_1 [simp] = evalb.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD1] and evalb_2 [simp] = evalb.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD2] and evalb_3 [simp] = evalb.dom_subset [THEN subsetD, THEN SigmaD2] lemmas evalc_1 [simp] = evalc.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD1] and evalc_2 [simp] = evalc.dom_subset [THEN subsetD, THEN SigmaD1, THEN SigmaD2] and evalc_3 [simp] = evalc.dom_subset [THEN subsetD, THEN SigmaD2] inductive_cases evala_N_E [elim!]: " -a-> i" and evala_X_E [elim!]: " -a-> i" and evala_Op1_E [elim!]: " -a-> i" and evala_Op2_E [elim!]: " -a-> i" end