74
1 Semantik och programteori Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera om program

Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

Embed Size (px)

Citation preview

Page 1: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

1Semantik och programteori

Tillämpning av denotationssemantik

Semantiken hos ett större imperativt språk

Semantik för kontextuella begränsningar

Resonera om program

Page 2: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

2Semantik och programteori

Semantiska domäner Specificera semantiska domäner lämpliga för språket vi

vill definiera. Det behövs en domän för att modellera varje typ av värde i språket. Till dessa definieras hjälpfunktioner för att modellera operationer på dessa värden.

I språket behövs: Primitiva typer: Sammansatta typer Första klassens värden Andra värden Omgivningen Minne Variabler

Page 3: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

3Semantik och programteori

Typer Primitiva typer:

Truth-Value, Integers, Character Sammansatta typer

Record-Value and Array-Value. Första klassens värden

Value = disjunkt union av Truth-Value, Integer,Character, Record-Value och Array-Value.

Andra värden Variable, Procedure, and Function

Page 4: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

4Semantik och programteori

Strukturer Omgivningen

Bindable = disjunkt union av Value, Variable, Procedure, Function och Allocator

Minne (Store) Storable = disjunkt union av

Truth-Value, Integer, Character och Text. Variabler

Record-Variable Array-Variable Variable = disjunkt union av

Location , Record-Variable och Array-Variable.

Page 5: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

5Semantik och programteori

Kontenta

Ett bra val av domäner och hjälp funktioner tenderar till att göra de semantiska funktionerna relativt kortfattade och enkla att förstå.

Page 6: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

6Semantik och programteori

Semantiska funktions För varje frasklass i programspråket väljer vi en

domän för denotationen för fraser i den klassen och specificerar en semantisk funktion som mappar dessa fraser till deras denotation.

Kommandon Environ Store Store.

Uttryck Environ Store Value Store.

Deklarationer Environ Store Environ Store.

Page 7: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

7Semantik och programteori

Uttryck som kommandoblockevaluate : Expression (Environ Store Value Store)

evaluate [begin C; return E end] env sto =let sto' = execute C env sto inevaluate E env sto'

