cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · gasp’s typed evaluation...

91
Gasp: an OCaml library for manipulating LF objects Matthias Puech 1 Univ Paris Diderot, Sorbonne Paris Cité, PPS, UMR 7126 CNRS, PiR2, INRIA Paris-Rocquencourt, F-75205 Paris, France Università di Bologna, Dipartimento di Informatica – Scienza e Ingegneria Workshop on Formal Meta-Theory LIX, March 6, 2013 1 joint work with Yann Régis-Gianas 1 / 32

Upload: others

Post on 29-Mar-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp: an OCaml libraryfor manipulating LF objects

Matthias Puech1

Univ Paris Diderot, Sorbonne Paris Cité, PPS, UMR 7126 CNRS, PiR2,INRIA Paris-Rocquencourt, F-75205 Paris, France

Università di Bologna, Dipartimento di Informatica – Scienza e Ingegneria

Workshop on Formal Meta-TheoryLIX, March 6, 2013

1joint work with Yann Régis-Gianas1 /32

Page 2: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificatesUsing Gasp

PresentationThe environment-free style

Implementing GaspTerm representationTyped evaluation

Incremental type checking

Perspectives

2 /32

Page 3: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificates

Incremental type checking

Perspectives

3 /32

Page 4: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Proof certificates

Witnesses of correctness of a computation,independently verifiable by a small trusted program

• a specification of f , e.g. ∀i.∃o. f(i) = o and P(i, o)• an untrusted oracle computing f(i) = ⟨o,π⟩• a trusted kernel deciding if π is a proof of P(i, o)

  reduces the trusted base of a computation

4 /32

Page 5: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

Trusted decision proceduresa.k.a tactics in interactive theorem provers (e.g. Coq)

• an untrusted procedure (e.g. tauto, omega)

• returns a proof term (e.g. in the CIC)

• verified at Qed. time by the kernel (De Bruijn criterion)

5 /32

Page 6: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

Certifying compilationa.k.a proof-carrying code [Necula, 1997]• source code that “doesn’t go wrong”

• an untrusted compiler

• returns a proof that target code “doesn’t go wrong” either

• verified by the client before executing

5 /32

Page 7: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

Safe type inferencea.k.a type reconstruction (e.g. Haskell→FC)

• a (complex) type inference procedure

val infer: expr→ bool

• a (simpler) type checking procedure

val check : church→ bool

5 /32

Page 8: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

Safe type inferencea.k.a type reconstruction (e.g. Haskell→FC)

• a (complex) type inference procedure

val infer: expr→ church• a (simpler) type checking procedure

val check : church→ bool

5 /32

Page 9: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

Safe type inferencea.k.a type reconstruction (e.g. Haskell→FC)

• a (simple) declarative type system

Sub

`M : A′ ` A′ ≤ A`M : A

• a (complex) syntax-directed, equivalent version

AppSub

`M : A→ B ` N : A′ ` A′ ≤ A`M N : B

5 /32

Page 10: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Certifying software

certified program together with proof that it respects thespecification on all input (Coq, Beluga. . . )

certifying black box, emits a proof certificate verifiable aposteriori, but not guaranteed to be correct

Advantages of the certifying scheme

• same safety (but different quality of implementation)

• program source need not be revealed

• more lightweight (partial formalization)e.g. no verification of graph coloring, term indexing. . .

6 /32

Page 11: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Certifying software

certified program together with proof that it respects thespecification on all input (Coq, Beluga. . . )

certifying black box, emits a proof certificate verifiable aposteriori, but not guaranteed to be correct

Advantages of the certifying scheme

• same safety (but different quality of implementation)

• program source need not be revealed

• more lightweight (partial formalization)e.g. no verification of graph coloring, term indexing. . .

6 /32

Page 12: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Representing syntax in LF [Harper et al., 1993]

LF is a universal representation language, for formal systemsfeaturing hypothetical/parametrical reasoninglike HTML for structured documents

• systems (resp. derivations) encoded into signatures (resp. objects)

• dependently-typed λ-calculus (λΠ)

• higher-order abstract syntax

7 /32

Page 13: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Representing syntax in LF [Harper et al., 1993]

Example (Encoding natural deductions)

[` A]...` B ImpI` A⊃ B

ImpE` A⊃ B ` A

