contracts, - university of pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base...

90
C ontracts, Boundaries, & Blame Robby Findler Northwestern & PLT 1

Upload: ngokhue

Post on 26-Mar-2018

218 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

Contracts,Boundaries, & Blame

Robby FindlerNorthwestern & PLT

1

Page 2: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide point-in?)

(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

point-in-module

2

Page 3: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide point-in?)

(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? (cloud 100 100) 0 0)

point-in-module

13

Page 4: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide point-in?)

(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? 0 0)

point-in-module

24

Page 5: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? 0 0)

35

Page 6: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define p-dot

(pin-under (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels ))

0 0

46

Page 7: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define p-dot

) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels ))

57

Page 8: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(equal? (pict->argb-pixels ) (pict->argb-pixels ))

68

Page 9: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(equal? #"\0\377\377\377\0\3...") #"\377\377\0\0\377\3..."))

79

Page 10: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide point-in?)

(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? (cloud 100 100) 50 50)

point-in-module

80

Page 11: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define p-dot

(pin-under (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels ))

50 50

81

Page 12: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define p-dot

) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels ))

92

Page 13: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(equal? (pict->argb-pixels ) (pict->argb-pixels ))

103

Page 14: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(equal? #"\0\377\377\377\0\3...") #"\0\377\377\377\0\3..."))

114

Page 15: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (point-in? (cloud 100 100) #f #f)

115

Page 16: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (point-in? (cloud 100 100) #f #f)pin-under: contract violation expected: (or/c real? pict-path?) given: #f in: the dx/fp argument of (->i ((base pict?) (dx/fp (or/c real? pict-path?)) (dy/f (dx/fp) (if (real? dx/fp) real? (-> pict? pict-path? (values real? real?)))) (pict pict?)) (result pict?)) contract from: <pkgs>/pict-lib/pict/main.rkt

blaming: point-in-module (assuming the contract is correct) 126

Page 17: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (point-in? (cloud 100 100) #f #f)pin-under: contract violation expected: (or/c real? pict-path?) given: #f in: the dx/fp argument of (->i ((base pict?) (dx/fp (or/c real? pict-path?)) (dy/f (dx/fp) (if (real? dx/fp) real? (-> pict? pict-path? (values real? real?)))) (pict pict?)) (result pict?)) contract from: <pkgs>/pict-lib/pict/main.rktblaming: point-in-module 137

Page 18: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> pict? real? real? boolean?)

138

Page 19: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide/contract [point-in? (-> pict? real? real?

boolean?)])(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

point-in-module

149

Page 20: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide/contract [point-in? (-> pict? real? real?

boolean?)])(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? (cloud 100 100) #f #f)

point-in-module

160

Page 21: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide/contract [point-in? (-> pict? real? real?

boolean?)])(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? #f #f)

point-in-module

171

Page 22: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

point-in?: contract violation expected: real? given: #f in: the 2nd argument of (-> pict? real? real? boolean?) contract from: point-in-module blaming: top-level (assuming the contract is correct)

172

Page 23: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

Nope:Contracts arenot Types

173

Page 24: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide/contract [point-in? (-> pict? real? real?

boolean?)])(define (point-in? p x y) (define p-dot (pin-under p x y (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels p)))

(point-in? (cloud 100 100) -50 -75)

point-in-module

174

Page 25: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define p-dot

(pin-under (disk 1))) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels ))

-50 -75

175

Page 26: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define p-dot

) (equal? (pict->argb-pixels p-dot) (pict->argb-pixels ))

186

Page 27: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(equal? (pict->argb-pixels ) (pict->argb-pixels ))

197

Page 28: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(equal? #"\0\377\377\377\0\3...") #"\0\377\377\377\0\3..."))

208

Page 29: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> pict? real? real? boolean?)

209

Page 30: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> pict? (>=/c 0) (>=/c 0) boolean?)

210

Page 31: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> pict? (>=/c 0) (>=/c 0) boolean? )

221

Page 32: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([p pict?] [x (>=/c 0)] [y (>=/c 0)]) [res boolean?])

232

Page 33: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([p pict?] [x (>=/c 0)] [y (>=/c 0)]) [res boolean?])

243

Page 34: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([p pict?] [x (p) (>=/c 0)] [y (p) (>=/c 0)]) [res boolean?])

254

Page 35: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([p pict?] [x (p) (>=/c 0) ] [y (p) (>=/c 0) ]) [res boolean?])

265

Page 36: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([p pict?] [x (p) (real-in 0 (p-w p))] [y (p) (real-in 0 (p-h p))]) [res boolean?])

276

Page 37: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (point-in? (cloud 100 100) -50 -75)point-in?: contract violation expected: (real-in 0 100) given: -50 in: the w argument of (->i ((p pict?) (w (p) (real-in 0 (pict-width p))) (h (p) (real-in 0 (pict-height p)))) (res boolean?)) contract from: point-in-module blaming: top-level (assuming the contract is correct)

