fluid types
play

Fluid Types Statically Verified Distributed Protocols with - PowerPoint PPT Presentation

Fluid Types Statically Verified Distributed Protocols with Refinements Fangyi Zhou Francisco Ferreira Rumyana Neykova Nobuko Yoshida Quick Primer on Session Types 2 Concurrency Shared Memory Message Passing 3 (1) ->


  1. Fluid Types Statically Verified Distributed Protocols with Refinements Fangyi Zhou Francisco Ferreira Rumyana Neykova Nobuko Yoshida

  2. Quick Primer on Session Types � 2

  3. Concurrency Shared Memory Message Passing � 3

  4. (1) -> “Hello” A B (2) <- 42 Send string Receive string Duality Receive int Send int Done Done � 4

  5. Receive string Send int C Done Done (1) A -> C “Hello” (2) C -> B 42 Send string Receive int Done Done (3) A -> B “Hello” A B (4) B -> A 42 Send string Receive string Receive int Send int Done Done � 5

  6. Receive A string Send B int C Done (1) A -> C “Hello” (2) C -> B 42 (3) A -> B “Hello” A B (4) B -> A 42 Send C string Receive C string Send B string Receive B string Receive B int Send B int Done Done � 6

  7. C (1) A -> C “Hello” (2) C -> B 42 (3) A -> B “Hello” A B (4) B -> A 42 string from A to C; int from C to B; Global Protocol string from A to B; int from B to A; � 7

  8. Motivation � 8

  9. Example: a simple protocol • Two kids are playing a game on the playground • A tells B a number • B tries to find a larger number protocol Playground (role A, role B) { initialGuess (int) from A to B; finalGuess (int) from B to A; } No guarantee whether this will be larger � 9

  10. Example: a simple protocol • Two kids are playing a game on the playground • A tells B a number • B tries to find a larger number protocol Playground (role A, role B) { initialGuess (x:int) from A to B @ x > 7; finalGuess (y:int) from B to A @ y > x; } Named Parameters Assertions � 10

  11. Previously… • Session Type Provider [Neykova et al. 2018] • Compile Time Type Generation in F# • Protocol validated during compilation • Refinements checked dynamically during execution [Neykova et al. 2018]: Rumyana Neykova, Raymond Hu, Nobuko Yoshida, and Fahd Abdeljallal. 2018. A session type provider: compile-time API generation of distributed protocols with refinements in F# � 11

  12. Workflow (Previously) Protocol with Compile Time Communication Refinements Type Generation via Generated API protocol Playground let p = 
 (role A, role B) { new Protocol().Init() initialGuess (x:int) type Protocol in 
 from A to B @ x > 7; = SessionTypeProvider p.send(B, initialGuess, 42) finalGuess (y:int) <“Playground.scr”, “A”> .receive(B, finalGuess, y) from B to A @ y > x; .finish() } � 12

  13. Workflow (Now) Compile Time Communication Protocol with Refinement Type Refined Type via Generated Refinements Check Generation Refined API � 13

  14. Overview • Add refinements to generated types • Check refinements with a type system extension • Extract F# code into a refinement calculus • Check satisfiability using external solver � 14

  15. What are refinement types? • Build upon an existing type system • Allow base types to be refined via predicates • Specify data dependencies • Example: Liquid Haskell [Vazou et al. 2014] [Vazou et al. 2014]: Niki Vazou, Eric L. Seidel, Ranjit Jhala, Dimitrios Vytiniotis, and Simon Peyton-Jones. 2014. Refinement types for Haskell. � 15

  16. λ H Refinement Calculus: • STLC with refinement types • Terms can be encoded in SMT-LIB terms • Establishes a subtyping relation via SMT solver � 16

  17. λ H Types in integers, booleans, … • A base type { ν : b | M } ν Base type , value refined by term b M • A function type (dependent function) ( x : τ 1 ) → τ 2 Variable can occur in the type x τ 2 c.f. Dependent Types Π x : τ 1 τ 2 ( x ) � 17

  18. Example • The integer literal 1 • A possible type: { ν : int | ν = 1} { ν : int | ν ≥ 1} • Another possible type: { ν : int | true } • Or more… • Solution: Bidirectional Typing � 18

  19. Bidirectional Typing • Provides a more algorithmic approach • Mutually inductive judgments • Type Synthesis * Γ ; Δ ⊢ M ⇒ τ Given Γ , Δ , M , find the type τ *Not all terms are synthesisable • Type Check Γ ; Δ ⊢ M ⇐ τ Given Γ , Δ , M , τ , determine if type is correct � 19

  20. “Change of Direction” Rule Subtyping Judgment Well-formedness Judgment � 20

  21. Subtyping with SMT • Encode refinements term into SMT-LIB • Use SMT solver to decide validity � 21

  22. Encoding in SMT-LIB x (A term Variable) x (An SMT Variable) � 22

  23. Encoding in SMT-LIB ( + ) 1 2 (+ 1 2) � 23

  24. Encoding in SMT-LIB x : { ν : int | ν + 2 = 5} x + 2 = 5 � 24

  25. Encoding in SMT-LIB Valid ([ [ Γ ] ] ∧ [ [ Δ ] ] ∧ [ [ M 1 ] ] ⟹ [ [ M 2 ] ]) Unsat ([ [ Γ ] ] ∧ [ [ Δ ] ] ∧ [ [ M 1 ] ] ∧ ¬[ [ M 2 ] ]) � 25

  26. Subtyping with SMT • Consider integer literal 1 • Synthesised type: { ν : int | ν = 1} • Check subtype: { ν : int | ν = 1} <: { ν : int | ν ≥ 1}? • Encode into logic: SAT (( v = 1) ∧ ¬( v ≥ 1))? • Use SMT solver: UNSAT � 26

  27. Subtyping with SMT • Consider term x + 1 with context x : { ν : int | ν ≥ 1} • Synthesised type: { ν : int | ν = x + 1} • Check subtype: { ν : int | ν = x + 1} <: { ν : int | ν ≥ 2}? • Encode into logic: SAT (( x ≥ 1) ∧ ( v = x + 1) ∧ ¬( v ≥ 2))? • Use SMT solver: UNSAT � 27

  28. Generating Types • Scribble validates protocol and generates CFSM • Type Provider converts CFSM into F# code • New: Adding refinements in types � 28

  29. From Protocol to CFSM (Scribble) protocol Playground (role A, role B) { initialGuess (x:int) from A to B @ x > 7; finalGuess (y:int) from B to A @ y > x; } Projection to role A protocol Playground (role A, role B) { initialGuess (x:int) from A to B @ x > 7; finalGuess (y:int) from B to A @ y > x; } � 29

  30. From Protocol to CFSM (Scribble) protocol Playground (role A, role B) { initialGuess (x:int) from A to B @ x > 7; finalGuess (y:int) from B to A @ y > x; } Projection to role A � 30

  31. λ H From CFSM to (Type Provider) x : { ν : int | ν > 7} x : { ν : int | ν > 7} Ø y : { ν : int | ν > x } type State2 = { type State1 = { x: {v:int|v>7}; type State0 = {} x: {v:int|v>7}; y: {v:int|v>x}; } } � 31

  32. λ H From CFSM to (Type Provider) type State2 = { type State1 = { x: {v:int|v>7}; type State0 = {} x: {v:int|v>7}; y: {v:int|v>x}; } } initialGuess : (st: State0) -> (x: {v:int|v>7}) -> State1 � 32

  33. λ H From CFSM to (Type Provider) type State2 = { type State1 = { x: {v:int|v>7}; type State0 = {} x: {v:int|v>7}; y: {v:int|v>x}; } } finalGuess : (st: State1) -> (State2 * {v:int|v>st.x}) � 33

  34. λ H From CFSM to (Type Provider) type State2 = { type State1 = { x: {v:int|v>7}; type State0 = {} x: {v:int|v>7}; y: {v:int|v>x}; } } initialGuess : (st: State0) -> (x: {v:int|v>7}) -> State1 finalGuess : (st: State1) -> (State2 * {v:int|v>st.x}) � 34

  35. One Last Step… • Typecheck the program with refined types • Extract F# expressions to terms in λ H • Use F# Compiler Services to obtain AST • Check whether API usage is correct w.r.t. refinements � 35

  36. Future Work • Support recursion in protocols • Complete meta-theory for refinements in MPST • End to end meta-theory • Support more features in refinement calculus � 36

  37. Thank you!

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend