Separation logic

限于喜欢 提交于 2019-12-19 23:54:58

Separation logic

Adding the heap

  • memory writes , [E1]:=E2[E_1]:=E_2
  • memory reads, x:=[E]x:=[E]
  • memory allocation,x:=cons(E1,,En)x:=cons(E_1,\cdots,E_n)
  • memory deallocation,disopose Edisopose\ E
    stack:var>valuestack :var->value
    heap:loc>valueheap :loc->value
    locvalueloc \subseteq value

Operational semantics

E/svx:=E/(s,h)skip/(s[x:=v],h){E/s \to v \over x:=E/(s,h) \to skip/(s[x:=v],h)}
E/svx:=[E]/(s,h)skip/(s[x:h(v)],h){E/s \to v \over x:=[E]/(s,h) \to skip/(s[x:h(v)],h) }
E1/sv1 E2/sv[E1]:=E2/(s,h)skip/(s,h[v1:=v2)]){E_1/s \to v_1 \ E_2/s \to v \over [E_1]:=E_2/(s,h)\to skip /(s,h[v1:=v2)])}
E1/sv1 En/svn    vv+(n1)dom(h)x:cons(E1,,En)/(s,h)skip/(s[x:v],h v:=v1,v+(n1):=vn{E_1/s \to v_1 \ \cdots E_n/s \to v_n \ \ \ \ v \cdots v+(n-1)\notin dom(h) \over x:cons(E_1,\cdots,E_n)/(s,h)\rightarrow skip/(s[x:v],h\oplus \ v:=v1,\cdots v+(n-1):=v_n}
E/svdisposeE/(s,h)skip/(s,h\v){E/s \to v \over dispose E/(s,h) \to skip /(s,h\backslash v)}
Remark:h[v:v] and h\varedefinedonlyifvdom(h)\bm {Remark}: h[v:v'] \ and \ h\backslash v are defined only if v \in dom(h)

Frame

{P}C{Q}{RP}C{QR}\{P\}C\{Q\} \over \{R*P\}C\{Q*R\}

statements of separation logic

P,Q::=T   true¬P     PQPQS        PQE1E2emptyP,Q :: =T \ \ \ true \\ | \lnot P \ \ \ \ \ \\ | P \land Q\\ | P \lor Q \\ | S \ \ \ \ \ \ \ \ \\ \\ | P*Q\\ | E_1\mapsto E_2\\ | empty
(s,h)empty iff dom(h)=(s,h) \vDash empty\ iff \ dom(h) = \varnothing
(s,h)E1E2 iff E1/sv1E2/sv2dom(h)=v1h(v1)=v2(s,h)PQ iffh1,h2.dom(h1)dom(h2)=h1h2=h(s,h1)P(s,h2)Q(s,h) \vDash E_1 \mapsto E_2 \ iff \ E_1/s \to v_1 \land E_2/s \to v_2 \land dom(h) = v_1 \land h(v_1)=v_2 \\ (s,h) \vDash P*Q \ iff \\ \exists h_1,h_2.dom(h_1) \cap dom(h_2) = \varnothing \land h_1 \oplus h_2 =h \land (s,h_1) \vDash P \land (s,h_2) \vDash Q

Date types:list

  • list [] xemptyx=nillist \ []\ x \equiv empty \land x = nil
  • list v1::α xj.xv1(X+1j)list α jlist \ v_1:: \alpha \ x \equiv \exists j.x \mapsto v_1(X+1 \mapsto j)*list \ \alpha \ j

Data types :list segment

  • lseg [] (x,y)emptyx=ylseg \ []\ (x,y) \equiv empty \land x=y
  • lseg v::α(x,y)j.xv(x+1j)lseg α(j,y)lseg \ v::\alpha(x,y) \equiv \exists j.x \mapsto v*(x+1\mapsto j)* lseg \ \alpha(j,y)

Exercise: prove,by structural induction on α\alpha,that:

lseg αβ      j.lseg α(x,y)lseg β(j,y)lseg \ \alpha \cdot \beta \iff \ \exists\ j.lseg \ \alpha(x,y)*lseg\ \beta(j,y)

(Local)axioms

  • write : {E_}[E]=E{EE}\{E \mapsto \_ \} [E] =E'\{E \mapsto E'\}
  • dispose: {E_}dispose(E){empty}\{E \mapsto \_\}dispose(E)\{empty\}
  • alloc:{empty}x=cons(E1,,En){xE1x+1E2x+(n1)en}\{empty\}x =cons(E_1,\ldots,E_n)\{x \mapsto E_1 *x+1 \mapsto E_2* \ldots x +\\(n-1) \mapsto e_n\}

Exercises:prove that:

{lseg α(i,j)ja,k}k:cons(a,i);i:=k{lseg aα(i,j)}{lseg α(i,j)ja,k}l:=cons(b,k);[j+1]=l{lseg αab(i,k)}{lseg aα(i,k)}j:=[i+1];dispose i;dispose i+1;i:=j {lseg α(i,k)}\{lseg \ \alpha(i,j)*j \mapsto a,k\}k:cons(a,i);i:=k \{ lseg \ a \cdot \alpha(i,j)\} \\ \{lseg \ \alpha(i,j)*j \mapsto a,k\}l:=cons(b,k);[j+1]=l \{ lseg \ \alpha \cdot a \cdot b(i,k)\} \\ \{lseg \ a \cdot \alpha(i,k)\} j:=[i+1];dispose \ i ; dispose \ i+1; i:=j \ \{lseg \ \alpha(i,k)\}

Remember:

lseg [] (x,y)emptyx=ylseg \ [] \ (x,y) \equiv empty \land x=y
lseg v::α(x,y)j.xv(x+1j)lseg α(j,y)lseg \ v::\alpha(x,y) \equiv \exists j.x \mapsto v*(x+1 \mapsto j)* lseg \ \alpha(j,y)
Notation : ja,kj \mapsto a,k stands for jaj+1kj \mapsto a*j+1 \mapsto k

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!