proofs upside down
play

Proofs, upside down A functional correspondence between natural - PowerPoint PPT Presentation

Proofs, upside down A functional correspondence between natural deduction and the sequent calculus Matthias Puech APLAS13 Melbourne, December 11, 2013 1 / 19 An intuition Natural deductions are reversed sequent calculus proofs 2 / 19


  1. Proofs, upside down A functional correspondence between natural deduction and the sequent calculus Matthias Puech APLAS’13 Melbourne, December 11, 2013 1 / 19

  2. An intuition Natural deductions are “reversed” sequent calculus proofs 2 / 19

  3. An intuition Problem How to make this intuition formal? • how to define “reversal” generically? • from N.D., how to derive S.C.? 2 / 19

  4. and now, for something completely different. . . 3 / 19

  5. Accumulator-passing style A well-known programmer trick to save stack space 4 / 19

  6. Accumulator-passing style A well-known programmer trick to save stack space • a function in direct style: let rec tower1 = function | [] → 1 | x :: xs → x ∗∗ tower1 xs 4 / 19

  7. Accumulator-passing style A well-known programmer trick to save stack space • a function in direct style: let rec tower1 = function | [] → 1 | x :: xs → x ∗∗ tower1 xs • the same in accumulator-passing style: let rec tower2 acc = function | [] → acc | x :: xs → tower2 ( x ∗∗ acc ) xs 4 / 19

  8. Accumulator-passing style A well-known programmer trick to save stack space • a function in direct style: let rec tower1 = function | [] → 1 | x :: xs → x ∗∗ tower1 xs • the same in accumulator-passing style: let rec tower2 acc = function | [] → acc | x :: xs → tower2 ( x ∗∗ acc ) xs (* don’t forget to reverse the input list *) let tower xs = tower2 1 ( List. rev xs ) 4 / 19

  9. In this talk sequent calculus natural deduction = tower2 tower1 5 / 19

  10. In this talk sequent calculus natural deduction = tower2 tower1 The message • S.C. is an accumulator-passing N.D. • there is a systematic, off-the-shelf transformation from N.D.-style systems to S.C.-style systems • it is modular, i.e., it applies to variants of N.D. / S.C. • a programmatic explanation of a proof-theoretical artifact 5 / 19

  11. In this talk The medium Go through term assignments and reason on the type checker: sequent calculus natural deduction ¯ bidirectional λ -calculus λ -calculus transformation type-checker type-checker 5 / 19

  12. Outline The transformation Some extensions 6 / 19

  13. Outline The transformation Some extensions 7 / 19

  14. Starting point: the Bidirectional λ -calculus a.k.a. intercalations, normal forms + annotation [ Pierce and Turner, 2000 ] � � A ⊃ A A :: = p Types � � R M :: = λ x . M Terms � x � ( M : A ) � � R :: = R M Atoms Γ ⊢ R ⇒ A Inference A ���� V �� A �� x : A ∈ Γ Γ ⊢ M ⇐ A Γ ⊢ R ⇒ A ⊃ B Γ ⊢ M ⇐ A Γ ⊢ ( M : A ) ⇒ A Γ ⊢ x ⇒ A Γ ⊢ R M ⇒ B Γ ⊢ M ⇐ A Checking L �� A ��� Γ , x : A ⊢ M ⇐ B Γ ⊢ R ⇒ C Γ ⊢ λ x . M ⇐ A ⊃ B Γ ⊢ R ⇐ C 8 / 19

  15. Starting point: the Bidirectional λ -calculus type a = Base | Imp of a × a type m = Lam of string × m | Atom of r and r = App of r × m | Var of string | Annot of m × a let rec check env c : m → unit = let rec infer : r → a = fun r → match r with | Var x → List. assoc x env | Annot ( m , a ) → check env a m ; a | App ( r , m ) → let Imp ( a , b ) = infer r in check env a m ; b in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → match infer r with c’ when c = c’ → () 8 / 19

  16. Starting point: the Bidirectional λ -calculus type a = Base | Imp of a × a type m = Lam of string × m | Atom of r and r = App of r × m | Var of string | Annot of m × a let rec check env c : m → unit = let rec infer : r → a = fun r → match r with | Var x → List. assoc x env | Annot ( m , a ) → check env a m ; a | App ( r , m ) → let Imp ( a , b ) = infer r in check env a m ; b in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → match infer r with c’ when c = c’ → () Remarks • inference in constant environment → infer λ -dropped 8 / 19

  17. Starting point: the Bidirectional λ -calculus type a = Base | Imp of a × a type m = Lam of string × m | Atom of r and r = App of r × m | Var of string | Annot of m × a let rec check env c : m → unit = let rec infer : r → a = fun r → match r with | Var x → List. assoc x env | Annot ( m , a ) → check env a m ; a | App ( r , m ) → let Imp ( a , b ) = infer r in check env a m ; b in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → match infer r with c’ when c = c’ → () Remarks • inference in constant environment → infer λ -dropped • infer is head-recursive 8 / 19

  18. Inefficiency: no tail recursion (* ... *) let rec infer : r → a = fun r → match r with | Var x → List. assoc x env | Annot ( m , a ) → check env a m ; a | App ( r , m ) → let Imp ( a , b ) = infer r in check env a m ; b (* ... *) Example . . . @ M @ 1 M @ 2 ⋆ M 3 x 9 / 19

  19. Solution: reverse atomic terms (* ... *) let rec infer : r → a = fun r → match r with | Var x → List. assoc x env | Annot ( m , a ) → check env a m ; a | App ( r , m ) → let Imp ( a , b ) = infer r in check env a m ; b (* ... *) Example . . . . . . ⋆ @ x −→ @ M @ 1 M @ M 3 @ 2 M @ ⋆ M 2 3 · M x 1 9 / 19

  20. The transformation An application of Danvy and Nielsen [ 2001 ] ’s framework: • (partial) CPS transformation • (lightweight) defunctionalization • reforestation ( = deforestation − 1 ) Turns direct style into accumulator-passing style 10 / 19

  21. Step 1. CPS transformation of infer (call-by-value) let rec check env c : m → unit = let rec infer : r → a = fun r → match r with | Var x → List. assoc x env | Annot ( m , a ) → check env a m ; a | App ( r , m ) → let Imp ( a , b ) = infer r in check env a m ; b in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → match infer r with c’ when c = c’ → () 11 / 19

  22. Step 1. CPS transformation of infer (call-by-value) type k = a → unit let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a | App ( r , m ) → infer r ( fun ( Imp ( a , b )) → check env a m ; k b ) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r ( function c’ when c = c’ → ()) 11 / 19

  23. Step 1. CPS transformation of infer (call-by-value) type k = a → unit let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a | App ( r , m ) → infer r ( fun ( Imp ( a , b )) → check env a m ; k b ) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r ( function c’ when c = c’ → ()) 11 / 19

  24. Step 1. CPS transformation of infer (call-by-value) type k = a → unit let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a | App ( r , m ) → infer r ( fun ( Imp ( a , b )) → check env a m ; k b ) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r ( function c’ when c = c’ → ()) 11 / 19

  25. Step 1. CPS transformation of infer (call-by-value) type k = a → unit let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a | App ( r , m ) → infer r ( fun ( Imp ( a , b )) → check env a m ; k b ) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r ( function c’ when c = c’ → ()) 11 / 19

  26. Step 2. (lightweight) Defunctionalization type k = a → unit let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a (* KCons *) | App ( r , m ) → infer r ( fun ( Imp ( a , b )) → check env a m ; k b ) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r ( function c’ when c = c’ → ()) (* KNil *) 12 / 19

  27. Step 2. (lightweight) Defunctionalization type k = a → unit let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a | App ( r , m ) → infer r ( KCons ( m , k )) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r KNil 12 / 19

  28. Step 2. (lightweight) Defunctionalization type k = KNil | KCons of m × k let rec check env c : m → unit = let rec infer : r → k → unit = fun r k → match r with | Var x → k ( List. assoc x env ) | Annot ( m , a ) → check env a m ; k a | App ( r , m ) → infer r ( KCons ( m , k )) in fun m → match m , c with | Lam ( x , m ), Imp ( a , b ) → check (( x , a ) :: env ) b m | Atom r , _ → infer r KNil 12 / 19

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