440 likes | 453 Views
Define the syntax of statements in a declarative computation model kernel language. Covers various statement types like sequential composition, conditionals, procedural applications, and pattern matching. Examples and procedure abstractions are provided.
E N D
Declarative Computation ModelKernel language semantics Carlos Varela RPI Adapted with permission from: Seif Haridi KTH Peter Van Roy UCL C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Kernel language syntax The following defines the syntax of a statement, sdenotes a statement s::= skip empty statement | x = y variable-variable binding | x = v variable-value binding | s1 s2 sequential composition | local x in s1 end declaration | if x then s1 else s2 end conditional | { x y1 … yn } procedural application | case x of pattern then s1 else s2 end pattern matching v::= proc{ $ y1 … yn } s1 end |... value expression pattern::= ... C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Examples • local X in X = 1 end • local X Y T Z inX = 5 Y = 10 T = (X>=Y)if T then Z = X else Z = Y end{Browse Z}end • local ST in S= proc {$ X Y} Y = X*X end {S 5 T} {Browse T} end C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure abstraction • Any statement can be abstracted to a procedure by selecting a number of the ’free’ variable identifiers and enclosing the statement into a procedure with the identifiers as parameters • if X >= Y then Z = X else Z = Y end • Abstracting over all variablesproc {Max X Y Z}if X >= Y then Z = X else Z = Y endend • Abstracting over X and Zproc {LowerBound X Z}if X >= Y then Z = X else Z = Y endend C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Computations (abstract machine) • A computation defines how the execution state is transformed step by step from the initial state to the final state • A single assignment store is a set of store variables, a variable may be unbound, bound to a partial value, or bound to a group of other variables • An environment E is mapping from variable identifiers to variables or values in , e.g. {X x1, Y x2} • A semantic statement is a pair( s , E ) where s is a statement • ST is a stack of semantic statements C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Computations (abstract machine) • A computation defines how the execution state is transformed step by step from the initial state to the final state • The execution state is pair ( ST , ) • ST is a stack of semantic statements • A computation is a sequence of execution states( ST0 , 0 ) ( ST1 , 1 ) ( ST2 , 2 ) ... C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Semantics • To execute a program (i.e., a statement) s the initial execution state is ( [ (s , ) ] , ) • ST has a single semantic statement (s , ) • The environment E is empty, and the store is empty • [ ... ] denotes the stack • At each step the first element of ST is popped and execution proceeds according to the form of the element • The final execution state (if any) is a state in which ST is empty C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Calculating with environments • E is mapping from identifiers to entities (both store variables and values) in the store • The notation E(y) retrieves the entity associated with the identifier x from the store • The notationE + {y1 x1, y2 x2, ... , yn xn} • denotes a new environment E’ constructed from E by adding the mappings {y1 x1, y2 x2, ... , yn xn} • E’(z) is xkif zis equal to yk, otherwise E’(z) is equal to E(z) • The notation E|{y1, y2, ... , yn} denotes the projection of E onto the set {y1, y2, ... , yn}, i.e., E restricted to the members of the set C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Calculating with environments (2) • E = {X 1, Y [2 3], Zxi} • E’ = E + {X 2} • E’(X) = 2, E(X) = 1 • E|{X,Y} restricts E to the ’domain’ {X,Y},i.e., it is equal to {X 1, Y [2 3]} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Calculating with environments (3) • local X inX = 1 (E) local X in X = 2 (E’) {Browse X}end (E){Browse X}end C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
skip • The semantic statement is (skip, E) • Continue to next execution step C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
skip • The semantic statement is (skip, E) • Continue to next execution step (skip, E) ST + + ST C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Sequential composition • The semantic statement is (s1 s2 , E) • Push (s2 , E) and then push (s1 , E) on ST • Continue to next execution step (s1 , E) (s2 , E) ST (s1 s2 , E) ST + + C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Variable declaration • The semantic statement is (local x in s end, E) • Create a new store variable x in the Store • Let E’ be E+{x x}, i.e. E’ is the same as E but the identifier x is mapped to x. • Push (s , E’) on ST • Continue to next execution step C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Variable declaration • The semantic statement is (localXin s end, E) ’ + (local X in s end, ) ST (s, ) ST + + xi unbound E E X = xi C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Variable-variable equality • The semantic statement is ( x = y, E ) • Bind E(x) and E(y) in the store C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Variable-value equality • The semantic statement is ( x = v, E ) • Where v is a record, a number, or a procedure • Construct the value in the store and refer to it by the variable y. • Bind E(x) and y in the store • We have seen how to construct records and numbers, but what is a procedure value? C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Lexical scoping • Free and bound identifier occurrences • An identifier occurrence is bound with respect to a statement s if it is in the scope of a declaration inside s • A variable identifier is declared either by a ‘local’ statement, as a parameter of a procedure, or implicitly declared by a case statement • An identifier occurrence is free otherwise • In a running program every identifier is bound (i.e., declared) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Lexical scoping (2) • proc {P X}local Y inY = 1 {BrowseY} end X = Yend Free Occurrences Bound Occurrences C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Lexical scoping (3) • local Arg1 Arg2 in Arg1 = 111*111 Arg2 = 999*999Res = Arg1*Arg2end Free Occurrences Bound Occurrences This is not a runnable program! C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Lexical scoping (4) • local Res in local Arg1 Arg2 in Arg1 = 111*111 Arg2 = 999*999Res = Arg1*Arg2end{Browse Res}end C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Lexical scoping (5) local P Q inproc {P} {Q} endproc {Q} {Browse hello} endlocal Q inproc {Q} {Browse hi} end {P}end end C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure values • Constructing a procedure value in the store is not simple because a procedure may have external references local P Q inQ = proc {$} {Browse hello} endP = proc {$} {Q} endlocal Q in Q = proc {$} {Browse hi} end {P}end end C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure values (2) ( , ) x1 P proc {$} {Q} end Q x2 local P Q inQ = proc {$} {Browse hello} endP = proc {$} {Q} endlocal Q in Q = proc {$} {Browse hi} end {P}end end ( , ) x2 proc {$} {Browse hello} end Browse x0 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure values (3) • The semantic statement is (proc{x y1 ... yn} s end, E) • y1 ... yn are the (formal) parameters of the procedure • Other free identifiers of s are called external references z1 ... zk • These are defined by the environment E where the procedure is declared (lexical scoping) • The contextual environment of the procedure CE is E|{z1 ... zk} • When the procedure is called CE is used to construct the environment of s (proc {$ y1 ... yn } s end , CE) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure values (4) • Procedure values are pairs: (proc {$ y1 ... yn s end , CE) • They are stored in the store just as any other value (proc {$ y1 ... yn } s end , CE) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure introduction • The semantic statement is (x = proc{$ y1 ... yn} s end, E) • Environment is {x xP, ... } • Create a new procedure value of the form: (proc{$ y1 ... yn} s end, CE) , refer to it by the variable xP • Bind the store variable E(x) to xP • Continue to next execution step C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Suspendable statements • The remaining statements require x to be bound in order to execute • The activation condition (E(x) is determined), i.e., bound to a number, record or a procedure value s::= … | if x then s1 else s2 end conditional | { x y1 … yn } procedural application | case x of pattern matching pattern then s1 else s2 end C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Life cycle of a thread ST not empty A & B / Execute Running B/Resume A A & not B/Suspend not A /Terminate Top(ST) activation condition is true Suspended Terminated B C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Conditional • The semantic statement is ( if x then s1 else s2 end , E) • The activation condition (E(x) is determined) is true: • If E(x) is not Boolean (true, false), raise an error • E(x) is true, push (s1 , E) on the stack • E(x) is false, push (s2 , E) on the stack • The activation condition (E(x) is determined) is false: suspend C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedure application • The semantic statement is ({ x y1 … yn } , E) • The activation condition (E(x) is determined) is true: • If E(x) is not procedure value, or a procedure with arity that is not equal to n, raise an error • E(x) is (proc{$ z1 ... zn} s end, CE), push ( s , CE + {z1 E(y1) … zn E(yn)} ) on the stack • The activation condition (E(x) is determined) is false: suspend C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Case statement • The semantic statement is ( case x of l (f1 : x1 … fn : xn) then s1 else s2 end , E) • The activation condition (E(x) is determined) is true: • The label of E(x) is l and its arity is [f1 … fn]:push (localx1 = x. f1 … xn = x. fn in s1end, E)on the stack • Otherwise push (s2 , E) on the stack • The activation condition (E(x) is determined) is false: suspend C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Execution examples local Max C inproc {Max X Y Z}s3if X >= Y then Z=X else Z=Y endend{Max 3 5 C}end s2 s1 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Execution examples (2) local Max C inproc {Max X Y Z}s3if X >= Y then Z=X else Z=Y endends4{Max 3 5 C}end • Initial state ([(s1, )], ) • After local Max C in …( [(s2, {Max m, C c}) ], {m, c}) • After Max binding( [(s4, {Max m, C c}) ], {m = (proc{$ X Y Z} s3end , ), c}) s1 s2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Execution examples (3) local Max C inproc {Max X Y Z}s3if X >= Y then Z=X else Z=Y endends4{Max 3 5 C}end • After Max binding( [(s4, {Max m, C c}) ], {m = (proc{$ X Y Z} s3end , ), c}) • After procedure call( [(s3, {X t1, Y t2, Z c}) ], {m = (proc{$ X Y Z} s3end , ), t1=3, t2=5, c}) s1 s2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Execution examples (4) local Max C inproc {Max X Y Z}s3if X >= Y then Z=X else Z=Y endends4{Max 3 5 C}end • After procedure call( [(s3, {X t1, Y t2, Z c}) ], {m = (proc{$ X Y Z} s3end , ), t1=3, t2=5, c}) • After T = (X>=Y)( [(s3, {X t1, Y t2, Z c, T t}) ], {m = (proc{$ X Y Z} s3end , ), t1=3, t2=5, c, t=false}) • ( [(Z=Y , {X t1, Y t2, Z c, T t}) ], {m = (proc{$ X Y Z} s3end , ), t1=3, t2=5, c, t=false}) s1 s2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Execution examples (5) local Max C inproc {Max X Y Z}s3if X >= Y then Z=X else Z=Y endends4{Max 3 5 C}end • ( [(Z=Y , {X t1, Y t2, Z c, T t}) ], {m = (proc{$ X Y Z} s3end , ), t1=3, t2=5, c, t=false}) • ( [ ], {m = (proc{$ X Y Z} s3end , ), t1=3, t2=5, c=5, t=false}) s1 s2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedures with external references local LB Y C inY= 5proc {LB X Z}s3if X >= Y then Z=X else Z=Y endend{LB 3 C}end s1 s2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedures with external references local LB Y C inY= 5proc {LB X Z}s3if X >= Y then Z=X else Z=Y endend{LB 3 C}end s1 s2 • The procedure value of LB is • (proc{$ X Z} s3 end , {Y y}) • The store is {y = 5, …} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedures with external references local LB Y C inY= 5proc {LB X Z}s3if X >= Y then Z=X else Z=Y endend{LB 3 C}end s1 s2 • The procedure value of LB is • (proc{$ X Z} s3 end , {Y y}) • The store is {y = 5, …} • STACK: [( {LB T C} , {Y y , LB lb, C c, T t}) ] • STORE: {y = 5, lb = (proc{$ X Z} s3 end , {Y y}) , t = 3, c} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedures with external references local LB Y C inY= 5proc {LB X Z}s3if X >= Y then Z=X else Z=Y endend{LB 3 C}end s1 s2 • STACK: [( {LB T C} , {Y y , LB lb, C c, T t}) ] • STORE: {y = 5, lb = (proc{$ X Z} s3 end , {Y y}) , t = 3, c} • STACK: [(s3, {Y y , X t , Z c}) ] • STORE: {y = 5, lb = (proc{$ X Z} s3 end , {Y y}) , t = 3, c} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Procedures with external references local LB Y C inY= 5proc {LB X Z}s3if X >= Y then Z=X else Z=Y endend{LB 3 C}end s1 s2 • STACK: [(s3, {Y y , X t , Z c}) ] • STORE: {y = 5, lb = (proc{$ X Z} s3 end , {Y y}) , t = 3, c} • STACK: [(Z=Y, {Y y , X t , Z c}) ] • STORE: {y = 5, lb = (proc{$ X Z} s3 end , {Y y}) , t = 3, c} • STACK: [] • STORE: {y = 5, lb = (proc{$ X Z} s3 end , {Y y}) , t = 3, c = 5} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Exercises • Explain the difference between static binding and dynamic binding. Does dynamic binding require keeping an environment in a closure (procedure value)? Why or why not? • VRH Exercise 2.2 (page 107) • VRH Exercise 2.7 (page 108) –translate example to kernel language and execute using operational semantics. • Write an example of a program that suspends. Now, write an example of a program that never terminates. Use the operational semantics to prove suspension or non-termination. C. Varela; Adapted w/permission from S. Haridi and P. Van Roy
Exercises • Translate the following function to the kernel language fun {AddList L1 L2} case L1 of H1|T1 then case L2 of H2|T2 then H1+H2|{AddList T1 T2} end else nil end end Using the operational semantics, execute the call {AddList [1 2] [3 4]} • Read VRH Sections 2.5-2.7. C. Varela; Adapted w/permission from S. Haridi and P. Van Roy