` B

=

prop : ∗.p : prop. q : prop.imp : prop→ prop→ prop.pf : prop→ ∗.ImpI : ΠAB : prop.

(pf A→ pf B)→ pf (imp A B).ImpE : ΠAB : prop.

pf (imp A B)→ pf A→ pf B.

[` p]ImpI` q⊃ p

ImpI` p⊃ q⊃ p

=

ImpI p (imp q p)(λx. ImpI q p (λy. x))

!

7 /32

Page 14: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Computing LF objects?

QuestionHow to write programs which values are LF objects?

In this talk. . .An OCaml library to ease programming with proof certificates:

• general purpose functional PL

• large corpus of libraries

• only simply-typed (ADT)

Not a system, a facility to implement systems

Yet another“last implementation of substitution & LF type-checking”

8 /32

Page 15: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Computing LF objects?

QuestionHow to write programs which values are LF objects?

In this talk. . .An OCaml library to ease programming with proof certificates:

• general purpose functional PL

• large corpus of libraries

• only simply-typed (ADT)

Not a system, a facility to implement systems

Yet another“last implementation of substitution & LF type-checking”

8 /32

Page 16: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificatesUsing GaspImplementing Gasp

Incremental type checking

Perspectives

9 /32

Page 17: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificatesUsing GaspImplementing Gasp

Incremental type checking

Perspectives

10 /32

Page 18: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp: an OCaml library to manipulate LF objects

An implementation of LF. . .

• a type of LF objects obj• a type of signatures sign• a concrete syntax with quotations and anti-quotations

. . . where signatures can declare functions symbols f

• their code is untyped OCaml code (type obj)can use e.g. pattern-matching, exceptions, partiality. . .

• their LF types act as a specificationsdynamically checked at run time

11 /32

Page 19: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp: an OCaml library to manipulate LF objects

An implementation of LF. . .

• a type of LF objects obj• a type of signatures sign• a concrete syntax with quotations and anti-quotations

. . . where signatures can declare functions symbols f

• their code is untyped OCaml code (type obj)can use e.g. pattern-matching, exceptions, partiality. . .

• their LF types act as a specificationsdynamically checked at run time

11 /32

Page 20: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

supported by CamlP4:

• a parser for OCaml expressionsparsee : string→ Ocaml.expr

• a parser for LF objects and signaturesparseq : string→ OCaml.expr (* of type obj *)

• parsee replaces strings s between « . . . » by parseq s(quotations)

• parseq replaces strings s between ". . . " by parsee s(antiquotations)

then use parsee to parse main program (ocamlc -pp)

12 /32

Page 21: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

Examples

• («sign prop : ∗. imp : prop→ prop→ prop. » : sign)

  [("prop", KType);("imp", Arr (Atom ("prop", [])) (Arr . . . ))]

• let f : obj→ obj = fun x→ « imp "x" "x" »  let f : obj→ obj = fun x→ Atom ("imp", [x, x])

