Top Banner
Reconciling Exhaustive Pattern Matching with Objects Chin Isradisaikul Andrew Myers [email protected] [email protected] Department of Computer Science, Cornell University j Ithaca, NY PLDI 2013 j Wed, June 19, 2013 j Seattle, WA Reconciling Exhaustive Pattern Matching with Objects 1/28
47

Chin Isradisaikul Andrew Myers [email protected] ... · [email protected] [email protected] Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Jul 12, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Reconciling Exhaustive Pattern Matching with Objects

Chin Isradisaikul Andrew [email protected] [email protected]

Department of Computer Science, Cornell University j Ithaca, NY

PLDI 2013 jWed, June 19, 2013 j Seattle, WA

Reconciling Exhaustive Pattern Matching with Objects 1/28

Page 2: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

This paper

integrating

pattern matching(makes code concise & safer)

with

object-orientedprogramming

(helps software scale)

Reconciling Exhaustive Pattern Matching with Objects 2/28

Page 3: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Pattern matching in OCaml: concise & safer code

type list = Nil | Cons of int * list

match l with

| Nil -> ...

| Cons(x1, Cons(x2, l’)) -> ...

| Cons(x1, Cons(x2, Cons(x3, l’))) -> ...

list D Nil ] ConsCons : int � list! list

Cons�1 : list! int � list

Exhaustiveness: Cons(17, Nil) not matched! warningNonredundancy: Third arm unnecessary! warning

Reconciling Exhaustive Pattern Matching with Objects 3/28

Page 4: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Object-oriented programming: flexible & scalable

data abstractionList

NilList ConsList SnocList ArrayList

[ ]

multiple implementationsswitch (l) { // Want this!

case Nil(): ...case Cons(int x1, Cons(int x2, List tl)): ...case Cons(int x1, Cons(int x2, Cons(int x3, List tl))): ...}

Reconciling Exhaustive Pattern Matching with Objects 4/28

Page 5: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Have your cake and eat it too?

Problem statement

Can we satisfy all these goals without violating data abstraction?

1 implementation-oblivious pattern matching2 verification of exhaustive and nonredundant pattern matching

Reconciling Exhaustive Pattern Matching with Objects 5/28

Page 6: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Comparison: prior & our approaches

approach data

abstr

actio

n

cons

tructo

rsus

able

aspa

ttern

s

multipl

e impls

ofda

tatyp

es

exha

ustiv

enes

s chec

k

ML pattern matching X Xviews [W 87] Xactive patterns in F# [SNM 07] X Xextractors [EOW 07] X X Xsealed classes in Scala [OSV 08] X XJMatch 1.1.6 [LM 03] X X XJMatch 2.0 X X X X

Reconciling Exhaustive Pattern Matching with Objects 6/28

Page 7: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Modal abstraction in JMatch 1.1.6

list Cons in ~Java:hd tl

Cons W int � list! list

Cons(int x, List l) {

this.hd = x;this.tl = l;

}

Cons�1 W list! int � list

(int * List) cons() {

return (this.hd, this.tl);}

Different views of the same relation:

f.this; x; l/ 2 Cons � int � List j this:hd D x ^ this:tl D lg

JMatch 1.1.6:

Cons(int x, List l) returns(x, l) (this.hd = x && this.tl = l

)

Reconciling Exhaustive Pattern Matching with Objects 7/28

Page 8: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Modal abstraction in JMatch 1.1.6

list Cons in ~Java:hd tl

Cons W int � list! list

Cons(int x, List l) {

this.hd = x;this.tl = l;

}

Cons�1 W list! int � list

(int * List) cons() {

return (this.hd, this.tl);}

Different views of the same relation:

f.this; x; l/ 2 Cons � int � List j this:hd D x ^ this:tl D lg

JMatch 1.1.6:

Cons(int x, List l) returns(x, l) (this.hd = x && this.tl = l

)

Reconciling Exhaustive Pattern Matching with Objects 7/28

Page 9: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Modal abstraction in JMatch 1.1.6

list Cons in ~Java:hd tl

Cons W int � list! list

Cons(int x, List l) {

this.hd = x;this.tl = l;

}

Cons�1 W list! int � list

(int * List) cons() {

return (this.hd, this.tl);}

Different views of the same relation:

f.this; x; l/ 2 Cons � int � List j this:hd D x ^ this:tl D lg

JMatch 1.1.6:

Cons(int x, List l) returns(x, l) (this.hd = x && this.tl = l

)

Reconciling Exhaustive Pattern Matching with Objects 7/28

Page 10: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Modal abstraction in actionCons(int x, List l) returns(x, l) (this.hd = x && this.tl = l

)