277

Page 38: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(dc (λ (dc dx dy) (send dc draw-ellipse dx dy 200 120))

200 120)

278

Page 39: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(colorize (dc (λ (dc dx dy) (send dc draw-ellipse dx dy 200 120))

200 120) "blue")

289

Page 40: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(dc (λ (dc dx dy)

(send dc draw-ellipse dx dy 200 120)

) 200 120)

300

Page 41: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(dc (λ (dc dx dy) (define oldb (send dc get-brush)) (send dc draw-ellipse dx dy 200 120) (send dc set-brush oldb)) 200 120)

311

Page 42: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(dc (λ (dc dx dy) (define oldb (send dc get-brush))

(send dc draw-ellipse dx dy 200 120) (send dc set-brush oldb)) 200 120)

322

Page 43: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(dc (λ (dc dx dy) (define oldb (send dc get-brush)) (send dc set-brush "red" 'solid) (send dc draw-ellipse dx dy 200 120) (send dc set-brush oldb)) 200 120)

333

Page 44: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(colorize (dc (λ (dc dx dy) (define oldb (send dc get-brush)) (send dc set-brush "red" 'solid) (send dc draw-ellipse dx dy 200 120) (send dc set-brush oldb)) 200 120) "blue")

344

Page 45: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define eps (dc

(λ (dc dx dy) (send dc draw-ellipse

dx dy 200 100))200 100))

(define red (unsafe:dc

(λ (dc dx dy) (send dc set-brush

"red" 'solid) (send dc draw-ellipse

dx dy 200 100))200 100))

(colorize(vc-append 20 eps red eps)"black")

345

Page 46: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define eps (dc

(λ (dc dx dy) (send dc draw-ellipse

dx dy 200 100))200 100))

(define red (unsafe:dc

(λ (dc dx dy) (send dc set-brush

"red" 'solid) (send dc draw-ellipse

dx dy 200 100))200 100))

(colorize(vc-append 20 eps red eps)"black")

356

Page 47: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define eps (dc

(λ (dc dx dy) (send dc draw-ellipse

dx dy 200 100))200 100))

(define red (unsafe:dc

(λ (dc dx dy) (send dc set-brush

"red" 'solid) (send dc draw-ellipse

dx dy 200 100))200 100))

(colorize(vc-append 20 eps red eps)"black")

367

Page 48: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([f (-> dc<%> real? real? void?)] [w real?] [h real?]) [result pict?])

368

Page 49: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([f (-> dc<%> real? real? void?)] [w real?] [h real?]) [result pict?])

Wrapping f: bad idea!• checking happens too late• too expensive

379

Page 50: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([f (-> dc<%> real? real? void?)] [w real?] [h real?])

[result pict?])

390

Page 51: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(->i ([f (-> dc<%> real? real? void?)] [w real?] [h real?]) #:pre (f) (restores-state-after-call? f) [result pict?])

401

Page 52: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(define (restores-state-after-call? f) (define a-dc (make-bitmap-backed-dc)) (randomize-state a-dc) (define before (get-dc-state a-dc)) (f a-dc 0 0) (equal? before (get-dc-state a-dc)))

402

Page 53: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

Semantics:Boundaries

403

Page 54: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

2404

Page 55: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

2415

Page 56: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

2416

Page 57: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

2427

Page 58: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

4428

Page 59: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

4439

Page 60: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(<=/c 3)

4440

Page 61: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

441

Page 62: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

452

Page 63: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

453

Page 64: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

464

Page 65: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

4

465

Page 66: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

4476

Page 67: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(-> (<=/c 3) (<=/c 3))

4

517

Page 68: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

Application:RandomTesting

518

Page 69: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

YourCode

MyCode

519

Page 70: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

MyCode

530

Page 71: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

RandomnessMyCode

541

Page 72: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

542

Page 73: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))]

[delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

553

Page 74: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

564

Page 75: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

575

Page 76: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (contract-exercise new-heap insert! delete!)

576

Page 77: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (contract-exercise new-heap insert! delete!)

... nothing happens

577

Page 78: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

578

Page 79: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

589

Page 80: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (contract-exercise new-heap insert! delete!)insert!: broke its own contract #:post condition violation; variables are: h: (binary-heap 2 '#(2147483647 -7)) in: (->i ((h (and/c binary-heap? valid-heap?)) (i integer?)) (result void?) #:post (h) (valid-heap? h)) contract from: heap blaming: heap (assuming the contract is correct)

590

Page 81: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

591

Page 82: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

602

Page 83: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

> (contract-exercise new-heap insert! delete!)delete!: broke its own contract #:post condition violation; variables are: h: (binary-heap 3 '#(349065506 28.0 ... in: (->i ((h (and/c binary-heap? valid-heap?))) (res (or/c integer? #f)) #:post (h) (valid-heap? h)) contract from: heap blaming: heap (assuming the contract is correct)

> (contract-exercise new-heap insert! delete!)delete!: broke its own contract #:post condition violation; variables are: h: (binary-heap 2 '#(728834549.0 631... in: (->i ((h (and/c binary-heap? valid-heap?))) (res (or/c integer? #f)) #:post (h) (valid-heap? h)) contract from: heap blaming: heap (assuming the contract is correct)

> (contract-exercise new-heap insert! delete!)delete!: broke its own contract #:post condition violation; variables are: h: (binary-heap 3 '#(1018653970 1242... in: (->i

((h (and/c binary-heap? valid-heap?))) (res (or/c integer? #f)) #:post (h) (valid-heap? h)) contract from: heap blaming: heap (assuming the contract is correct)

> (contract-exercise new-heap insert! delete!)delete!: broke its own contract #:post condition violation; variables are: h: (binary-heap 3 '#(-180.0 -1343510... in: (->i

((h (and/c binary-heap? valid-heap?))) (res (or/c integer? #f)) #:post (h) (valid-heap? h)) contract from: heap blaming: heap (assuming the contract is correct)

> (contract-exercise new-heap insert! delete!)delete!: broke its own contract #:post condition violation; variables are: h: (binary-heap 2 '#(-267600327.0 -1... in: (->i ((h (and/c binary-heap? valid-heap?))) (res (or/c integer? #f)) #:post (h) (valid-heap? h)) contract from: heap blaming: heap (assuming the contract is correct) 603

Page 84: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

#lang racket/base(require pict pict/tree-layout racket/match racket/contract)

(struct binary-heap (size vec) #:mutable #:transparent)(define (valid-heap? heap) (match heap [(binary-heap size vec) (let loop ([i 0] [parent -inf.0]) (cond [(< i size) (define this (vector-ref vec i)) (and (<= parent this) (loop (left-child i) this) (loop (right-child i) this))] [else #t]))]))(define heap/c (and/c binary-heap? valid-heap?))

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))]))

(define (new-heap) (binary-heap 0 (make-vector 1 #f)))

(define (insert! heap nv) (match heap [(binary-heap size vec) (unless (< size (vector-length vec)) (define new-vec (make-vector (* (vector-length vec) 2) #f)) (vector-copy! new-vec 0 vec) (set-binary-heap-vec! heap new-vec)

(set! vec new-vec)) (vector-set! vec size nv) (set-binary-heap-size! heap (+ size 1)) (let loop ([i size] [iv nv]) (unless (= i 0) (define p (parent i)) (define pv (vector-ref vec p)) (when (< iv pv) (vector-set! vec p iv) (vector-set! vec i pv) (loop p iv))))]))

(define (delete! heap) (match heap [(binary-heap size vec) (cond [(= size 0) #f] [else (define ans (vector-ref vec 0)) (vector-set! vec 0 (vector-ref vec (- size 1))) (set-binary-heap-size! heap (- size 1)) (let ([size (- size 1)]) (let loop ([i 0]) (when (< i size) (define v (vector-ref vec i)) (define li (left-child i)) (define ri (right-child i)) (when (< li size) (define-values (smaller-child-index smaller-child-val) (cond [(< ri size) (define l (vector-ref vec li)) (define r (vector-ref vec ri)) (if (<= l r) (values li l) (values ri r))] [else (values li (vector-ref vec li))])) (when (< smaller-child-val v) (vector-set! vec smaller-child-index v) (vector-set! vec i smaller-child-val) (loop smaller-child-index)))))) ans])]))

(define (left-child i) (+ (* i 2) 1))(define (right-child i) (+ (* i 2) 2))(define (parent i) (quotient (- i 1) 2))

604

Page 85: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(A → B) → (C → D)

605

Page 86: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(A → B) → (C → D)

we provide

616

Page 87: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

we get to use

(A → B) → (C → D)

we provide

627

Page 88: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

(provide (contract-out [new-heap (-> heap/c)] [insert! (->i ([h heap/c] [i integer?]) [result void?] #:post (h) (valid-heap? h))] [delete! (->i ([h heap/c]) [res (or/c integer? #f)] #:post (h) (valid-heap? h))])) 628

Page 89: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

Last Thoughts

Contracts: more & less than types

Boundaries+Blame: speed debugging

Specifications: lots of use

629

Page 90: Contracts, - University of Pennsylvaniasweirich/icfp-plmw15/slides/findler.pdf · #lang racket/base (require pict pict/tree-layout racket/match racket/contract) (struct binary-heap

Last Thoughts

Contracts: complement types

Boundaries+Blame: speed debugging

Specifications: lots of use

640