• «conj ("f « disj p q »") ("f « p »") »  Atom ("conj", [

f (Atom ("disj", [Atom ("p", []), Atom ("q", [])]),f (Atom "p", [])])

12 /32

Page 22: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

Examples

• («sign prop : ∗. imp : prop→ prop→ prop. » : sign)  [("prop", KType);

("imp", Arr (Atom ("prop", [])) (Arr . . . ))]

• let f : obj→ obj = fun x→ « imp "x" "x" »  let f : obj→ obj = fun x→ Atom ("imp", [x, x])

• «conj ("f « disj p q »") ("f « p »") »  Atom ("conj", [

f (Atom ("disj", [Atom ("p", []), Atom ("q", [])]),f (Atom "p", [])])

12 /32

Page 23: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

Examples

• («sign prop : ∗. imp : prop→ prop→ prop. » : sign)  [("prop", KType);

("imp", Arr (Atom ("prop", [])) (Arr . . . ))]• let f : obj→ obj = fun x→ « imp "x" "x" »

  let f : obj→ obj = fun x→ Atom ("imp", [x, x])• «conj ("f « disj p q »") ("f « p »") »  Atom ("conj", [

f (Atom ("disj", [Atom ("p", []), Atom ("q", [])]),f (Atom "p", [])])

12 /32

Page 24: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

Examples

• («sign prop : ∗. imp : prop→ prop→ prop. » : sign)  [("prop", KType);

("imp", Arr (Atom ("prop", [])) (Arr . . . ))]• let f : obj→ obj = fun x→ « imp "x" "x" »  let f : obj→ obj = fun x→ Atom ("imp", [x, x])

• «conj ("f « disj p q »") ("f « p »") »  Atom ("conj", [

f (Atom ("disj", [Atom ("p", []), Atom ("q", [])]),f (Atom "p", [])])

12 /32

Page 25: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

Examples

• («sign prop : ∗. imp : prop→ prop→ prop. » : sign)  [("prop", KType);

("imp", Arr (Atom ("prop", [])) (Arr . . . ))]• let f : obj→ obj = fun x→ « imp "x" "x" »  let f : obj→ obj = fun x→ Atom ("imp", [x, x])

• «conj ("f « disj p q »") ("f « p »") »

  Atom ("conj", [f (Atom ("disj", [Atom ("p", []), Atom ("q", [])]),f (Atom "p", [])])

12 /32

Page 26: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

(Anti-)Quotations

Examples

• («sign prop : ∗. imp : prop→ prop→ prop. » : sign)  [("prop", KType);

("imp", Arr (Atom ("prop", [])) (Arr . . . ))]• let f : obj→ obj = fun x→ « imp "x" "x" »  let f : obj→ obj = fun x→ Atom ("imp", [x, x])

• «conj ("f « disj p q »") ("f « p »") »  Atom ("conj", [

f (Atom ("disj", [Atom ("p", []), Atom ("q", [])]),f (Atom "p", [])])

12 /32

Page 27: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Declared functions

Σ ::= ·�

� Σ,c : A�

� Σ,a : K�

�Σ, f : A= “T”

. . . where T is an OCaml expression of type |A|:

|P|= obj|Πx : A. B|= obj→ |B|

. . . and objects can refer to them:

H ::= x�

� c�

� f

Specification A is checked at run time just before/after executingcode T.

13 /32

Page 28: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp’s interface

module Gasp = structtype objtype sign. . .val empty : signval (++) : sign→ sign→ signval eval : ?env:env→ sign→ obj→ obj

end

14 /32

Page 29: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# let s = «sign

tm : ∗. app : tm→ tm→ tm. lam : (tm→ tm)→ tm.eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".

» ;;

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) »

# let s = s ++ «sign

weak : tm→ tm = " function| « lam "m" »→ « lam "m" »| « app "m" "n" »→

let « lam "p" » = « weak "m" » in« weak ("p" "n") »".

» ;;

# eval s « weak (app (lam (λx. x)) (lam (λx. x))) » ;;- : obj = « lam (λx. x) »

15 /32

Page 30: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# let s = «sign

tm : ∗. app : tm→ tm→ tm. lam : (tm→ tm)→ tm.eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".

» ;;

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) »

# let s = s ++ «sign

weak : tm→ tm = " function| « lam "m" »→ « lam "m" »| « app "m" "n" »→

let « lam "p" » = « weak "m" » in« weak ("p" "n") »".

» ;;

# eval s « weak (app (lam (λx. x)) (lam (λx. x))) » ;;- : obj = « lam (λx. x) »

15 /32

Page 31: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# let s = «sign

tm : ∗. app : tm→ tm→ tm. lam : (tm→ tm)→ tm.eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".

» ;;

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) »

# let s = s ++ «sign

weak : tm→ tm = " function| « lam "m" »→ « lam "m" »| « app "m" "n" »→

let « lam "p" » = « weak "m" » in« weak ("p" "n") »".

» ;;

# eval s « weak (app (lam (λx. x)) (lam (λx. x))) » ;;- : obj = « lam (λx. x) »

15 /32

Page 32: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# let s = «sign

tm : ∗. app : tm→ tm→ tm. lam : (tm→ tm)→ tm.eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".

» ;;

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) »

# let s = s ++ «sign

weak : tm→ tm = " function| « lam "m" »→ « lam "m" »| « app "m" "n" »→

let « lam "p" » = « weak "m" » in« weak ("p" "n") »".

» ;;

# eval s « weak (app (lam (λx. x)) (lam (λx. x))) » ;;- : obj = « lam (λx. x) »

15 /32

Page 33: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# let s = s ++ «sign

tp : ∗.nat : tp.arr : tp→ tp→ tp.is : tm→ tp→ ∗.App : ΠM N : tm. ΠAB : tp.

is M (arr A B)→ is N A→ is (app M N) B.Lam : ΠM : tm → tm. ΠAB : tp. ΠB : tp.

(Πx : tm. is x A→ is (M x) B)→ is (lam A λu. M u) (arr A B).inf : tm→ ∗.ex : ΠM : tm. ΠA : tp. is M A→ inf M.

infer : ΠM : tm. inf M = " ... ".» ;;

15 / 32

Page 34: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# eval s « infer (lam nat λx. x) » ;;- : obj = « ex (lam λx. x) (arr nat nat)

(Lam (λx. x) nat nat (λx.λh. h)) »

# eval s « infer (lam nat λx.app x x) » ;;Exception: Failure "non-functional application"

(* my term is ill-typed *)

# eval s « infer (lam nat λx. ...) » ;;Exception: Type_error(« λx. x »)

(* there’s a bug in my type checker *)

15 /32

Page 35: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# eval s « infer (lam nat λx. x) » ;;- : obj = « ex (lam λx. x) (arr nat nat)

(Lam (λx. x) nat nat (λx.λh. h)) »

# eval s « infer (lam nat λx.app x x) » ;;Exception: Failure "non-functional application"

(* my term is ill-typed *)

# eval s « infer (lam nat λx. ...) » ;;Exception: Type_error(« λx. x »)

(* there’s a bug in my type checker *)

15 /32

Page 36: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Examples

# eval s « infer (lam nat λx. x) » ;;- : obj = « ex (lam λx. x) (arr nat nat)

(Lam (λx. x) nat nat (λx.λh. h)) »

# eval s « infer (lam nat λx.app x x) » ;;Exception: Failure "non-functional application"

(* my term is ill-typed *)

# eval s « infer (lam nat λx. ...) » ;;Exception: Type_error(« λx. x »)

(* there’s a bug in my type checker *)

15 /32

Page 37: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Computing on open objects?

Consider the size function | · | defined recursively on λ-terms:

|x|= 0

|λx. M|= |M|+ 1

|M N|= |M|+ |N|+ 1

Can we code it as follows?

size : tm→ nat = "fun m→ match m with| « x »→ « o »| « app "m" "n" »→ « s (plus (size "m") (size "n")) »| « lam λx. "m" »→ « s (size "m") » ".

• m has a free variable

• I have access to the name of variables

16 /32

Page 38: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Computing on open objects?

Consider the size function | · | defined recursively on λ-terms:

|x|= 0

|λx. M|= |M|+ 1

|M N|= |M|+ |N|+ 1

Can we code it as follows?

size : tm→ nat = "fun m→ match m with| « x »→ « o »| « app "m" "n" »→ « s (plus (size "m") (size "n")) »| « lam λx. "m" »→ « s (size "m") » ".

• m has a free variable

• I have access to the name of variables

16 /32

Page 39: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Computing on open objects?

Consider the size function | · | defined recursively on λ-terms:

|x|= 0

|λx. M|= |M|+ 1

|M N|= |M|+ |N|+ 1

Can we code it as follows?

size : tm→ nat = "fun m→ match m with| « x »→ « o »| « app "m" "n" »→ « s (plus (size "m") (size "n")) »| « lam λx. "m" »→ « s (size "m") » ".

• m has a free variable

• I have access to the name of variables

16 /32

Page 40: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Computing on open objects?

ExampleContextual types to the rescue. In Beluga:

rec size : {g:ctx} [g. tm]→ [. nat] =mlam g⇒ fn t⇒ case t of| [g. #p ..]⇒ [. o]| [g. lam λx. T .. x]⇒

let [. N] = size [g, x:tm] [g, x. T .. x ] in [. s N]| [g. app (T ..) (U ..)]⇒

let [. N] = plus (size [g] [g. T ..]) (size [g] [g. U ..]) in [. s N] ;

Environment of terms is tracked and checked throughout the term.No encoding directly in OCaml

16 /32

Page 41: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Inspiration

Traditional type-checking algorithm

LamΓ, x : A `M : B

Γ ` λx : A. M : A→ B

AppΓ `M : A→ B Γ ` N : A

Γ `M N : B

Varx : A ∈ ΓΓ ` x : A

infer : env→ tm→ tp

17 /32

Page 42: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Inspiration

Environment-free algorithm [Geuvers et al., 2010, Boespflug, 2011]

EFLam

`M[x/infer0 A] : B` λx : A. M : A→ B

EFApp`M : A→ B ` N : A

`M N : B

EFAnnot

` infer0 A : A

infer : tm→ tpinfer0 : tp→ tm

“substitute variables by their computed type”

17 /32

Page 43: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

The environment-free style

PropositionConsider size only called on closed objects (no variable case),introduce function inverse size0 : nat→ tm feeding output back toinput

size : tm→ nat = "fun m→ match m with| « app "m" "n" »→ « s (plus (size "m") (size "n")) »| « lam "f" »→ « s (size ("f" (size0 o))) » ".

Add contraction to the reduction

size (size0 M) = M

18 /32

Page 44: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

The environment-free style

GeneralizationThe environment-free style: during computation, objects are closedby the expected result on their variables

Ø to each function f : A→ B, a function inverse f0 : B→ AØ the adequate reduction: f ◦ f0 = id

Ø all patterns are of the form P ::= “x” | c P. . . P

18 /32

Page 45: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

The environment-free style

ExampleSimple types inference, à la Church

# let s = s ++ «sign

tp : ∗. nat : tp. arr : tp→ tp→ tp.

infer : tm→ tp = " function| « app "m" "n" »→match eval « infer "m" » with

| « arr "a" "b" » when a = eval « infer "n" »→ b| _→ failwith "non-functional application"

| « lam "a" "f" »→ « infer ("f" (infer0 "a")) »» ;;

18 /32

Page 46: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

The environment-free style

ExampleNaïve full evaluation

# let s = s ++ «sign

full : tm→ tm = " function| « app "m" "n" »→ match eval « full "m" » with

| « lam "f" »→ « full ("f" "n") »| « app "m" "n’" »→ « app (app "m" "n") "n’" »

| « lam "f" »→ « lam λx. ("f" (full0 x)) » ".» ;;

18 /32

Page 47: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

n-ary inverses

Generalization to n-ary functions f : A0→ . . . → An→ A

• n inverses f0 : A→ A0, . . . , fn : A→ An

• reduction rule: f (f0 M) . . . (fn M)=M

Example

# let s = s ++ «sign

equals : tm→ tm→ bool = " fun m n→ match m, n with| « app "m1" "m2" », « app "n1" "n2" »→

« and (equals "m1" "n1") (equals "m2" "n2") »| « lam "f" », « lam "g" »→

« equals ("f" (equals0 true)) ("g" (equals1 true)) » ".» ;;

19 /32

Page 48: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Dependent inverses

ProblemWhat is the inverse of infer : Πx : tm. inf x ?

Proposition

Generalization: abstract by dependent arguments

infer0 : inf x→ tm

20 /32

Page 49: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Dependent inverses

ProblemWhat is the inverse of infer : Πx : tm. inf x ?

Proposition

Generalization: abstract by dependent arguments

infer0 : inf x→ tm

20 /32

Page 50: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Dependent inverses

ProblemWhat is the inverse of infer : Πx : tm. inf x ?

PropositionGeneralization: abstract by dependent arguments

infer0 : Πx : tm. inf x→ tm

20 /32

Page 51: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Dependent inverses

Example

infer : ΠM : tm. inf M = " fun m→ match m with| « app "m" "n" »→

let « ex "_" (arr "a" "b") "d1" » = eval « infer "m" » inlet « ex "_" "a’" "d2" » = eval « infer "n" » in« ex (app "m" "n") "b"

(App "m" "n" "a" "b" "d1" "d2") »| « lam "a" "m" »→

let « ex "_" "b" "d" » = eval ~env:«env x : tm; h : is x "a" »« infer ("m" (infer0 x (ex x "a" h))) » in

« ex (lam "a" "m") (arr "a" "b")(Lam "m" "a" "b" (λx.λh. "d")) »

20 /32

Page 52: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificatesUsing GaspImplementing Gasp

Incremental type checking

Perspectives

21 /32

Page 53: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Safe renaming & substitution in Gasp

With bare OCaml functions

# let eta m = « lam λx. (app "m" x) » ;;eta : obj→ obj = <fun>

# « lam (λx. "eta « x »") » ;;- : obj = « lam (λx. lam (λx.app x x)) » (* x captured *)

With Gasp functions

# let s = s ++ «sign

eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".» ;;s : sign = . . .

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) » (* x protected *)

22 /32

Page 54: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Safe renaming & substitution in Gasp

With bare OCaml functions

# let eta m = « lam λx. (app "m" x) » ;;eta : obj→ obj = <fun>

# « lam (λx. "eta « x »") » ;;

- : obj = « lam (λx. lam (λx.app x x)) » (* x captured *)

With Gasp functions

# let s = s ++ «sign

eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".» ;;s : sign = . . .

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) » (* x protected *)

22 /32

Page 55: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Safe renaming & substitution in Gasp

With bare OCaml functions

# let eta m = « lam λx. (app "m" x) » ;;eta : obj→ obj = <fun>

# « lam (λx. "eta « x »") » ;;- : obj = « lam (λx. lam (λx.app x x)) » (* x captured *)

With Gasp functions

# let s = s ++ «sign

eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".» ;;s : sign = . . .

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) » (* x protected *)

