theory Semantics imports Main begin section {* The Language *} subsection {* Variables and Values *} type_synonym vname = string -- "names for variables" datatype val = Bool bool -- "Boolean value" | Intg int -- "integer value" abbreviation "true == Bool True" abbreviation "false == Bool False" subsection {* Expressions and Commands *} datatype bop = Eq | And | Less | Add | Sub -- "names of binary operations" datatype expr = Val val -- "value" | Var vname -- "local variable" | BinOp expr bop expr ("_ \_\ _" [80,0,81] 80) -- "binary operation" fun binop :: "bop \ val \ val \ val option" where "binop Eq v\<^isub>1 v\<^isub>2 = Some(Bool(v\<^isub>1 = v\<^isub>2))" | "binop And (Bool b\<^isub>1) (Bool b\<^isub>2) = Some(Bool(b\<^isub>1 \ b\<^isub>2))" | "binop Less (Intg i\<^isub>1) (Intg i\<^isub>2) = Some(Bool(i\<^isub>1 < i\<^isub>2))" | "binop Add (Intg i\<^isub>1) (Intg i\<^isub>2) = Some(Intg(i\<^isub>1 + i\<^isub>2))" | "binop Sub (Intg i\<^isub>1) (Intg i\<^isub>2) = Some(Intg(i\<^isub>1 - i\<^isub>2))" | "binop bop v\<^isub>1 v\<^isub>2 = None" datatype com = Skip | LAss vname expr ("_::=_" [70,70] 70) -- "local assignment" | Seq com com ("_;;/ _" [61,60] 60) | Cond expr com com ("IF '(_') _/ ELSE _" [80,79,79] 70) | While expr com ("WHILE '(_') _" [80,79] 70) fun fv :: "expr \ vname set" --"free variables in an expression" where FVc: "fv (Val v) = {}" | FVv: "fv (Var x) = {x}" | FVe: "fv (e\<^isub>1 \bop\ e\<^isub>2) = fv e\<^isub>1 \ fv e\<^isub>2" subsection {* State *} type_synonym state = "vname \ val" fun "interpret" :: "expr \ state \ val option" ("\_\_" [0,52] 51) where Val: "\Val v\ s = Some v" | Var: "\Var x\ s = s x" | BinOp: "\e\<^isub>1\bop\e\<^isub>2\ s = (case \e\<^isub>1\ s of None \ None | Some v\<^isub>1 \ (case \e\<^isub>2\ s of None \ None | Some v\<^isub>2 \ binop bop v\<^isub>1 v\<^isub>2) )" fun interpretTime :: "expr \ nat" ("\_\\<^sub>t" [0] 110) (* Untergestelltes t mit "\e\\ <^sub>t" (ohne Leerzeichen) *) where "\Val v\\<^sub>t = 1" | "\Var x\\<^sub>t = 1" | "\e\<^isub>1 \bop\ e\<^isub>2\\<^sub>t = Suc (\e\<^isub>1\\<^sub>t + \e\<^isub>2\\<^sub>t)" subsection {* Big Step Semantics *} inductive eval :: "com \ state \ state \ nat \ bool" ("((1\_,/_\) \/ _ : _)" [0,0,0,0] 0) where EvalSkip: "\Skip,s\ \ s : 1" | EvalLAss: "\x::=e,s\ \ s(x := \e\s) : Suc (\e\\<^sub>t)" | EvalSeq: "\\c\<^isub>1,s\ \ s'' : t\<^isub>1; \c\<^isub>2,s''\ \ s' : t\<^isub>2\ \ \c\<^isub>1;;c\<^isub>2,s\ \ s' : Suc (t\<^isub>1 + t\<^isub>2)" | EvalCondTrue: "\\b\ s = Some true; \c\<^isub>1,s\ \ s' : t\ \ \IF (b) c\<^isub>1 ELSE c\<^isub>2,s\ \ s' : Suc (\b\\<^sub>t + t)" | EvalCondFalse: "\\b\ s = Some false; \c\<^isub>2,s\ \ s' : t\ \ \IF (b) c\<^isub>1 ELSE c\<^isub>2,s\ \ s' : Suc (\b\\<^sub>t + t)" | EvalWhileTrue: "\\b\ s = Some true; \c,s\ \ s'' : t\<^isub>c; \WHILE (b) c,s''\ \ s' : t\<^isub>w\ \ \WHILE (b) c,s\ \ s' : Suc (\b\\<^sub>t + t\<^isub>c + t\<^isub>w)" | EvalWhileFalse: "\b\ s = Some false \ \WHILE (b) c,s\ \ s : Suc (\b\\<^sub>t)" text {* Some example programs: *} text {* x = 8; y = 10; if (x < y) { x++; } else { y = y + 3; } *} value "''x''::=Val(Intg 8);; ''y''::=Val(Intg 10);; IF (Var ''x'' \Less\ Var ''y'') (''x''::= Var ''x'' \Add\ Val(Intg 1)) ELSE (''y''::= Var ''y'' \Add\ Val(Intg 3))" text {* x = 8; if (x < y) { x++; } else { y = y + 3; x = 9; } y = x; *} value "''x''::=Val(Intg 8);; (IF (Var ''x'' \Less\ Var ''y'') (''x''::= Var ''x'' \Add\ Val(Intg 1)) ELSE (''y''::= Var ''y'' \Add\ Val(Intg 3);; ''x''::=Val(Intg 9)));; ''y''::=Var ''x''" text {* if (x < 10) { x = 8; } else { x = 14; } while (x < 7) { x = x + x; } *} value "IF (Var ''x'' \Less\ Val(Intg 10)) (''x''::=Val(Intg 8)) ELSE (''x''::=Val(Intg 14));; WHILE (Var ''x'' \Less\ Val(Intg 7)) (''x''::= Var ''x'' \Add\Var ''x'')" text {* x = 13; y = 7; while (y == x - 5) { x++; } *} value "''x''::=Val(Intg 13);; ''y''::=Val(Intg 7);; WHILE (Var ''y'' \Eq\ (Var ''x'' \Sub\ Val(Intg 5))) (''x''::= Var ''x'' \Add\ Val(Intg 1))" subsection {* Type System *} datatype ty = Boolean | Integer type_synonym env = "vname \ ty" inductive expr_typing :: "env \ expr \ ty \ bool" ("_ \ _ : _" [51,0,100] 0) for \::env where TypeValIntg: "\ \ Val(Intg i) : Integer" | TypeValBool: "\ \ Val(Bool b) : Boolean" | TypeVar: "\ x = Some T \ \ \ Var x : T" | TypeBopEq: "\\ \ e\<^isub>1 : T; \ \ e\<^isub>2 : T\ \ \ \ e\<^isub>1 \Eq\ e\<^isub>2 : Boolean" | TypeBopAnd: "\\ \ e\<^isub>1 : Boolean; \ \ e\<^isub>2 : Boolean\ \ \ \ e\<^isub>1 \And\ e\<^isub>2 : Boolean" | TypeBopLess: "\\ \ e\<^isub>1 : Integer; \ \ e\<^isub>2 : Integer\ \ \ \ e\<^isub>1 \Less\ e\<^isub>2 : Boolean" | TypeBopAdd: "\\ \ e\<^isub>1 : Integer; \ \ e\<^isub>2 : Integer\ \ \ \ e\<^isub>1 \Add\ e\<^isub>2 : Integer" | TypeBopSub: "\\ \ e\<^isub>1 : Integer; \ \ e\<^isub>2 : Integer\ \ \ \ e\<^isub>1 \Sub\ e\<^isub>2 : Integer" inductive WT :: "env \ com \ bool" ("_ \ _" [51,51] 0) for \::env where WTSkip: "\ \ Skip" | WTLAss: "\\ x = Some T; \ \ e : T\ \ \ \ x ::= e" | WTSeq: "\\ \ c\<^isub>1; \ \ c\<^isub>2\ \ \ \ c\<^isub>1;;c\<^isub>2" | WTCond: "\\ \ b : Boolean; \ \ c\<^isub>1; \ \ c\<^isub>2\ \ \ \ IF (b) c\<^isub>1 ELSE c\<^isub>2" | WTWhile: "\\ \ b : Boolean; \ \ c\ \ \ \ WHILE (b) c" end