// forward mode

let List l = Cons(hd, tl);// backward mode

let l = Cons(int hd, List tl);

List l0 = Nil(); // l0 = []

List l1 = Cons(17, l0); // l1 = [17; []]

List l2 = Cons(42, l1); // l2 = [42; [17; []]]

switch (l2) {case Nil(): ...case Cons(int x1, List l): ... // x1 7! 42, l 7! [17; []]

case Cons(int x1, Cons(int x2, List l)): ...} // x1 7! 42, x2 7! 17, l 7! Nil()

Reconciling Exhaustive Pattern Matching with Objects 8/28

Page 11: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Have your cake and eat it too?

Problem statement

Can we satisfy all these goals without violating data abstraction?

1 implementation-oblivious pattern matching2 verification of exhaustive and nonredundant pattern matching

Reconciling Exhaustive Pattern Matching with Objects 9/28

Page 12: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Implementation-oblivious pattern matching

// JMatch 1.1.6

Cons(int x, List l) returns(x, l) (this.hd = x && this.tl = l

)

Problem: Cons constructors belong to the Cons class.

Solution: Declare Cons independently of implementations.

Reconciling Exhaustive Pattern Matching with Objects 10/28

Page 13: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

JMatch 2.0 — Constructors in interfacesConstructors can be declared in interfaces:

interface List {constructor nil() returns();constructor cons(int x, List l) returns(x, l);

}

class Nil implements List {public constructor nil() returns() ( true )public constructor cons(int x, List l)returns(x, l) ( false )

}

class Cons implements List {int hd; List tl;

public constructor nil() returns() ( false )public constructor cons(int x, List l)returns(x, l) ( this.hd = x && this.tl = l )

}

Reconciling Exhaustive Pattern Matching with Objects 11/28

Page 14: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

JMatch 2.0 — Constructors in interfacesConstructors can be declared in interfaces:

interface List {constructor nil() returns();constructor cons(int x, List l) returns(x, l);

}

class Nil implements List {public constructor nil() returns() ( true )public constructor cons(int x, List l)returns(x, l) ( false )

}

class Cons implements List {int hd; List tl;

public constructor nil() returns() ( false )public constructor cons(int x, List l)returns(x, l) ( this.hd = x && this.tl = l )

}

Reconciling Exhaustive Pattern Matching with Objects 11/28

Page 15: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Another List implementation

snoc list:hd tl

class Snoc implements List {List hd;

int tl;

public constructor nil() returns() ( false )public constructor cons(int x, List l) returns(x, l) (

l = nil() && this.hd = l && this.tl = x

| l = Snoc(List lhd, int ltl)

&& this.hd = cons(x, lhd) && this.tl = ltl)

Snoc(List l, int x) returns(l, x) (this.hd = l && this.tl = x

)

}

lhd ltl

x l

hd tl

Reconciling Exhaustive Pattern Matching with Objects 12/28

Page 16: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Another List implementation

snoc list:hd tl

class Snoc implements List {List hd;

int tl;

public constructor nil() returns() ( false )public constructor cons(int x, List l) returns(x, l) (

l = nil() && this.hd = l && this.tl = x

| l = Snoc(List lhd, int ltl)

&& this.hd = cons(x, lhd) && this.tl = ltl)

Snoc(List l, int x) returns(l, x) (this.hd = l && this.tl = x

)

}

lhd ltl

x l

hd tl

Reconciling Exhaustive Pattern Matching with Objects 12/28

Page 17: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Another List implementation

snoc list:hd tl

class Snoc implements List {List hd;

int tl;

public constructor nil() returns() ( false )public constructor cons(int x, List l) returns(x, l) (

l = nil() && this.hd = l && this.tl = x

| l = Snoc(List lhd, int ltl)

&& this.hd = cons(x, lhd) && this.tl = ltl)

Snoc(List l, int x) returns(l, x) (this.hd = l && this.tl = x

)

}

lhd ltl

x l

hd tl

Reconciling Exhaustive Pattern Matching with Objects 12/28

Page 18: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Another List implementation

snoc list:hd tl

class Snoc implements List {List hd;

int tl;

public constructor nil() returns() ( false )public constructor cons(int x, List l) returns(x, l) (

l = nil() && this.hd = l && this.tl = x

| l = Snoc(List lhd, int ltl)

&& this.hd = cons(x, lhd) && this.tl = ltl)

Snoc(List l, int x) returns(l, x) (this.hd = l && this.tl = x

)

}

lhd ltl

x l

hd tl

Reconciling Exhaustive Pattern Matching with Objects 12/28