22 /32

Page 56: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Safe renaming & substitution in Gasp

With bare OCaml functions

# let eta m = « lam λx. (app "m" x) » ;;eta : obj→ obj = <fun>

# « lam (λx. "eta « x »") » ;;- : obj = « lam (λx. lam (λx.app x x)) » (* x captured *)

With Gasp functions

# let s = s ++ «sign

eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".» ;;s : sign = . . .

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) » (* x protected *)

22 /32

Page 57: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Safe renaming & substitution in Gasp

With bare OCaml functions

# let eta m = « lam λx. (app "m" x) » ;;eta : obj→ obj = <fun>

# « lam (λx. "eta « x »") » ;;- : obj = « lam (λx. lam (λx.app x x)) » (* x captured *)

With Gasp functions

# let s = s ++ «sign

eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".» ;;s : sign = . . .

# eval s « lam (λx. eta x) » ;;

- : obj = « lam (λx. lam (λx’.app x x’)) » (* x protected *)

22 /32

Page 58: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Safe renaming & substitution in Gasp

With bare OCaml functions

# let eta m = « lam λx. (app "m" x) » ;;eta : obj→ obj = <fun>

# « lam (λx. "eta « x »") » ;;- : obj = « lam (λx. lam (λx.app x x)) » (* x captured *)

