Amortised Resource Analysis using Separation Logic Robert Atkey - - PowerPoint PPT Presentation

amortised resource analysis using separation logic
SMART_READER_LITE
LIVE PREVIEW

Amortised Resource Analysis using Separation Logic Robert Atkey - - PowerPoint PPT Presentation

Robert.Atkey@strath.ac.uk Amortised Resource Analysis using Separation Logic Robert Atkey University of Strathclyde 20th July 2017 Dagstuhl Seminar 17291 Resource Specification and Verification Programs execute. But not for free. How much


slide-1
SLIDE 1

Amortised Resource Analysis using Separation Logic

Robert Atkey

Robert.Atkey@strath.ac.uk

University of Strathclyde 20th July 2017 Dagstuhl Seminar 17291

slide-2
SLIDE 2

Resource Specification and Verification

Programs execute. But not for free. How much will it cost? How do we say how much it will cost?

slide-3
SLIDE 3

Specifying Resource Usage

Maybe we could attach sizes to things:

listn(x)

And then state the resource consumption in these terms:

{listn(x) ∧ rc = r1} iterateList {listn(x) ∧ rc = r1 + n}

How well does this work?

slide-4
SLIDE 4

Functional Queues

a b

Dequeue ( unit) Enqueue ( unit) Enqueue ( unit) Dequeue ( unit) Dequeue ( units) ( to reverse d c , to remove c) Total: units

slide-5
SLIDE 5

Functional Queues

b

▶ Dequeue (1 unit)

Enqueue ( unit) Enqueue ( unit) Dequeue ( unit) Dequeue ( units) ( to reverse d c , to remove c) Total: units

slide-6
SLIDE 6

Functional Queues

b c

▶ Dequeue (1 unit) ▶ Enqueue (1 unit)

Enqueue ( unit) Dequeue ( unit) Dequeue ( units) ( to reverse d c , to remove c) Total: units

slide-7
SLIDE 7

Functional Queues

b d c

▶ Dequeue (1 unit) ▶ Enqueue (1 unit) ▶ Enqueue (1 unit)

Dequeue ( unit) Dequeue ( units) ( to reverse d c , to remove c) Total: units

slide-8
SLIDE 8

Functional Queues

d c

▶ Dequeue (1 unit) ▶ Enqueue (1 unit) ▶ Enqueue (1 unit) ▶ Dequeue (1 unit)

Dequeue ( units) ( to reverse d c , to remove c) Total: units

slide-9
SLIDE 9

Functional Queues

d

▶ Dequeue (1 unit) ▶ Enqueue (1 unit) ▶ Enqueue (1 unit) ▶ Dequeue (1 unit) ▶ Dequeue (3 units) (2 to reverse [d, c], 1 to remove c)

Total: units

slide-10
SLIDE 10

Functional Queues

d

▶ Dequeue (1 unit) ▶ Enqueue (1 unit) ▶ Enqueue (1 unit) ▶ Dequeue (1 unit) ▶ Dequeue (3 units) (2 to reverse [d, c], 1 to remove c) ▶ Total: 7 units

slide-11
SLIDE 11

Specifying the Resource Behaviour

Using a ghost variable rc for consumed resources. Predicate queue(x, h, t)

▶ Queue pointed to by x; ▶ Head of length h, tail of length t

∀r1.{queue(x, h, t) ∧ rc = r1} enqueue {queue(x, h, t + 1) ∧ rc = r1 + R} ∀r1.{queue(x, 0, t) ∧ rc = r1} dequeue {queue(x, t − 1, 0) ∧ rc = r1 + (1 + t)R} ∀r1.{queue(x, h + 1, t) ∧ rc = r1} dequeue {queue(x, h, t) ∧ rc = r1 + R}

Exposes the internals of the queue abstraction.

slide-12
SLIDE 12

Amortised Analysis (Tarjan 1985)

a b

Dequeue ( unit) Enqueue ( units) Enqueue ( units) Dequeue ( unit) Dequeue ( unit) Total: units

slide-13
SLIDE 13

Amortised Analysis (Tarjan 1985)

b

▶ Dequeue (1 unit)

Enqueue ( units) Enqueue ( units) Dequeue ( unit) Dequeue ( unit) Total: units

slide-14
SLIDE 14

Amortised Analysis (Tarjan 1985)

b c

▶ Dequeue (1 unit) ▶ Enqueue (2 units)

Enqueue ( units) Dequeue ( unit) Dequeue ( unit) Total: units

