Chin Isradisaikul Andrew Myers [email protected] ... · [email protected]...

47
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

Transcript of Chin Isradisaikul Andrew Myers [email protected] ... · [email protected]...

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