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!

Recommend


More recommend