With Gasp functions

# let s = s ++ «sign

eta : tm→ tm = "fun m→ « lam (λx.app "m" x) »".» ;;s : sign = . . .

# eval s « lam (λx. eta x) » ;;- : obj = « lam (λx. lam (λx’.app x x’)) » (* x protected *)

22 /32

Page 59: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Two-level, locally named term representation

Abstract levelAbstract objects aobj are represented by standard canonical,spine-form λ-terms

M ::= λx. M�

� H (S)

H ::= c�

� f�

� fn�

� #n

S ::= ·�

� M, S

• variables are numbered (De Bruijn indices)

• no free variables

• abstract objects are type-checked

23 /32

Page 60: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Two-level, locally named term representation

Concrete levelConcrete objects obj are represented by usual (non-canonical)λ-terms with two kinds of variables:

T ::= id�

� #n�

� λx. T�

� T T

• free variables n are numbered (protected against capture)

• bound variables/constants id are named (written by the user)

• concrete objects are parsed and computed by functions

23 /32

Page 61: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Two-level, locally named term representation(Un)Stratification

objobjectsConcrete

aobjobjectsAbstract

unstratstrat

• strat : sign→ env→ obj→ aobjÉ distinguishes constants/functions/variablesÉ normalizes object

(hereditary substitutions, e.g. eval ("p" "n"))