evaluate [E1 + E2] env sto =let (int1, sto') = evaluate E1 env sto inlet (int2, sto'') = evaluate E2 env sto' in(sum (int1, int2), sto'')

evaluate [N] env sto =(valuation N, sto)

execute [I := E] env sto =let (val, sto') = evaluate E env sto inlet variable loc = find (env, I) in

update (sto', loc, val)

Page 8: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

8Semantik och programteori

Denotation för uttryck, kommandon och deklarationer.

Frasklass Domän för denotation

Pure functional language:Expression Environ ValueDeclaration Environ Environ

Imperative language without side effects:Expression Environ Store ValueCommand Environ Store StoreDeclaration Environ Store Environ Store

Imperative language with side effects:Expression Environ Store Value StoreCommand Environ Store StoreDeclaration Environ Store Environ Store

Page 9: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

9Semantik och programteori

Abstraktioner Abstraktionsdomäner i språk med statiska bindningar.

Typ av Denotation för Abstraktionsdomänabstraktion abstraktionskropp

Pure functional language:Function Environ Value Argument* Value

Imperative language without side effects:Function Environ Store Value Argument* Store ValueProcedure Environ Store Store Argument* Store Store

Imperative language with side effects:Function Environ Argument*

Store Value Store Store Value StoreProcedure Environ Store Store Argument* Store Store

Page 10: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

10Semantik och programteori

Program och input–outputrun : Program (Input Output)

program(input n :Integer,output p :Integer) ~p := 1;while n > 0 do

begin p := 2 * p; n := n - 1 end

Program ::=program(

input Identifier : Type-Denoter,

output Identifier : Type-Denoter ) ~

Command

Page 11: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

11Semantik och programteori

Semantiska funktionerrun : Program (Value Value)run [program ( input I1 : T1 ,

output I2 : T2 ) ~ C] in-val =let sto = empty-store inlet (sto1, in-var) = allocate-variable T1 empty-environ sto inlet (sto2, out-var) = allocate-variable T2 empty-environ sto1 inlet sto3 = update-variable (sto2, in-var, in-val) inlet env = overlay (bind (I1, variable in-var),

bind (I2, variable out-var)) inlet sto4 = execute C env sto3 infetch-variable (sto4, out-var)

Page 12: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

12Semantik och programteori

ExempelC1 = p := 1

C2 = p := 2 * p

C3 = n := n - 1

C4 = while n > 0 do begin C2 ; C3 end

C5 = C1 ; C4

run [program(input n :Integer,output p :Integer) ~ C5] v =

let sto = empty-store inlet (sto1, in-var) = allocate-variable Integer empty-environ sto inlet (sto2, out-var) = allocate-variable Integer empty-environ sto1 inlet sto3 = update-variable (sto2, in-var, v) inlet e0 = overlay ( bind (n, variable in-var),

bind (p , variable out-var)) inlet sto4 = execute C5 e0 sto3 infetch-variable (sto4, out-var)

Page 13: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

13Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, in-var) = allocate-variable Integer empty-environ s0 inlet (s2, out-var) = allocate-variable Integer empty-environ s1 inlet s3 = update-variable (s2, in-var , v) inlet e0 = overlay ( bind (n, variable in-var),

bind (p , variable out-var)) inlet s4 = execute C5 e0 s3 infetch-variable (s4, out-var)

Page 14: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

14Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, in-var) = let (sto,l0) = allocate s0 in (sto,primitiv-variable l0) inlet (s2, out-var) = allocate-variable Integer empty-environ s1 inlet s3 = update-variable (s2, in-var , v) inlet e0 = overlay ( bind (n, variable in-var),

bind (p , variable out-var)) inlet s4 = execute C5 e0 s3 infetch-variable (s4, out-var)

Page 15: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

15Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (sto, l0) = allocate s0 in let (s1, in-var) = (sto,primitiv-variable l0) inlet (s2, out-var) = allocate-variable Integer empty-environ s1 in let s3 = update-variable (s2, in-var , v) inlet e0 = overlay ( bind (n, variable in-var),

bind (p , variable out-var)) inlet s4 = execute C5 e0 s3 infetch-variable (s4, out-var)

Page 16: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

16Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, l0) = allocate s0 in let in-var = primitiv-variable l0 inlet (s2, out-var) = allocate-variable Integer empty-environ s1 in let s3 = update-variable (s2, in-var , v) inlet e0 = overlay ( bind (n, variable in-var),

bind (p , variable out-var)) inlet s4 = execute C5 e0 s3 infetch-variable (s4, out-var)

Page 17: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

17Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, l0) = allocate s0 in let in-var = primitiv-variable l0 inlet (s2, l1) = allocate s1 in let out-var = primitiv-variable l1 in let s3 = update-variable (s2, in-var , v) inlet e0 = overlay ( bind (n, variable in-var),

bind (p , variable out-var)) inlet s4 = execute C5 e0 s3 infetch-variable (sto4, out-var)

Page 18: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

18Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, l0) = allocate s0 in let (s2, l1) = allocate s1 in let out-var = primitiv-variable l1 in let s3 = update-variable (s2, primitiv-variable l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable out-var)) inlet s4 = execute C5 e0 s3 infetch-variable (s4, out-var)

Page 19: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

19Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, l0) = allocate s0 in let (s2, l1) = allocate s1 in let s3 = update-variable (s2, primitiv-variable l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet s4 = execute C5 e0 s3 infetch-variable (s4, primitiv-variable l1)

Page 20: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

20Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let s0 = empty-store inlet (s1, l0) = allocate s0 in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet s4 = execute C5 e0 s3 infetch-variable (s4, primitiv-variable l1)

Page 21: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

21Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet s4 = execute C5 e0 s3 infetch-variable (s4, primitiv-variable l1)

Page 22: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

22Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet s4 = execute C5 e0 sto3 infetch (s4, l1)

Page 23: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

23Semantik och programteori

Exempelexecute C5 e0 s3 =

execute [C1; C4] e0 s3

Page 24: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

24Semantik och programteori

Exempelexecute C5 e0 s3 =

execute [p := 1; C4] e0 s3

Page 25: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

25Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 (execute p := 1 e0 s3)

Page 26: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

26Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 ( let val = evaluate 1 e0 s3 inlet variable var = identify p e0 inupdate-variable(s3, var,val))

Page 27: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

27Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 ( let val = integer (valuation 1 ) inlet variable var = identify p e0 inupdate-variable(s3, var,val))

Page 28: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

28Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 ( let val = integer 1 inlet variable var = identify p e0 inupdate-variable(s3, var,val))

Page 29: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

29Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 ( let variable var = identify p e0 inupdate-variable(s3, var, integer 1))

identify p e0 =

find (e0 ,p) =

find (overlay ( bind (n, variable (primitiv-variable l0)),bind (p , variable (primitiv-variable l1))), p) =

find (bind (p , variable (primitiv-variable l1)), p) =

variable (primitiv-variable l1))

Page 30: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

30Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 ( let variable var = variable (primitiv-variable l1) inupdate-variable(s3, var, integer 1))

Page 31: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

31Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 ( update-variable(s3, primitiv-variable l1 , integer 1))

Page 32: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

32Semantik och programteori

Exempelexecute C5 e0 s3 =

execute C4 e0 (update(s3, l1 , integer 1))

Page 33: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

33Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in execute C4 e0 s31

Page 34: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

34Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

execute [while n > 0 do begin C2;C3 end] e0 s31

Page 35: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

35Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while env sto = if evaluate [n > 0] env sto = truth-value true then execute-while env (execute [C2;C3] env sto)

else sto

inexecute-while e0 s31

Page 36: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

36Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if evaluate [n > 0] e0 sto = truth-value true then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 37: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

37Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if ( let integer int1 = evaluate n e0 sto in

let integer int2 = evaluate 0 e0 sto intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 38: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

38Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if ( let integer int1 = coerce(sto,identify n e0) in

let integer int2 = evaluate 0 e0 sto intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 39: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

39Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if ( let integer int1 = coerce(sto,find(e0,n)) in

let integer int2 = evaluate 0 e0 sto intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 40: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

40Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if ( let integer int1 = coerce(sto, variable (primitiv-variable l0)) in

let integer int2 = evaluate 0 e0 sto intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 41: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

41Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if ( let integer int1 = fetch-variable(sto,primitiv-variable l0) in

let integer int2 = evaluate 0 e0 sto intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 42: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

42Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 , integer 1) in

let execute-while sto = if ( let integer int1 = fetch (sto,l0) in

let integer int2 = evaluate 0 e0 sto intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 43: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

43Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = if ( let integer int1 = fetch (sto,l0) in

let integer int2 = integer 0 intruth-value (greater(int1 , int2 )) = truth-value true)

then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 44: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

44Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = if ( let integer int1 = fetch (sto,l0) in

truth-value (greater(int1 , 0)) = truth-value true)then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 45: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

45Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = if ( let integer int1 = fetch (sto,l0) in greater(int1 , 0) = true)then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 46: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

46Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = if (let integer int1 = fetch (sto,l0) in greater(int1 , 0))then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 47: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

47Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0)then execute-while (execute [C2;C3] e0 sto)

else sto

inexecute-while s31

Page 48: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

48Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0)then execute-while (execute C3 e0 (execute C2 e0 sto))

else sto

inexecute-while s31

Page 49: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

49Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then execute-while (execute C3 e0 (execute [p := 2 * p] e0 sto))

else sto

inexecute-while s31

Page 50: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

50Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then execute-while (execute C3 e0 (

let val = evaluate [2 * p] e0 sto inlet variable var = identify p e0 inupdate-variable (sto,var,val)))

else sto

inexecute-while s31

Page 51: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

51Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then execute-while (execute C3 e0 (

let integer int2 = fetch (sto, l1 ) inupdate (sto, l1 ,integer(times(2,int2)))))

else sto

inexecute-while s31

Page 52: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

52Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then let s32 = let integer int2 = fetch (sto, l1 ) in

update (sto, l1 ,integer(times(2,int2))) in execute-while (execute C3 e0 s32)

else sto

inexecute-while s31

Page 53: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

53Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if (greater(int1 , 0) = true)then let integer int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , integer(times(2,int2))) in execute-while (execute C3 e0 s32)

else sto

inexecute-while s31

Page 54: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

54Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then let integer int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , integer(times(2,int2))) in execute-while (execute [n := n - 1] e0 s32)

else sto

inexecute-while s31

Page 55: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

55Semantik och programteori

Exempelexecute C5 e0 s3 =

let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then let integer int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , integer(times(2,int2))) in let integer int3 = fetch (s32 , l0 ) in let s33 = update (s32 , l0 , integer(minus(int1,1))) in execute-while s33