slide-15
SLIDE 15

Amortised Analysis (Tarjan 1985)

b d c

▶ Dequeue (1 unit) ▶ Enqueue (2 units) ▶ Enqueue (2 units)

Dequeue ( unit) Dequeue ( unit) Total: units

slide-16
SLIDE 16

Amortised Analysis (Tarjan 1985)

d c

▶ Dequeue (1 unit) ▶ Enqueue (2 units) ▶ Enqueue (2 units) ▶ Dequeue (1 unit)

Dequeue ( unit) Total: units

slide-17
SLIDE 17

Amortised Analysis (Tarjan 1985)

d

▶ Dequeue (1 unit) ▶ Enqueue (2 units) ▶ Enqueue (2 units) ▶ Dequeue (1 unit) ▶ Dequeue (1 unit)

Total: units

slide-18
SLIDE 18

Amortised Analysis (Tarjan 1985)

d

▶ Dequeue (1 unit) ▶ Enqueue (2 units) ▶ Enqueue (2 units) ▶ Dequeue (1 unit) ▶ Dequeue (1 unit) ▶ Total: 7 units

slide-19
SLIDE 19

Where Do Resources Live?

Tarjan: associate the extra resources for enqueue with the nodes. Banker’s method. When accessing that node we get to use the resources. Applied to functional languages by Hofmann and Jost (2003).

slide-20
SLIDE 20

Where Do Resources Live?

a b

Dequeue ( unit) ( real unit) Enqueue ( units) ( real unit) Enqueue ( units) ( real unit) Dequeue ( unit) ( real unit) Dequeue ( unit) ( real units) Total: units

slide-21
SLIDE 21

Where Do Resources Live?

b

▶ Dequeue (1 unit)

(1 real unit) Enqueue ( units) ( real unit) Enqueue ( units) ( real unit) Dequeue ( unit) ( real unit) Dequeue ( unit) ( real units) Total: units

slide-22
SLIDE 22

Where Do Resources Live?

b c

R

▶ Dequeue (1 unit)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit) Enqueue ( units) ( real unit) Dequeue ( unit) ( real unit) Dequeue ( unit) ( real units) Total: units

slide-23
SLIDE 23

Where Do Resources Live?

b d

R

c

R

▶ Dequeue (1 unit)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit) Dequeue ( unit) ( real unit) Dequeue ( unit) ( real units) Total: units

slide-24
SLIDE 24

Where Do Resources Live?

d

R

c

R

▶ Dequeue (1 unit)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Dequeue (1 unit)

(1 real unit) Dequeue ( unit) ( real units) Total: units

slide-25
SLIDE 25

Where Do Resources Live?

d

▶ Dequeue (1 unit)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Dequeue (1 unit)

(1 real unit)

▶ Dequeue (1 unit)

(3 real units) Total: units

slide-26
SLIDE 26

Where Do Resources Live?

d

▶ Dequeue (1 unit)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Enqueue (2 units)

(1 real unit)

▶ Dequeue (1 unit)

(1 real unit)

▶ Dequeue (1 unit)

(3 real units)

▶ Total: 7 units

slide-27
SLIDE 27

Consumable Resources

Let’s assume that resources are a commutative, ordered monoid.

slide-28
SLIDE 28

Separation Logic with Consumable Resources

list(n, x) ≡

x = null ∧ emp

∨ ∃yz. [x data → y] ∗ [x next → z] ∗ Rn ∗ list(n, z)

H r

a

R

b

R

c

R

d

R r, H | = list(1, x)

slide-29
SLIDE 29

Separation Logic with Consumable Resources

list(n, x) ≡

x = null ∧ emp

∨ ∃yz. [x data → y] ∗ [x next → z] ∗ Rn ∗ list(n, z)

H1 r1 H2 r2

a

R

b

R

c

R

d

R r1 · r2, H1 ⊎ H2 | = [x data

→ a] ∗ [x next → y] ∗ R ∗ list(1, y)

slide-30
SLIDE 30

Separation Logic with Consumable Resources

list(n, x) ≡

x = null ∧ emp

∨ ∃yz. [x data → y] ∗ [x next → z] ∗ Rn ∗ list(n, z)

H1 H2 r2

A b

R

c

R

d

R After some mutation and resource consumption.

slide-31
SLIDE 31

Specifying Resources and Heap Shape

queue(x) ≡ ∃yz.[x front → y] ∗ [x back → z] ∗ list(0, y) ∗ list(1, z) {queue(x) ∗ R ∗ R}enqueue{queue(x)} {queue(x) ∗ R}dequeue{queue(x)}

