theory Procs_Stat_Vars_Dyn imports Util Procs begin subsubsection "Static Scoping of Procedures, Dynamic of Variables" types penv = "(name \ com) list" inductive big_step :: "penv \ com \ state \ state \ bool" ("_ \ _ \ _" [60,0,60] 55) where Skip: "pe \ (SKIP,s) \ s" | Assign: "pe \ (x ::= a,s) \ s(x := aval a s)" | Semi: "\ pe \ (c\<^isub>1,s\<^isub>1) \ s\<^isub>2; pe \ (c\<^isub>2,s\<^isub>2) \ s\<^isub>3 \ \ pe \ (c\<^isub>1;c\<^isub>2, s\<^isub>1) \ s\<^isub>3" | IfTrue: "\ bval b s; pe \ (c\<^isub>1,s) \ t \ \ pe \ (IF b THEN c\<^isub>1 ELSE c\<^isub>2, s) \ t" | IfFalse: "\ \bval b s; pe \ (c\<^isub>2,s) \ t \ \ pe \ (IF b THEN c\<^isub>1 ELSE c\<^isub>2, s) \ t" | WhileFalse: "\bval b s \ pe \ (WHILE b DO c,s) \ s" | WhileTrue: "\ bval b s\<^isub>1; pe \ (c,s\<^isub>1) \ s\<^isub>2; pe \ (WHILE b DO c, s\<^isub>2) \ s\<^isub>3 \ \ pe \ (WHILE b DO c, s\<^isub>1) \ s\<^isub>3" | Var: "pe \ (c,s) \ t \ pe \ ({VAR x;; c}, s) \ t(x := s x)" | Call1: "(p,c)#pe \ (c, s) \ t \ (p,c)#pe \ (CALL p, s) \ t" | Call2: "\ p' \ p; pe \ (CALL p, s) \ t \ \ (p',c)#pe \ (CALL p, s) \ t" | Proc: "(p,cp)#pe \ (c,s) \ t \ pe \ ({PROC p = cp;; c}, s) \ t" code_pred big_step . inductive exec where "[] \ (c,nth ns) \ s \ exec c ns (list s (length ns))" code_pred exec . values "{ns. exec (CALL 0) [42,43] ns}" values "{ns. exec test_com [0,0] ns}" end