• unstrat : env→ aobj→ objÉ distinguishes free/bound variablesÉ freshens names

23 /32

Page 62: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Two-level, locally named term representation

Example

#0eta.xλlam #0eta.xλlam

xx.etaλlam

#0 xx.#0λlam

)#0)#1.xλ(lam.xλ(lam ·

x’x’.xλx.lamλlam

unstratstrat

eta

unstrat

eval

strat

23 /32

Page 63: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp’s typed evaluation

EvaluationHow to evaluate an object containing function symbols?

• full evaluation, e.g. «lam (λx. eta x)»

• call-by-value (contraction), e.g. « size (id (size0 o)) »

• weak evaluation first, e.g. « f (lam λx. f x)»

  “full evaluation by iterated symbolic weak evaluation”, a.k.anormalization-by-evaluation(adapted from Grégoire and Leroy [2002])

24 /32

Page 64: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp’s typed evaluation

EvaluationHow to evaluate an object containing function symbols?

• full evaluation, e.g. «lam (λx. eta x)»

• call-by-value (contraction), e.g. « size (id (size0 o)) »

• weak evaluation first, e.g. « f (lam λx. f x)»

  “full evaluation by iterated symbolic weak evaluation”, a.k.anormalization-by-evaluation(adapted from Grégoire and Leroy [2002])

