Separation logic
Adding the heap
- memory writes ,
[E1]:=E2
- memory reads,
x:=[E]
- memory allocation,
x:=cons(E1,⋯,En)
- memory deallocation,
disopose E
stack:var−>value
heap:loc−>value
loc⊆value
Operational semantics
x:=E/(s,h)→skip/(s[x:=v],h)E/s→v
x:=[E]/(s,h)→skip/(s[x:h(v)],h)E/s→v
[E1]:=E2/(s,h)→skip/(s,h[v1:=v2)])E1/s→v1 E2/s→v
x:cons(E1,⋯,En)/(s,h)→skip/(s[x:v],h⊕ v:=v1,⋯v+(n−1):=vnE1/s→v1 ⋯En/s→vn v⋯v+(n−1)∈/dom(h)
disposeE/(s,h)→skip/(s,h\v)E/s→v
Remark:h[v:v′] and h\varedefinedonlyifv∈dom(h)
Frame
{R∗P}C{Q∗R}{P}C{Q}
statements of separation logic
P,Q::=T true∣¬P ∣P∧Q∣P∨Q∣S ∣P∗Q∣E1↦E2∣empty
(s,h)⊨empty iff dom(h)=∅
(s,h)⊨E1↦E2 iff E1/s→v1∧E2/s→v2∧dom(h)=v1∧h(v1)=v2(s,h)⊨P∗Q iff∃h1,h2.dom(h1)∩dom(h2)=∅∧h1⊕h2=h∧(s,h1)⊨P∧(s,h2)⊨Q
Date types:list
-
list [] x≡empty∧x=nil
-
list v1::α x≡∃j.x↦v1(X+1↦j)∗list α j
Data types :list segment
-
lseg [] (x,y)≡empty∧x=y
-
lseg v::α(x,y)≡∃j.x↦v∗(x+1↦j)∗lseg α(j,y)
Exercise: prove,by structural induction on
α,that:
lseg α⋅β⟺ ∃ j.lseg α(x,y)∗lseg β(j,y)
(Local)axioms
- write :
{E↦_}[E]=E′{E↦E′}
- dispose:
{E↦_}dispose(E){empty}
- alloc:
{empty}x=cons(E1,…,En){x↦E1∗x+1↦E2∗…x+(n−1)↦en}
Exercises:prove that:
{lseg α(i,j)∗j↦a,k}k:cons(a,i);i:=k{lseg a⋅α(i,j)}{lseg α(i,j)∗j↦a,k}l:=cons(b,k);[j+1]=l{lseg α⋅a⋅b(i,k)}{lseg a⋅α(i,k)}j:=[i+1];dispose i;dispose i+1;i:=j {lseg α(i,k)}
Remember:
lseg [] (x,y)≡empty∧x=y
lseg v::α(x,y)≡∃j.x↦v∗(x+1↦j)∗lseg α(j,y)
Notation :
j↦a,k stands for
j↦a∗j+1↦k