Elpi, the extension language for your ITP
Enrico Tassi Deducteam seminars - 2020
Elpi, the extension language for your ITP Enrico Tassi Deducteam - - PowerPoint PPT Presentation
Elpi, the extension language for your ITP Enrico Tassi Deducteam seminars - 2020 This talk is about Elpi, that is... An extension language its interpreter comes as a library with an API/FFI to write glue code A very high level,
Enrico Tassi Deducteam seminars - 2020
Feb 20, 2020 Enrico Tassi
– its interpreter comes as a library – with an API/FFI to write glue code
– Data with binders – Data with unification variables
Feb 20, 2020 Enrico Tassi
– ,Prolog 101: type checker for ,→ – ,Prolog + CHR 101: even & odd
Feb 20, 2020 Enrico Tassi
% HOAS of terms type app term → term → term. type lam (term → term) → term. % HOAS of types type arrow ty → ty → ty. % Example: identity function lam (x\ x) % Example: fst lam x\ lam y\ x
Feb 20, 2020 Enrico Tassi
pred of i:term, o:ty.
pi x\ of x S => of (F x) T. % Convention X % universally quantified around the rule Xi % not quantified (existentially quantified, globally)
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = ... Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow S1 T1 F1 = (x\ lam y\ app x y) Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow S1 T1 F1 = (x\ lam y\ app x y) Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow S1 (arrow S2 T2) F1 = (x\ lam y\ app x y) F2 = (y\ app c1 y) Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow S1 (arrow S2 T2) F1 = (x\ lam y\ app x y) F2 = (y\ app c1 y) Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow S1 (arrow S2 T2) F1 = (x\ lam y\ app x y) F2 = (y\ app c1 y) H3 = c1 A3 = c2 Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow (arrow S3 T2) (arrow S2 T2) F1 = (x\ lam y\ app x y) F2 = (y\ app c1 y) H3 = c1 S1 = (arrow S3 T2) A3 = c2 Program Goal Assignments
Feb 20, 2020 Enrico Tassi
pi x\ of x S => of (F x) T.
Q0 = arrow (arrow S2 T2) (arrow S2 T2) F1 = (x\ lam y\ app x y) F2 = (y\ app c1 y) H3 = c1 S1 = (arrow S3 T2) A3 = c2 S3 = S2 Program Goal Assignments
Feb 20, 2020 Enrico Tassi
g Goals rule “c” \ “d” | t <=> “g”. CHR “c”X “d”Y Constraints g :- g , ... g :- new_constraint c [X] … X = t … Clauses
1 2 3 1 2 3 4 4 4 4
dY
meta level PL level
Feb 20, 2020 Enrico Tassi
type zero nat. type succ nat -> nat. pred odd i:nat. pred even i:nat. pred double i:nat, o:nat. even zero.
even (succ X) :- odd X. even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X]. constraint even odd double { rule (even X) (odd X) <=> fail. rule (double _ X) <=> (even X). }
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
even X X = succ Y not (double Z Y) Program Goals (even X) (odd X) <=> fail. (double _ X) <=> (even X). Rules Constraint store even X, X = succ Y, not (double Z Y)
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
X = succ Y not (double Z Y) Program Goals Rules even f
X
Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
even (succ Y) not (double Z Y) Program Goals Rules Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
not (double Z Y) Program Goals Rules Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
not (double Z Y) Program Goals Rules
Y
Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
not ( ) Program Goals Rules
Y
double f
Z f Y
Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
not (even Y) Program Goals Rules
Y
double f
Z f Y
Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
not ( ) Program Goals Rules
Y
double f
Z f Y
even f
Y
Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
not ( fail ) Program Goals Rules Constraint store
Y
double f
Z f Y
even f
Y
even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
even zero.
even (succ X) :- odd X.
even X :- var X, new_constraint (even X) [X].
double zero zero. double (succ X) (succ (succ Y)) :- double X Y. double X Y :- var X, new_constraint (double X Y) [X].
Program Goals Rules
Y
Constraint store even X, X = succ Y, not (double Z Y) (even X) (odd X) <=> fail. (double _ X) <=> (even X).
Feb 20, 2020 Enrico Tassi
backward reasoning, search ✔ programming with binders recursively
forward reasoning ✔ manipulate (frozen) unification variables ✔ handle metadata on unification variables
Feb 20, 2020 Enrico Tassi
Feb 20, 2020 Enrico Tassi
–
predicate {{ nat → lp:X }} :- use X, print {{ bool → lp:X }}.
–
$ grep pred coq-builtin.elpi | wc -l
–
102
–
$ grep pred coq-lib.elpi | wc -l
–
37
–
Elpi Command foo
–
Elpi Tactic bar
Feb 20, 2020 Enrico Tassi