Page 19: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

JMatch 2.0 — Equality constructors

l = Snoc(List lhd, int ltl)

l.equals(Snoc(List lhd, int ltl)) // equals multimodal

Problem: l is nonempty but might not be a Snoc.

Solution:

• Convert l into a Snoc first (always succeeds).• Do this implicitly; don’t bother programmer.

Equality constructors specify how the conversion should be done.

public constructor equals(List l) (l = cons(int lhd, List ltl) && cons(lhd, ltl)

)

Reconciling Exhaustive Pattern Matching with Objects 13/28

Page 20: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Have your cake and eat it too?

Problem statement

Can we satisfy all these goals without violating data abstraction?

1 implementation-oblivious pattern matching X2 verification of exhaustive and nonredundant pattern matching

Reconciling Exhaustive Pattern Matching with Objects 14/28

Page 21: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Checking exhaustiveness and nonredundancy

interface List {constructor nil() returns();constructor cons(int x, List l) returns(x, l);

}

switch (l) {case nil(): ...case cons(int hd, List tl): ...}

1 switch exhaustive?2 Any case redundant?

Reconciling Exhaustive Pattern Matching with Objects 15/28

Page 22: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Invariants1 nil and cons can construct every List.2 No value can be constructed by both nil and cons.

List D nil ] cons

| represents disjoint disjunction:

invariant(this = nil() | this = cons(_, _));

| for disjoint patterns:

invariant(this = nil() | cons(_, _));

Add invariants to interfaces.

Reconciling Exhaustive Pattern Matching with Objects 16/28

Page 23: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Invariants1 nil and cons can construct every List.2 No value can be constructed by both nil and cons.

List D nil ] cons

| represents disjoint disjunction:

invariant(this = nil() | this = cons(_, _));

| for disjoint patterns:

invariant(this = nil() | cons(_, _));

Add invariants to interfaces.

Reconciling Exhaustive Pattern Matching with Objects 16/28

Page 24: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Invariants1 nil and cons can construct every List.2 No value can be constructed by both nil and cons.

List D nil ] cons

| represents disjoint disjunction:

invariant(this = nil() | this = cons(_, _));

| for disjoint patterns:

invariant(this = nil() | cons(_, _));

Add invariants to interfaces.

Reconciling Exhaustive Pattern Matching with Objects 16/28

Page 25: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Invariants not enough

interface List {constructor nil() returns();constructor cons(int x, List l) returns(x, l);constructor snoc(List l, int x) returns(l, x);

}

switch (l) {case nil(): ...case snoc(List hd, int tl): ...}

1 switch exhaustive?2 Any case redundant?

Reconciling Exhaustive Pattern Matching with Objects 17/28

Page 26: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Matching precondition

Know: exhaustiveness ofswitch (l) {case nil(): ...case cons(int hd, List tl): ...}

Want: exhaustiveness ofswitch (l) {case nil(): ...case snoc(List hd, int tl): ...}

If cons matches , snoc matches.

matching precondition this = cons(_, _)

Reconciling Exhaustive Pattern Matching with Objects 18/28

Page 27: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Matching precondition

Know: exhaustiveness ofswitch (l) {case nil(): ...case cons(int hd, List tl): ...}

Want: exhaustiveness ofswitch (l) {case nil(): ...case snoc(List hd, int tl): ...}

If cons matches , snoc matches.

matching precondition this = cons(_, _)

Reconciling Exhaustive Pattern Matching with Objects 18/28

Page 28: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Partial functions

Natural numbers represented by integers:

ZNat(int n) returns(n) (n >= 0 && this.rep = n

)

n

this

0 1

1

2

2

3

3

4

4

-1

the ZNat relation

n >= 0

n

this

0 1

1

2

2

3

3

4

4

-1-1

matching precondition for returns(this)

true

n

this

0 1

1

2

2

3

3

4

4

-1

matching precondition for returns(n)

Reconciling Exhaustive Pattern Matching with Objects 19/28

Page 29: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Partial functions

Natural numbers represented by integers:

ZNat(int n) returns(n) (n >= 0 && this.rep = n

)

n

this

0 1

1

2

2

3

3

4

4

-1

the ZNat relation

n >= 0

n

this

0 1

1

2

2

3

3

4

4

-1-1

matching precondition for returns(this)

true

n

this

0 1

1

2

2

3

3

4

4

-1

matching precondition for returns(n)

Reconciling Exhaustive Pattern Matching with Objects 19/28

Page 30: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Matches clauses

In ZNat, matching precondition for

• forward mode: n >= 0• backward mode: true