Precondition specifies: Heap shape required Resources required

}

Two may be intertwined

slide-32
SLIDE 32

It’s all intertwingly

Reasoning follows Innumerate Shepherd model

▶ Numbers and arithmetic are abstract nonsense! ▶ Structure matters

Resources are made available as they are needed to process the data they are attached to. Integrates well with the local reasoning of Separation Logic.

slide-33
SLIDE 33

Assertion Language

ϕ ::=

t1 ▷

◁ t2 | ⊤ | ϕ1 ∧ ϕ2 | ϕ1 ∨ ϕ2 | ϕ1 → ϕ2 | emp | ϕ1 ∗ ϕ2 | ϕ1 — ∗ϕ2 | ∀x.ϕ | ∃x.ϕ | [t1

f

→ t2] | Rr | . . .

slide-34
SLIDE 34

Semantic Domains

Logic is defined over pairs x = (H, r). Use a ternary relation to define how resources and heaps are combined: Rxyz ⇔ H1#H2 ∧ H1 ⊎ H2 = H3 ∧ r1 · r2 ⊑ r3 where x = (H1, r1), y = (H2, r2), z = (H3, r3) Extend the order on resources to pairs of heaps and resources by

(H1, r1) ⊑ (H2, r2) iff H1 = H2 and r1 ⊑ r2.

slide-35
SLIDE 35

Semantics of Assertions

x = (H, r)

η, x |

=

iff always

η, x |

= t1 {=, ̸=} t2 iff

t1η {=, ̸=} t2η η, x |

=

emp

iff x = (H, r) and H = {}

η, x |

=

[t1

f

→ t2]

iff x = (H, r) and H = {(t1η, f) → t2η}

η, x |

= Rri iff x = (H, r) and ri ⊑ r and H = {}

η, x |

=

ϕ1 ∧ ϕ2

iff

η, x |

= ϕ1 and η, x | = ϕ2

η, x |

=

ϕ1 ∨ ϕ2

iff

η, x |

= ϕ1 or η, x | = ϕ2

η, x |

=

ϕ1 ∗ ϕ2

iff exists y, z. st. Ryzx and η, y | = ϕ1 and η, z | = ϕ2

η, x |

=

ϕ1 → ϕ2

iff for all y. if x ⊑ y and η, y | = ϕ1 then η, y | = ϕ2

η, x |

=

ϕ1 — ∗ϕ2

iff for all y, z. if Rxyz and η, y | = ϕ1 then η, z | = ϕ2

η, x |

=

∀v.ϕ

iff for all a, η[v → a], x | = ϕ

η, x |

=

∃v.ϕ

iff exists a, η[v → a], x | = ϕ

slide-36
SLIDE 36

Examples of Inductive Predicates

List segments:

lseg(n, x, y) ≡

x = y ∧ emp

∨ ∃d, z. [x data → d] ∗ [x next → z] ∗ Rn ∗ lseg(n, z, y)

Doubly-linked lists:

dlseg n p x y

x y

emp

z x next z x

prev p

Rn

dlseg n x z y

Trees:

tree n x

x null

emp

y z x left y x

right z

Rn

tree y tree z

slide-37
SLIDE 37

Examples of Inductive Predicates

List segments:

lseg(n, x, y) ≡

x = y ∧ emp

∨ ∃d, z. [x data → d] ∗ [x next → z] ∗ Rn ∗ lseg(n, z, y)

Doubly-linked lists:

dlseg(n, p, x, y) ≡

x = y ∧ emp

∨ ∃z. [x next → z] ∗ [x

prev

→ p] ∗ Rn ∗ dlseg(n, x, z, y)

Trees:

tree n x

x null

emp

y z x left y x

right z

Rn

tree y tree z

slide-38
SLIDE 38

Examples of Inductive Predicates

List segments:

lseg(n, x, y) ≡

x = y ∧ emp

∨ ∃d, z. [x data → d] ∗ [x next → z] ∗ Rn ∗ lseg(n, z, y)

Doubly-linked lists:

dlseg(n, p, x, y) ≡

x = y ∧ emp

∨ ∃z. [x next → z] ∗ [x

prev

→ p] ∗ Rn ∗ dlseg(n, x, z, y)

Trees:

tree(n, x) ≡

x = null ∧ emp

∨ ∃y, z. [x left → y] ∗ [x

right

→ z] ∗ Rn ∗ tree(y) ∗ tree(z)