else sto

inexecute-while s31

Page 56: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

56Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet s4 = execute C5 e0 s3 infetch (s4, l1)

Page 57: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

57Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet sto4 = let s31 = update(s3, l1 ,integer 1) in

let execute-while sto = let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then let integer int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , integer(times(2,int2)))) in

let integer int3 = fetch (s32 , l0 ) in let s33 = update (s32 , l0 , integer(minus(int1,1)))

in execute-while s33

else sto in execute-while s31

in fetch(sto4, l1)

Page 58: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

58Semantik och programteori

Exempelrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet e0 = overlay ( bind (n, variable (primitiv-variable l0)),

bind (p , variable (primitiv-variable l1))) inlet s31 = update(s3, l1 ,integer 1) in let execute-while sto =

let integer int1 = fetch (sto,l0) in if greater(int1 , 0) then let integer int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , integer(times(2,int2))) in let integer int3 = fetch (s32 , l0 ) in let s33 = update (s32 , l0 , integer(minus(int1,1))) in execute-while s33

else sto in fetch(execute-while s31 , l1)

Page 59: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

59Semantik och programteori

Klartrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet s31 = update(s3, l1 ,integer 1) in let execute-while sto =

let integer int1 = fetch (sto,l0) in if greater(int1 ,0)then let integer int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , integer(times(2,int2))) in let integer int3 = fetch (s32 , l0 ) in let s33 = update (s32 , l0 , integer(minus(int1,1))) in execute-while s33

else sto in fetch(execute-while s31 , l1)

Page 60: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

60Semantik och programteori

Utan typtaggarrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet s31 = update(s3, l1 ,1) in let execute-while sto =

let int1 = fetch (sto,l0) in if greater(int1 ,0)then let int2 = fetch (sto, l1 ) in

let s32 = update (sto, l1 , times(2,int2)) in let integer int3 = fetch (s32 , l0 ) in let s33 = update (s32 , l0 ,minus(int1,1)) in execute-while s33

else sto in fetch(execute-while s31 , l1)

Page 61: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

61Semantik och programteori

Än mer förenklatrun [program(input n :Integer,output p :Integer) ~ C5] v =

let (s1, l0) = allocate empty-store in let (s2, l1) = allocate s1 in let s3 = update (s2, l0 , v) inlet s31 = update(s3, l1 ,1) in let execute-while sto =

if greater(fetch (sto,l0) ,0)then let s32 = update (sto, l1 ,times(2, fetch (sto, l1 ))) in

let s33 = update (s32 , l0 ,minus(fetch (s32 , l0 ),1)) in execute-while s33

else sto in fetch(execute-while s31 , l1)

Page 62: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

62Semantik och programteori

Kontextuella restriktioner Av all meningar som genereras av programspråkets

grammatik är endast en del välformade program. De kontextuella restriktionerna är regler som avgör om ett givet program är välformat eller ej. De avgör också om enstaka programfraser är välformade eller ej.

let const m ~ 10in

‚ let var p : boolin

ƒ p := (m > 0) Omgivningar:

{}‚ {m integer-type}ƒ {m integer-type, p var truth-type}.

Page 63: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

63Semantik och programteori

BegränsningarTyp omgivning Dynamisk omgivning { } { }‚ { m integer-type} { m 10}ƒ { m integer-type, { m 10,

p var truth-type} p en variabel innehållande

ett truth-value}

Page 64: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

64Semantik och programteori

Denotationssemantik För varje programspråk definierar vi en domän Type, vars