24 /32

Page 65: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp’s typed evaluation

TypingWhen to type-check the LF objects?

• checking the objects a posteriori is not precise enoughe.g. | « app "m" "n" »→ « z (plus (size "m") (size "n")) »

• errors must be detected early (during prototyping)# eval « size (lam λx.app x (app x x))»  « z (z (z o)) »

We want to identify failures as soon as possible

  typed evaluation: typing and evaluation are the same processeval (“on-the-fly”, dynamic typing?)

Ø inputs and outputs of functions are type-checked before andafter execution

Ø issued certificates are guaranteed to be correct

Ø errors are signaled where the certificate is ill-typed

24 /32

Page 66: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp’s typed evaluation

TypingWhen to type-check the LF objects?

• checking the objects a posteriori is not precise enoughe.g. | « app "m" "n" »→ « z (plus (size "m") (size "n")) »

• errors must be detected early (during prototyping)# eval « size (lam λx.app x (app x x))»  « z (z (z o)) »

We want to identify failures as soon as possible

  typed evaluation: typing and evaluation are the same processeval (“on-the-fly”, dynamic typing?)

Ø inputs and outputs of functions are type-checked before andafter execution

Ø issued certificates are guaranteed to be correct

Ø errors are signaled where the certificate is ill-typed

24 /32

Page 67: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Gasp’s typed evaluation

OverviewJudgments:

• Γ `M : A ↓M′: weak typed evaluation

• Γ `M : A ⇓M′: full typed evaluation

• Γ `M : A ↑M′: readback

FEvalInv

f : A= “T” ∈ Σ Γ; A ` S ↓ f0 (S), . . . , fn (S) : PΓ ` f (S) ↓ πn(A) ? S : P

FEval

f : A= “T” ∈ ΣΓ; A ` S ↓ S′ : P

S′ 6= f0 (S0), . . . , fn (Sn)Γ ` T ? S′ ↓ F : P

Γ ` f (S) ↓ F : P

24 /32

Page 68: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificates

Incremental type checking

Perspectives

25 /32

Page 69: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Interaction in typed program elaboration

Observations

• typed program elaboration an interaction

programmer↔ type checker

• the richer the type system is, the more expensive typechecking gets (e.g. Haskell, Agda)

• typing is a batch process (part of compilation)

• yet, it is fed repeatedly with similar input (versions)

26 /32

Page 70: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Interaction in typed program elaborationExample

26 /32

Page 71: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Interaction in typed program elaborationExample

26 /32

Page 72: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Interaction in typed program elaborationExample

26 /32

Page 73: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Incremental type checkingQuestion

How can we make type checking incremental?

DefinitionGiven a list of well-typed programs M0, M1,. . . M and therepresentation of a change δ, decide whether apply(M,δ) iswell-typed in less than O(|apply(M,δ)|).

Hint

• save intermediate type information between runs (context)

• use this information in changes

27 /32

Page 74: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Incremental type checkingQuestion

How can we make type checking incremental?

DefinitionGiven a list of well-typed programs M0, M1,. . . M and therepresentation of a change δ, decide whether apply(M,δ) iswell-typed in less than O(|apply(M,δ)|).

Hint

• save intermediate type information between runs (context)

• use this information in changes

27 /32

Page 75: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Incrementality by derivation reuse

PropositionThe witness of type checking is a derivation: use it as context

[` f : nat→ nat] [` x : nat]` f x : nat

` λx. f x : nat→ nat` λf x. f x : (nat→ nat)→ nat→ nat

[` x : nat]` s(x) : nat

` λx. s(x) : nat→ nat` (λf x. f x) (λx. s(x)) : nat

` o : nat` s(o) : nat

` (λf x. f x) (λx. s(x)) (s(o)) : nat

• it contains all intermediate type information

• it is compositional

28 /32

Page 76: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Incrementality by derivation reuse

PropositionA certifying type checker in Gasp computes pieces of derivations

M

−−−−−−−−−←0infer

→−−−−−−−−infer

A:M`

We need a way to

• address any subderivation

• reuse them in programs M using inverses

28 /32

Page 77: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Incrementality by derivation reuse

PropositionA certifying type checker in Gasp computes pieces of derivations

M

−−−−−−−−−←0infer

→−−−−−−−−infer

A:M`

We need a way to