Writing a matching precondition per mode is tedious.

Modal abstraction! consolidated method body! consolidated matching precondition

ZNat(int n) matches(n >= 0) returns(n) (n >= 0 && this.rep = n

)

How to recover individual matching preconditions?

Reconciling Exhaustive Pattern Matching with Objects 20/28

Page 31: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Matches clauses

In ZNat, matching precondition for

• forward mode: n >= 0• backward mode: true

Writing a matching precondition per mode is tedious.

Modal abstraction! consolidated method body??? ! consolidated matching precondition

ZNat(int n) matches(n >= 0) returns(n) (n >= 0 && this.rep = n

)

How to recover individual matching preconditions?

Reconciling Exhaustive Pattern Matching with Objects 20/28

Page 32: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Matches clauses

In ZNat, matching precondition for

• forward mode: n >= 0• backward mode: true

Writing a matching precondition per mode is tedious.

Modal abstraction! consolidated method bodyMatches clause ! consolidated matching precondition

ZNat(int n) matches(n >= 0) returns(n) (n >= 0 && this.rep = n

)

How to recover individual matching preconditions?

Reconciling Exhaustive Pattern Matching with Objects 20/28

Page 33: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Specifying & interpreting a matches clause

n >= 0

n

this

0 1

1

2

2

3

3

4

4

-1-1

matching precondition for returns(this)

true

n

this

0 1

1

2

2

3

3

4

4

-1

matching precondition for returns(n)

n >= 0

n

this

0 1

1

2

2

3

3

4

4

-1

the matches clause

Use projections to re-cover individual match-ing preconditions.

Reconciling Exhaustive Pattern Matching with Objects 21/28

Page 34: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Specifying & interpreting a matches clause

n >= 0

n

this

0 1

1

2

2

3

3

4

4

-1-1

matching precondition for returns(this)

true

n

this

0 1

1

2

2

3

3

4

4

-1

matching precondition for returns(n)

n >= 0

n

this

0 1

1

2

2

3

3

4

4

-1

the matches clause

Use projections to re-cover individual match-ing preconditions.

Reconciling Exhaustive Pattern Matching with Objects 21/28

Page 35: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Verification summary

matching precondition ) method body

forward mode of ZNat: n � 0 ) 9rep W n � 0 ^ rep D n

backward mode of ZNat: true ) 9n W n � 0 ^ rep D n

(need invariant rep � 0)

class ZNat implements Nat {private invariant(rep >= 0);ZNat(int n) matches(n >= 0) returns(n) (n >= 0 && this.rep = n

)

...

}

Reconciling Exhaustive Pattern Matching with Objects 22/28

Page 36: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Have your cake and eat it too?

Problem statement

Can we satisfy all these goals without violating data abstraction?

1 implementation-oblivious pattern matching X2 verification of exhaustive and nonredundant pattern matching X

Reconciling Exhaustive Pattern Matching with Objects 23/28

Page 37: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Implementation

Pattern matching features:

• Translate to Java (extends JMatch 1.1.6).• Original semantics redefined to handle implicit equality

constructor calls.

Verification:

• Encode verification conditions for Z3 theorem prover.

Reconciling Exhaustive Pattern Matching with Objects 24/28

Page 38: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

EvaluationOn code examples (include Java collections framework):

• Implemented concisely in JMatch & Java, compare token counts.• Verification correctness and overhead during compilation.

Code

Expressiveness (%)

0102030405060708090

100

Nat ListAST

CPS

Type

Check

er

AVLTre

e

ArrayL

ist

Linke

dList

HashM

ap

TreeM

ap

avg 57.1%

Code

Overhead (%)

0102030405060708090

100

Nat ListAST

CPS

Type

Check

er

AVLTre

e

ArrayL

ist

Linke

dList

HashM

ap

TreeM

ap

avg 37.5%

Reconciling Exhaustive Pattern Matching with Objects 25/28

Page 39: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

interface Tree {invariant(this = leaf() | branch(_,_,_));constructor leaf() matches(height() = 0) ensures(height() = 0);constructor branch(Tree l, int v, Tree r) matches(height() > 0)ensures(height() > 0 &&(height() = l.height() + 1 && height() > r.height() ||

height() > l.height() && height() = r.height() + 1))

returns(l, v, r);int height() ensures(result >= 0);

}

static Tree rebalance(Tree l, int v, Tree r) matches(true) ( // in AVLTreeresult = Branch(Branch(Tree a, int x, Tree b), int y,

Branch(Tree c, int z, Tree d))