slide-39
SLIDE 39

Polynomial bounds

Hoffmann and Hofmann’s polynominal bounds can be represented:

▶ Annotations are ⟨p1, ..., pn⟩ ▶ List of length n has ∑k i=1

(n

i

)

pi associated resource.

lseg(− →

p , x, z) ≡ x = z ∧ emp

∨∃y. [x next → y] ∗ Rp1 ∗ lseg(◁(− →

p ), y, z) where ◁(−

p ) = (p1 + p2, p2 + p3, ..., pk−1, pk) is the additive shift.

slide-40
SLIDE 40

Data Dependency

Data-dependency (resources only available for non-0 elements):

lseg̸=0(r, x, y) ≡ (x = y ∧ emp) ∨(∃d, z. [x data → d] ∗ [x next → z] ∗ (d ̸= 0 → Rr) ∗ lseg̸=0(r, z, y))

Compare to explicit resource counting version:

lseg(l, x, y) ∧ r = length(filter(λx.x ̸= 0, l))

slide-41
SLIDE 41

Numerical Bounds not Excluded

Can still write:

listn(x) ∗ Rn

Where Rn ≡ (n = 0 ∧ emp) ∨ (R ∗ Rn−1) But lose the advantages of locality.

slide-42
SLIDE 42

Formal Development in Coq

▶ Subset of Java bytecode (w/o virtual methods or exceptions) ▶ Standard semantics + abstract costs ▶ Resources consumed by consume instruction

Layered approach to program logic:

▶ Shallow embedding (uses Coq as assertion logic) ▶ Deep embedding on top (formalised assertion logic in Coq) ▶ Verification condition generator

Proved (formally!):

▶ Soundness of the logic ▶ Certified verification condition generator

slide-43
SLIDE 43

Semantics and Soundness (simplified)

Given program P

▶ State is a triple ⟨r, H, frm⟩. ▶ Small step semantics: P ⊢ ⟨r, H, frm⟩ → ⟨r′, H′, frm′⟩.

Given certificate C : offsets(P) → Assn:

safeState(⟨r, H, frm⟩, rtotal) ≡ ∃rfuture. r ∗ rfuture ⊑ rtotal ∧ (rfuture, H) |

= C(pc(frm)) Proved (if certificate is OK):

▶ safeState is preserved by steps; ▶ On termination, consumed resources are less than rtotal.

slide-44
SLIDE 44

Automated Verification

Two possible ways:

▶ Generate Verification Conditions, try to prove them ▶ Symbolic execution approach

Did the first for expository reasons; second is more popular for Separation Logic. Method and implementation are proof of concept; basic idea can be reused with other automated verification techniques.

slide-45
SLIDE 45

Generating Verification Conditions

Verification conditions can be generated for methods by weakest precondition.

wp(consume(R), pc) =

R ∗ C(pc + 1)

wp(return, pc) =

Q

wp(goto n, pc) =

C(n)

wp(ifnull n, pc) = (s0 = null → C(n)) ∧ (s0 ̸= null → C(pc + 1)) wp(call pname, pc) =

P′ ∗ (Q′ —

∗C(pc + 1))

where:

▶ Q is post condition of current method; ▶ (P′, Q′) is the specification of pname. ▶ C is pre-seeded with loop invariants

Frame rule is implicit in procedure call rule.

slide-46
SLIDE 46

Solving Verification Conditions

Restricted form of assertion (closed under VC generation): Restriction: only allows linear resource bounds. Data: P := t1 = t2 | t1 ̸= t2 | ⊤ Heap: X := [t1

f

→ t2] | lseg(Θ, t1, t2) | emp

Resource: R := Rr | ⊤ Data:

Π := P1, ..., Pn

(P1 ∧ ... ∧ Pn) Heap:

Σ := X1, ..., Xn

(X1 ∗ ... ∗ Xn) Resource:

Θ := R1, ..., Rn

(R1 ∗ ... ∗ Rn) S :=

i

(Π ∧ (Σ ∗ Θ))

G

:=

S ∗ G | S —

∗G | S | G1 ∧ G2 | P → G | ∀x.G | ∃x.G

slide-47
SLIDE 47

Solving Verification Conditions

Proof search, using I/O model of Cervesato, Hodas and Pfenning. Main judgement: Π|Σ|Θ ⊢ G. Auxilliary judgements:

Π|Σ|Θ ⊢ Σ1\Σ2, Θ′