• address any subderivation

• reuse them in programs M using inverses

28 /32

Page 78: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Naming and sharing LF objects

Contribution

• a conservative extension of LF based on Contextual ModalType Theory [Nanevski et al., 2008] where objects are sliced ina context ∆ of metavariables X

• every well-typed applicative subterm gets a metavariablename and can be reused by instantiation

ExampleThe object lam (λx. lam (λy.app (x,app (x, y))))is sliced into Xin the context

∆=

X : tm= lam (λx. Y[x/x])Y[x : tm] : tm= lam (λy. Z[x/x, y/app (x, y)])Z[x : tm, y : tm] : tm= app (x, y)

29 /32

Page 79: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Naming and sharing LF objects

Contribution

• a conservative extension of LF based on Contextual ModalType Theory [Nanevski et al., 2008] where objects are sliced ina context ∆ of metavariables X

• every well-typed applicative subterm gets a metavariablename and can be reused by instantiation

ExampleThe object lam (λx. lam (λy.app (x,app (x, y))))is sliced into Xin the context

∆=

X : tm= lam (λx. Y[x/x])Y[x : tm] : tm= lam (λy. Z[x/x, y/app (x, y)])Z[x : tm, y : tm] : tm= app (x, y)

29 /32

Page 80: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

#

#

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 81: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

#

#

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 82: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ((λf .λx. f x) (λy. s y) (s (s o)))

#

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 83: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ( X Y (s Z))

#

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 84: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ((infer0 X) (infer0 Y) (s (infer0 Z)))

#

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 85: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ((infer0 X) (infer0 Y) (s (infer0 Z)))

# infer ((λf .λx. f x) (λy. s (s y)) (s o))

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 86: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ((infer0 X) (infer0 Y) (s (infer0 Z)))

# infer ((infer0 X) (λy. s (infer0 T)) (infer0 Z))

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 87: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ((infer0 X) (infer0 Y) (s (infer0 Z)))

# infer ((infer0 X) (λy. s (infer0 T[h/infer y])) (infer0 Z))

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 88: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Example

# infer ((λf .λx. f x) (λy. s y) (s o))  ⟨nat, U⟩

X` λf .λx. f x : nat→nat→nat

Y` λy. s y : nat→nat

Z` s o : nat

[`y : nat]T

` s y : nat

# infer ((infer0 X) (infer0 Y) (s (infer0 Z)))

# infer ((infer0 X) (λy. s (infer0 T[h/infer y])) (infer0 Z))

Summary

Ø Gasp: certifying type checker −→ incremental type checking

Ø sharing computation results by function inverses

Ø a safe approach: (shared) type derivation always available

30 /32

Page 89: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Outline

Motivations

Programming with proof certificates

Incremental type checking

Perspectives

31 /32

Page 90: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

Perspectives

• implement LF type reconstruction

• isolate higher-order term manipulation libraryput the locally named pattern into practice

• investigate typing of inverse functionsand their relation with NbE

• front-end editor generating deltas (“structured editor”)safe refactoring tools, typed version control

• LCF-style interactive theorem prover based on LFtactics as OCaml functions

32 /32

Page 91: cedric.cnam.frcedric.cnam.fr/~puechm/meta_slides.pdf · 2017-02-07 · Gasp’s typed evaluation Typing When to type-check the LF objects? checking the objects a posteriori is not

M. Boespflug. Conception d’un noyau de vérification de preuves pourle lambda-Pi-calcul modulo. PhD thesis, École Polytechnique,Palaiseau, January 2011.

H. Geuvers, R. Krebbers, J. McKinna, and F. Wiedijk. Pure typesystems without explicit contexts. arXiv preprintarXiv:1009.2792, 2010.

B. Grégoire and X. Leroy. A compiled implementation of strongreduction. In Proceedings of the seventh ACM SIGPLANinternational conference on Functional programming, pages235–246. ACM, 2002.

R. Harper, F. Honsell, and G. Plotkin. A framework for defininglogics. Journal of the Association for Computing Machinery, 40(1):143–184, 1993.

A. Nanevski, F. Pfenning, and B. Pientka. Contextual modal typetheory. ACM Transactions on Computational Logic (TOCL), 9(3):23, 2008.

G.C. Necula. Proof-carrying code. In Proceedings of the 24th ACMSIGPLAN-SIGACT symposium on Principles of programminglanguages, pages 106–119. ACM, 1997.

32 /32