&& ( l.height() - r.height() > 1 && d = r && z = v // rot. from left

&& ( l = branch(Tree ll, y, c) && ll = branch(a, x, b) &&

ll.height() >= c.height()

| l = branch(a, x, Tree lr) && lr = branch(b, y, c) &&

a.height() < lr.height())

| r.height() - l.height() > 1 && a = l && x = v // rot. from right

&& ( r = branch(Tree rl, z, d) && rl = branch(b, y, c) &&

rl.height() > d.height()

| r = branch(b, y, Tree rr) && rr = branch(c, z, d) &&

b.height() <= rr.height()))

| abs(l.height() - r.height()) <= 1 && result = Branch(l, v, r)

)

Reconciling Exhaustive Pattern Matching with Objects 26/28

Page 40: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Takeaways

• Compact code for pattern matching possible in object-orientedsettings

named and equality constructors, disjoint disjunctionspattern disjunctions, tuples

• Verifying exhaustiveness and nonredundancy of pattern matchingpossible

invariants, multimodal matches clausesensures clauses, opaque matching preconditions

Reconciling Exhaustive Pattern Matching with Objects 27/28

Page 41: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Reconciling Exhaustive Pattern Matching with Objects

Chin Isradisaikul Andrew [email protected] [email protected]

http://www.cs.cornell.edu/projects/JMatch/

Reconciling Exhaustive Pattern Matching with Objects 28/28

Page 42: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

additional slides

Reconciling Exhaustive Pattern Matching with Objects 29/28

Page 43: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Equality constructors in action

public constructor cons(int x, List l) returns(x, l) (l = nil() && this.hd = l && this.tl = x

| l = Snoc(List lhd, int ltl) &&

this.hd = cons(x, lhd) && this.tl = ltl)

public constructor snoc(List l, int x) returns(l, x) (this.hd = l && this.tl = x

)

public constructor equals(List l) (l = cons(int lhd, List ltl) && cons(lhd, ltl)

)

List result = Snoc.cons(42, Cons.cons(17, Nil.nil()));

Convert [17; []] into a Snoc, calling Snoc.cons(17, Nil.nil()).The conversion is [[]; 17], so lhd = [], ltl = 17

Reconciling Exhaustive Pattern Matching with Objects 30/28

Page 44: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Equality constructors in action

public constructor cons(int x, List l) returns(x, l) (l = nil() && this.hd = l && this.tl = x

| l = Snoc(List lhd, int ltl) &&

this.hd = cons(x, lhd) && this.tl = ltl)

public constructor snoc(List l, int x) returns(l, x) (this.hd = l && this.tl = x

)

public constructor equals(List l) (l = cons(int lhd, List ltl) && cons(lhd, ltl)

)

List result = Snoc.cons(42, Cons.cons(17, Nil.nil()));

hd = cons(42, []) = [[]; 42], tl = 17result = [[[]; 42]; 17]

Reconciling Exhaustive Pattern Matching with Objects 30/28

Page 45: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Equality constructors in action

Generic equality constructors for any List:

public constructor equals(List l) (l = nil() && nil()

| l = cons(int lhd, IntList ltl) && cons(lhd, ltl)

)

In action...

List l0 = Nil.nil(); // l0 = []

List l1 = Cons.cons(17, l0); // l1 = [17; []]

List l2 = Snoc.cons(42, l1); // l2 = [[[]; 42]; 17]

List l3 = Cons.cons(47, l2); // l3 = [47; [42; [17; []]]]

Reconciling Exhaustive Pattern Matching with Objects 31/28

Page 46: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Equality constructors in action

Generic equality constructors for any List:

public constructor equals(List l) (l = nil() && nil()

| l = cons(int lhd, IntList ltl) && cons(lhd, ltl)

)

In action...

List l0 = Nil.nil(); // l0 = []

List l1 = Cons.cons(17, l0); // l1 = [17; []]

List l2 = Snoc.cons(42, l1); // l2 = [[[]; 42]; 17]

List l3 = Cons.cons(47, l2); // l3 = [47; [42; [17; []]]]

Reconciling Exhaustive Pattern Matching with Objects 31/28

Page 47: Chin Isradisaikul Andrew Myers chinawat@cs.cornell.edu ... · chinawat@cs.cornell.edu andru@cs.cornell.edu Department of Computer Science, Cornell University jIthaca, NY PLDI 2013

Evaluation

Code

Expressiveness (%)

020406080

100120140160180200

Nat List Expr Type Tree Coll

avg 57.1%

Code

Overhead (%)

020406080

100120140160180200

Nat List Expr Type Tree Coll

avg 37.5%

Reconciling Exhaustive Pattern Matching with Objects 32/28