element representerar typer i språket. Låt domänen för typ omgivning vara Type-Environ, med följande hjälp funktioner:

empty-environ : Type-Environbind : Identifier Type Type-Environoverlay : Type-Environ Type-Environ Type-Environfind : Type-Environ Identifier Type

Type-Environ = Identifier (bound Type + unbound)

Page 65: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

65Semantik och programteori

För språket IMP: Domän

Type = truth-type + integer-type + var Type + error-type

equivalent : Type Type Truth-Value

equivalent (typ1, typ2) = (typ1 = typ2)

Page 66: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

66Semantik och programteori

Semantiska funktionerconstrain : Command (Type-Environ Truth-Value)

typify : Expression (Type-Environ Value-Type)

declare : Declaration (Type-Environ Truth-Value Type-

Environ)

type-denoted-by : Type-Denoter Value-Type

Page 67: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

67Semantik och programteori

Constrainconstrain : Command (Type-Environ Truth-Value)constrain [skip] typenv = true

constrain [I := E] typenv =let typ = find (typenv, I) inlet typ' = typify E typenv inequivalent (typ, var typ')

constrain [let D in C] typenv =let (ok, typenv') = declare D typenv inif okthen constrain C (overlay (typenv', typenv))else false

Page 68: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

68Semantik och programteori

Constrain Fortsättningconstrain [C1 ; C2] typenv =

constrain C1 typenv constrain C2 typenv

constrain [if E then C1 else C2] typenv =equivalent (typify E typenv, truth-type) constrain C1 typenv constrain C2 typenv

constrain [while E do C] typenv =equivalent (typify E typenv, truth-type) constrain C typenv

Page 69: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

69Semantik och programteori

Typifytypify : Expression (Type-Environ Value-Type)typify [N] typenv = integer-type

typify [false] typenv = truth-type

typify [I] typenv =let value-type-of (truth-type) = truth-type

value-type-of (integer-type) = integer-typevalue-type-of (var typ) = typvalue-type-of (error-type) = error-type

invalue-type-of (find (typenv, I))

typify [E1 + E2] typenv =if equivalent (typify E1 typenv, integer-type)

equivalent (typify E2 typenv, integer-type)then integer-typeelse error-type

Page 70: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

70Semantik och programteori

Declaredeclare : Declaration ( Type-Environ

Truth-Value Type-Environ)declare [const I ~ E] typenv =

let typ = typify E typenv inif equivalent (typ, error-type)then (false, empty-environ)else (true, bind (I, typ))

declare [var I : T] typenv =let typ = type-denoted-by T in(true, bind (I, var typ))

Page 71: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

71Semantik och programteori

Type-denoted-bytype-denoted-by : Type-Denoter Value-Type

type-denoted-by [bool] = truth-type

type-denoted-by [int] = integer-type

Page 72: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

72Semantik och programteori

Resonera om program Genom att ge en rent matematisk mening åt varje program,

låter oss denotationssemantiken att etablera semantiska egenskaper hos program med hjälp av matematiskt resonemang.

Framförallt behöver vi ibland bevisa att två kommandon är semantiskt ekvivalenta. I så fall kan vi ersätta det ena kommandot med det andra i programtransformationer. Vi bevisar ekvivalens genom att visa att deras denotation är lika.

Page 73: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

73Semantik och programteori

Visa: C ; skip Cexecute [C ; skip] e s

= execute [skip] e (execute C e s)= execute C e s

Därför är execute [C ; skip] = execute C.

Page 74: Semantik och programteori 1 Tillämpning av denotationssemantik Semantiken hos ett större imperativt språk Semantik för kontextuella begränsningar Resonera

74Semantik och programteori

Bevis av Whilewhile E do C

if E then begin C ; while E do C end else skip

execute [begin C end] = execute C

execute[ if E then begin C ; while E do C end else skip] e s

= if evaluate E e s = truth-value truethen execute [begin C ; while E do C end] e selse execute [skip] e s

= if evaluate E e s = truth-value truethen execute [C ; while E do C] e selse s

= if evaluate E e s = truth-value truethen execute [while E do C] e (execute C e s)else s

= execute [while E do C] e s