theory Procs_Dyn_Vars_Dyn imports Util Procs begin subsubsection "Dynamic Scoping of Procedures and Variables" types penv = "name \ com" 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)" | Call: "pe \ (pe p, s) \ t \ pe \ (CALL p, s) \ t" | Proc: "pe(p := cp) \ (c,s) \ t \ pe \ ({PROC p = cp;; c}, s) \ t" code_pred big_step . inductive exec where "(\p. SKIP) \ (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