how do we think about guis
play

How do we think about GUIs? an array of buttons each button waits - PowerPoint PPT Presentation

Curry-Howard for GUIs: classical linear linear temporal logic (work in progress!) Steve Zdancewic Jennifer Paykin Neel Krishnaswami WG 2.8 2015 How do we think about GUIs? an array of buttons each button waits for a click each


  1. Curry-Howard for GUIs: classical linear linear temporal logic (work in progress!) Steve Zdancewic Jennifer Paykin Neel Krishnaswami WG 2.8 2015

  2. How do we think about GUIs? ◦ an array of buttons ◦ each button waits for a click ◦ each button has a different effect (e.g. starts a different app) ◦ logically, each button is an independent process

  3. A Callback-driven GUI API button.onClick : (ClickData -> IO ()) -> IO () -- add the callback to the appropriate handler button.onClick callback = handlers[click] := callback::(!handlers[click]) ◦ pass to the button a function to be invoked on a click event ◦ callback stored in a per-widget collection ◦ button.onClick has a continuation type ⇒ ¡classical ¡logic? ¡

  4. Temporal Behavior ◦ GUI widgets wait for events ◦ handling of an event yields a natural notion of clock “tick” • process all of the callbacks for one event ◦ some resources are available only “now” • e.g. the data associated with the current event ◦ some resources are available “always” (at any point in the future) • e.g. a callback associated with a widget ◦ some resources are available only “eventually” • e.g. the data from some future event

  5. From Callbacks to Eventually button.onClick : (ClickData -> IO ()) -> IO () : � (ClickData -> IO ()) -> IO () : ( � ¬ClickData) -> IO () : ¬ � ¬ClickData : ♢ ClickData ◦ callback creation ~ eventually modality of temporal logic • also called the “possibility” modality ◦ classical logic (should) yield a CPS-based implementation ◦ Question: Can we make anything out of this observation?

  6. Type Structure ◦ Ordinary Types A useable “now” ◦ Always Types � ︎ A useable at any (future) time ◦ Eventually Types ♢ A useable at some (future) time • See [Pfenning & Davies] for modal logic

  7. Always Modality ◦ The type � Α is “always A” or “necessarily A”. ◦ Box is a comonad. Δ ; Γ ⊢ Α Δ ; . ⊢ Α Δ ; Γ ⊢ � Α Δ , Α ; Γ ⊢ Β Δ ; Γ ⊢ � Α Δ ; Γ ⊢ Β Α ∈ Δ Δ ; Γ ⊢ Α

  8. Always Modality ◦ The type � Α is “always A” or “necessarily A”. ◦ Box is a comonad. Δ ; Γ ⊢ Α Δ ; . ⊢ e ¡: ¡ Α Δ ; Γ ⊢ e 1 ¡: ¡ � Α Δ , ¡a: Α ; Γ ⊢ e 2 ¡: ¡ Β Δ ; Γ ⊢ box ¡e ¡: � Α Δ ; Γ ⊢ let ¡box ¡a ¡= ¡e 1 ¡in ¡e 2 ¡ ¡: ¡ Β a: Α ∈ Δ Δ ; Γ ⊢ a ¡: ¡ Α

  9. Eventually Modality ◦ The type ♢ Α is “eventually A” or “possibly A”. ◦ Diamond is a monad. Δ ; Γ ⊢ Α Δ ; Γ ⊢ ♢ Α Δ ; Γ ⊢ ♢ Α Δ ; Α ⊢ ♢ Β Δ ; Γ ⊢ ♢ Β

  10. Eventually Modality ◦ The type ♢ Α is “eventually A” or “possibly A”. ◦ Diamond is a monad. Δ ; Γ ⊢ e ¡: ¡ Α Δ ; Γ ⊢ future ¡e ¡: ¡ ♢ Α Δ ; Γ ⊢ e 1 ¡: ¡ ♢ Α Δ ; x: Α ⊢ e 2 ¡: ♢ Β Δ ; Γ ⊢ wait ¡x ¡= ¡e 1 ¡in ¡e 2 ¡: ♢ Β

  11. Linear Temporal Logic ◦ The type ♢ Α means “eventually A”. • Would like to think of this as an “A event” • Built-in primitives could provide other sources of ♢ Α ◦ But… not enough structure to order them • In a GUI, we often think of the sequence of events ¡total ¡order: ¡ ¡ ¡ ¡for ¡any ¡A, ¡B. ¡ ¡ ¡ ¡ ¡A ¡ ¡ ¡≤ ¡ ¡B ¡ ¡ ¡ ¡or ¡ ¡ ¡ ¡B ¡ ¡≤ ¡ ¡A ¡ ¡ ¡ ¡

  12. Branching vs Linear Time A ¡ ♢ A ¡ ♢ B ¡ B ¡ ♢ A ¡ A ¡ B ¡ ♢ B ¡

  13. Linear Temporal Logic ◦ Encode the ordering as this rule: Δ ; Γ 1 ⊢ ♢ Β Δ ; Α , ♢ Β ⊢ ♢ C Δ ; Γ 2 ⊢ ♢ Α Δ ; ♢ Α , Β ⊢ ♢ C Δ ; Γ 1 , Γ 2 ⊢ ♢ C ◦ Call this operation “select”: • Wait for whichever event fires first, choose a continuation based on the outcome • The second operation will still eventually happen

  14. Linear Temporal Logic ◦ Encode the ordering as this rule: Δ ; Γ ⊢ e 1 ¡: ♢ Β Δ ; a: Α , b: ♢ Β ⊢ c 1 ¡: ¡ ♢ C Δ ; Γ ⊢ e 2 ¡: ♢ Α Δ ; a: ♢ Α , b: Β ⊢ c 2 ¡: ¡ ♢ C Δ ; Γ ⊢ select ¡e 1 ¡ | ¡e 2 ¡as ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡| ¡ ¡a ¡, ¡b ¡-­‑> ¡c 1 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡: ¡ ♢ C ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡| ¡ ¡a ¡, ¡b ¡-­‑> ¡c 2 ◦ Call this operation “select”: • Wait for whichever event fires first, choose a continuation based on the outcome • The second operation will still eventually happen

  15. Linear Time, Logically ◦ lets us say that any two events can be ordered: ♢ A ⟶ ¡ ¡ ♢ B ⟶ ♢ (A x ♢ B) + ♢ ( ♢ A x B) ◦ also permits synchronization on “eventually always” propositions: sync: ♢ � A ⟶ ♢ � B ⟶ ♢ � ( A x B)

  16. Classical Linear Linear Temporal Logic ◦ Ordinary Types A useable “now” ◦ Always Types � ︎ A useable at any (future) time ◦ Eventually Types ♢ A useable at some (future) time ◦ Classical Linear Logic ⇒ Concurrent Programming • See e.g. [Wadler] [Pfenning] • π -calculus notation ◦ Benefits: similar to Rust’s affine types • separation of resources • race prevention

  17. Safety button.onClick : (ClickData -> IO ()) -> IO () button.onClick : (ClickData -> Safe) -> Safe ◦ here IO () is the answer type. ◦ this is too permissive; we don’t want all terms of type IO () ◦ … only those commands that preserve the event loop invariants • Idea: for GUIs replace IO () with Safe, a refinement that permits only “good” computations • show that safety is preserved when composing richer types

  18. What is Safety? A widget contains: … Some first-order data (color, height, text, etc.) … A collection of event handlers … So a heap can be formalized as: Data heap h ::= · | h , h | l : d Loc → M fin ( Val ) Queue q ∈ Store Data × Queue σ ∈ … Key problem: event handlers are higher-order state

  19. Safety, Semantically ⇢ � � ∀ ϕ # h . ∃ π 2 Perm . � ( σ , t , σ 0 ) Ok = � ⌦ ↵ π ( σ 0 ) · ϕ ;() h σ · ϕ ; t i + � 8 9 � σ � < = ∀ l 2 Loc , e 2 Event . z }| { � Safe n = ( h , q ) � Safe ∗ n (( h , [ q | l : ∅ ]) , e , q ( l )) � : ; � T Safe = n Safe n Safe ∗ > 0 ( σ , e , ks ) = Safe ∗ > n + 1 ( σ , e , ε ) = ∃ σ 0 2 Safe n . Safe ∗ Ok ( σ , k e , σ 0 ) ∧ n + 1 ( σ , e , k · ks ) = Safe ∗ n ( σ 0 , e , ks ) … Safe = heaps maintaining safety on callbacks

  20. Separation Algebra of Safe Heaps h # h 0 dom ( h ) \ dom ( h 0 ) = ∅ ¨ ( h , q )#( h 0 , q 0 ) h # h 0 ¨ ⇢ h , h 0 if h # h h · h = otherwise ? q · q 0 λ l . q ( l ) [ q 0 ( l ) = ε = ( · , []) ⇢ ( h · h 0 , q · q 0 ) if h # h ( h , q ) · ( h 0 , q 0 ) = ? otherwise

  21. Compilation Strategy Classical :: Classical Logic Linear Logic ⇓ ⇓ Intuitionistic :: Tensorial Logic Logic ◦ Translation is double-negation (i.e. CPS translation) ◦ Mellies’ tensorial logic

  22. Realizability Semantics of Continuations { h σ ; v i | σ 2 Safe } T ype = �⌦ ↵ 1 = ε ;() ⇢⌦ ↵ � � h σ A ; a i 2 A ∧ � A ∗ B σ A · σ B ;( a , b ) = � h σ B ; b i 2 B � ∅ 0 = { h σ ; in i v i | h σ ; v i 2 A i } A 1 + A 2 = ⇢ � ∀ h h 0 ; a i 2 A . � � h h ; k i ¬ A = if h # h 0 then h h · h 0 ; k a i 2 Safe � � � ∀ n , h 0 . if h ) n h 0 then ( h 0 , v ) 2 A � � É A = ( h , box ( v ))

  23. Double Negation (CPS) [[ 0 ]] 0 = [[ A � B ]] = [[ A ]] + [[ B ]] [[ I ]] = 1 [[ A ⌦ B ]] = [[ A ]] ∗ [[ B ]] [[ > ]] = ¬ 0 [[ A & B ]] = ¬ ( ¬ [[ A ]] + ¬ [[ B ]]) [[ ? ]] = ¬ 1 [[ A ` B ]] = ¬ ( ¬ [[ A ]] ∗ ¬ [[ B ]]) [[ É A ]] = É [[ A ]] [[ Ü A ]] ¬ É ¬ [[ A ]] =

  24. Status ◦ Still nailing down the semantics • Interaction between linearity & temporal logic • Proofs that the safety invariants compose ◦ Playing around with syntax • Sequent formulations of the type system • Pi-calculus? Mu calculus? ◦ No implementation (yet!) ◦ Jennifer: thinking about “composition of logical features” • Combining semantics

  25. Features as Computational “Worlds” Pure ¡ FuncHonal ¡ Always, ¡ Linearly ¡ Now, ¡ Linearly ¡ Eventually, ¡ Linearly ¡ See ¡e.g. ¡Benton’s ¡Linear—Nonlinear ¡Logic ¡

  26. "Adjoint functors arise everywhere..." Type ¡System ¡ Term ¡ Type ¡ Logic ¡ Proof ¡ ProposiHon ¡ Category ¡ Object ¡ Morphism ¡ AdjuncHon ¡

  27. Questions ◦ Connection to Functional Reactive Programming? ◦ Behavior/Signal vs. Event • � A ~ T ⟶ A where T is the domain of Time • ♢ A ~ T x A ◦ Connection to Concurrent ML? • first-class synchronization primitives?

  28. Interactive Programs -- event loop ◦ event loop waits for events while (true) { let event = get_event(); ◦ programs register callbacks for (f in handlers[event]) { with the event handler f(event.data); } } ◦ event loop invokes the callbacks for each event -- handlers handlers[key] = [fun d -> …; fun d -> …;] ◦ GUI Programs are(?): • higher-order handlers[click] = • concurrent [fun d -> …; fun d -> …;] • imperative • CPS handlers[mouseMove] = [fun d -> …;]

Recommend


More recommend