Heap assertion matching

Θ ⊢ Θ1\Θ2

Resource matching

Π ⊢ ⊥

Contradiction spotting

Π ⊢ Π′

Data entailment

slide-48
SLIDE 48

Proof Search

Three phases, repeat until done:

▶ Goal driven, switching on the shape of the goal; ▶ Saturate the context

▶ Infer facts from context members ▶ Unfold list predicates according to heuristics

▶ Look for contradictions

With possible backtracking. Example goal-directed rule:

exists i. Π|Σ|Θ ⊢ Σi\Σ′, Θ′ Π ⊢ Πi Θ′ ⊢ Θi\Θ′′ Π|Σ′|Θ′′ ⊢ G Π|Σ|Θ ⊢ ∨

i

(Πi ∧ (Σi ∗ Θi)) ∗ G

slide-49
SLIDE 49

Resource Annotation Inference

This approach requires that we know the resource amounts to annotate

  • ur lists with beforehand.

Better to infer them (as with Hofmann and Jost’s system).

  • 1. Replace all resource elements with linear expressions.
  • 2. Resource matching rule generates linear constraints:

e1 ⊢ e2\e1 − e2, e2 ≤ e1

  • 3. Solve using standard LP solver (GLPK).
slide-50
SLIDE 50

Frying Pan List Reversal

a b c d e f

▶ Handle: a, b, c ▶ Pan: d, e, f.

∃k.lseg(p1, v0, v1) ∗ [v1

next

→ k] ∗ lseg(p2, k, v1) ∗ Rp3

slide-51
SLIDE 51

Frying Pan List Reversal

a

2

b

2

c

2

d

1

e

1

f

1

slide-52
SLIDE 52

Frying Pan List Reversal

a

1

b

1

c

2

d

1

e

1

f

1

slide-53
SLIDE 53

Frying Pan List Reversal

a

1

b

1

c

1

d e

1

f

1

slide-54
SLIDE 54

Frying Pan List Reversal

a

1

b

1

c

1

d e f

slide-55
SLIDE 55

Frying Pan List Reversal

a

1

b

1

c d e f

slide-56
SLIDE 56

Frying Pan List Reversal

a b c d e f

slide-57
SLIDE 57

Frying Pan List Reversal

Loop invariant (Brotherston, Bornat and Calcagno):

(∃k.lseg(a1, l0, v1) ∗ lseg(a2, l1, null) ∗ [v1

next

→ k] ∗ lseg(a3, k, v1) ∗ Ra4) ∨ (∃k.lseg(b1, k, null) ∗ [j next → k] ∗ lseg(b2, l0, v1) ∗ lseg(b3, l1, j) ∗ Rb4) ∨ (∃k.lseg(c1, l0, null) ∗ lseg(c2, l1, v1) ∗ [v1

next

→ k] ∗ lseg(c3, k, v1) ∗ Rc4)

Corresponds to the three phases. Annotated with variables for resources, to be filled in by linear program solver.

slide-58
SLIDE 58

Frying Pan List Reversal

After constraint solving: Pre-condition p1 = 2 p2 = 1 p3 = 2 Loop invariant, phase 1 a1 = 2 a2 = 1 a3 = 1 a4 = 2 Loop invariant, phase 2 b1 = 1 b2 = 1 b3 = 0 b4 = 1 Loop invariant, phase 3 c1 = 1 c2 = 0 c3 = 0 c4 = 0 Post-condition x′

1 = 0

x′

2 = 0

x′

3 = 0

slide-59
SLIDE 59

Further Examples

▶ List iteration ▶ (Non-cyclic) list reversal ▶ List copying ▶ Tree copying/mirroring ▶ Inner loop of in-place merge sort

slide-60
SLIDE 60

More connectives?

The current logic has separating conjunction: X ∗ Y meaning that X and Y use separate heap and separate resources. What about another two connectives:

▶ Separate heap, but not resources ▶ Separate resources, but not heap

Need for “separate resource, but not heap” has shown up in small examples already.

slide-61
SLIDE 61

Conclusions

Amortised resource analysis and Separation Logic are practically made for each other. Attaching resources to data structures:

▶ eases specification; ▶ eases verification. ▶ Also: data dependent resources; resource aquisition;

Future:

▶ Systematic production of inductive predicates with resources ▶ Integrate with automated Separation Logic tools ▶ Certifying compilation of RAML ▶ Need a good account of read only (“passive”) assertions ▶ Higher-order separation logic; concurrent separation logic