ELAN pour la récurrence en Coq

ELAN pour la r´
ecurrence en Coq
E. Deplagne, C. Kirchner, A. Martins-Moreira, F. Nahon et H. Nguyen
Motivation
• Automatisation de preuves par r´ecurrence
• Int´egration de techniques de r´ecurrence par r´e´ecriture au Coq
• La preuve est
– recherch´ee en ELAN
– v´erifi´ee en Coq
ELAN pour la r´ecurrence en Coq
2/??
Plan
• Sch´ema de coop´eration
• La r´ecurrence en Coq
• Sch´ema d’instanciation en ELAN
ELAN pour la r´ecurrence en Coq
3/??
Sch´
ema de coop´
eration
Eric Deplagne
Type inductif Coq
Inductive le type : Set :=
···
(*
le type
le type
le type
le type
*)
is defined
ind is defined
rec is defined
rect is defined
ELAN pour la r´ecurrence en Coq
5/??
Sch´
ema de r´
ecurrence structurelle
• le type ind, le type rec et le type rect
correspondent au sch´ema de r´ecurrence structurelle,
formul´e sur Prop, Set et Type respectivement.
• nat ind: (P : (nat−>P rop))(P O)−>((n : nat)(P n)−>(P (S n)))−>(n :
nat)(P n)
ELAN pour la r´ecurrence en Coq
6/??
D´
efinitions et but
• · · · (* R : d´efinitions de fonctions avec Parameter (ou autrement) *)
• Goal (x:le type)(G x).
– (* π : (x:le type)(G x) *)
ELAN pour la r´ecurrence en Coq
7/??
Premi`
eres ´
etapes
• Intro x.
• Pattern x.
– (* ([x0:le type](G x0) x) *)
• Apply le type ind.
– (* π = [x:le type](le type ind [x0:le type](G x0) (π1 x) · · · (πn x) x)*)
– (* πi: Gi *)
ELAN pour la r´ecurrence en Coq
8/??
Simplification des sous-buts
• (* Gi= le type −> (x1. . . xm) Hrec1 −> · · · −> Hrecm0 −> (G ti) *)
– Hrecj = (G t0j ) avec t0j <ti.
• Clear x.
– (* G0i= (x1. . . xm) Hrec1 −> · · · −> Hrecm0 −> (G ti) *)
– (* π = [x:le type](le type ind [x0:le type](G x0) π10 · · · πn0 x)
– (* πi0 : G0i *)
ELAN pour la r´ecurrence en Coq
9/??
Simplification des sous-buts (suite)
• Intros.
– (* πi0 = [X1 . . . Xm; Hrec1. . . Hrecm0 ](πi00 X1 · · · Xm Hrec1 · · · Hrecm0 )
– (* πi00: G0i *)
ELAN pour la r´ecurrence en Coq
10/??
Simplification des sous-buts (ELAN)
• −→ R
• −→ X1 −→ . . . −→ Xm
• −→ Hrec1 −→ . . . −→ Hrecm
• −→ (G ti)
• ..
• ←− πi00
ELAN pour la r´ecurrence en Coq
11/??
Perspectives
• Faire construire directement π par ELAN.
– En se basant sur le type ind.
– Librement (autre type de r´ecurrence).
ELAN pour la r´ecurrence en Coq
12/??
La r´
ecurrence en Coq
Nguyen Quang Huy
Preuve par r´
ecurrence : plusieurs choix ind´
ecidables
1. Les variables de r´ecurrence
2. Un principe de r´ecurrence (a.k.a. induction rule)
• sch´ema d’instanciation
• un ordre noeth´erien
ELAN pour la r´ecurrence en Coq
14/??
Preuve par r´
ecurrence en Coq
• Variable de r´ecurrence
– du type inductif
– fournie par l’utlisateur
• Principe de r´ecurrence par d´efaut
– sch´ema d’instanciation se base sur les constructeurs de type de la variable
– ordre de sous-terme strict
nat_ind
: (P:(nat->Prop))(P O)->((n:nat)(P n)->(P (S n)))->(n:nat)(P n)
• Tactique Elim g´en`ere deux sous-buts correspondant aux cas de base et cas de
r´ecurrence
• Le terme de preuve final comporte le principe de r´ecurrence, les variables de r´ecurrence
et les preuves de ces deux cas
ELAN pour la r´ecurrence en Coq
15/??
Sch´
ema d’instanciation
• D´emontrer un nouveau principe de r´ecurrence en Coq
Par exemple : la r´ecurrence double
nat_ind2
: (P:(nat->Prop))
(P O)->(P (S O))->((n:nat)(P n)->(P (S (S n))))->(n:nat)(P n)
• Utiliser ce principe dans la preuve
Elim x using nat ind2
ELAN pour la r´ecurrence en Coq
16/??
Ordre noeth´
erien
• Utiliser un autre ordre noeth´erien dans le principe de r´ecurrence
– d´efinir l’ordre
– d´emontrer sa propri´et´e noeth´erienne
• Utiliser ce principe dans la preuve
Elim x using (well founded ind type R).
o`
u R est une relation noeth´erienne sur le domaine type
well_founded_ind:
(A:Set; R:(A->A->Prop)) (well_founded A R)
->(P:(A->Prop))((x:A)((y:A)(R y x)->(P y))->(P x))->(a:A)(P a)
ELAN pour la r´ecurrence en Coq
17/??
Preuve de la propri´
et´
e noeth´
erienne
• Propri´et´e d’accessibilit´e : x est accessible pour la relation R ssi tous ses pr´ed´ecesseurs
le sont.
Inductive Acc [A : Set; R : A->A->Prop] : A->Prop :=
Acc_intro : (x:A)((y:A)(R y x)->(Acc A R y))->(Acc A R x)
• Propri´et´e noeth´erienne : R est noeth´erienne sur le type A ssi tous les ´el´ements de A
sont accessibles pour R.
well_founded =
[A:Set; R:(A->A->Prop)](a:A)(Acc A R a)
: (A:Set)(A->A->Prop)->Prop
ELAN pour la r´ecurrence en Coq
18/??
Construction d’un ordre noeth´
erien
Coq fournit des constructions pour construire des ordres noeth´eriens :
• wf clos trans : la clˆ
oture transitive d’un ordre noeth´erien est aussi noeth´erien
• wf inverse image
• wf disjoint sum
• wf union
• ...
ELAN pour la r´ecurrence en Coq
19/??
D´
emo
Vers une tactique ElanInduction
• Version semi-automatique :
N
th machine
– ElanInduction X R πR
– ElanInduction X P th machine
∗ X : liste de variables de r´ecurrence
∗ P : principe de r´ecurrence
∗ R : ordre noeth´erien
N
∗ πR
: preuve de la propri´et´e noeth´erienne de R
∗ th : syst`eme de r´e´ecriture
∗ machine : nom de machine o`
u le serveur ELAN est lanc´e
Par exemple : ElanInduction x lt lt wf peano 00localhost00.
ou bien : ElanInduction x nat ind2 peano 00localhost00.
• Version automatique : ElanInduction th machine
ELAN pour la r´ecurrence en Coq
21/??
Coop´
eration Coq/ELAN
• Coq
– Preuve du nouveau principe de r´ecurrence
– Preuve de la propri´et´e noeth´erienne du nouvel ordre
• ELAN
– Preuve des cas de base et cas de r´ecurrence
– Recherche de principe et des variables de r´ecurrence (pour la version automatique)
ELAN pour la r´ecurrence en Coq
22/??
Sch´
ema d’instanciation en ELAN
Anamaria Martins-Moreira
Application du sch´
ema d’instantiation en ELAN
Pour prouver un th´eor`eme th avec un syst`eme de r`egles R par induction sur une
variable v de type inductif type avec un sch´ema d’instantiation compos´e de
• k cas de base, Ci, i = 1..k, identifi´es par v = ci, i = 1..k, o`
u chaque ci est un terme
clos1 du type type.
• l pas d’induction Pi, i = 1..l, identifi´es par v = pi(v 0), i = 1..k, o`
u chaque pi(v 0) est
un terme qui correspond `a la construction de la valeur de v `a partir d’une nouvelle
variable v 0 (ou d’un ensemble de nouvelles variables).
1
est-ce que ¸ca pourrait ˆetre relax´e?
ELAN pour la r´ecurrence en Coq
24/??
Application du sch´
ema d’instantiation en ELAN - cont.
Pour chaque cas de base: d´efinir la substitution
σCi = {v 7→ ci}
et l’appliquer au th´eor`eme th, obtenant une instance thCi `a prouver par r´e´ecriture
avec R.
thCi = σCi (th)
ELAN pour la r´ecurrence en Coq
25/??
Application du sch´
ema d’instantiation en ELAN - cont.
Pour chaque pas d’induction: d´efinir les substitutions
σPi = {v 7→ pi(v 0)} et σHi = {v 7→ v 0}
et les appliquer au th´eor`eme th, obtenant une instance thPi `a prouver par r´e´ecriture
et une r`egle thHi `a ajouter au syst`eme R
thPi = σPi (th)
et
thHi = σHi (th)
R´e´ecrire thPi avec R ∪ {thHi } (orient´e de gauche `a droite, comme d’habitude)2, en
consid´erant v 0 comme une constante (la signature est donc aussi chang´ee).
2
flexibilisable?
ELAN pour la r´ecurrence en Coq
26/??
Intuition pour la constante v 0
L’´elimination de la variable v : type est faite en consid´erant que
∀v : type.(
k
_
v = ci) ∨ (
i=1
l
_
∃v 0 : type.v = pi(v 0))
i=1
ou
∀v : type.∃v 0 : type.(
k
_
i=1
v = ci) ∨ (
l
_
v = pi(v 0))
i=1
NOTE: la validit´e de cette formule ne suffit pas pour la validit´e du principe d’induction,
mais suffit pour la d´efinition des cas d’une preuve par cas. Sans le principe d’induction,
on n’aurait pas le droit d’utiliser les thHi dans la preuve de thPi . Le reste continuerait
valide.
ELAN pour la r´ecurrence en Coq
27/??
Exemple
L’´elimination de la variable v : nat:
∀v : nat.v = 0 ∨ ∃v 0 : nat.v = (Sv 0)
Donc, pour th : (x : nat)(nat plus 0 x) = x on a
• σ0 = {x 7→ 0} et
th0 = σ0(th) = (nat plus 0 0) = 0.
• σHS = {x 7→ x0} et
thHS = σHS (th) = (nat plus 0 x0) = x0.
• σPS = {x 7→ (Sx0)} et thPS = σPS (th) = (nat plus 0 (Sx0)) = (Sx0).
ELAN pour la r´ecurrence en Coq
28/??
Exemple 2
Inductive list: Set := nil:list | cons: nat -> list -> list.
Parameter sum_nil : (sum nil) = O.
Parameter sum_cons: (x:nat)(l:list) (sum (cons x l)) =
(nat_plus x (sum l)).
∀v : list.v = nil ∨ ∃n : nat, v 0 : list.v = (cons n v 0)
Donc, pour th : (l : list)(sum(cons 0 l)) = (sum l) on a
• σnil = {l 7→ nil} et
thnil = σnil(th) = (sum(cons 0 nil)) = (sum nil)
• σHcons = {l 7→ l0} et thHcons = (sum(cons 0 l0)) = (sum l0)
• σPcons = {l 7→ (cons n l0)} et
thPcons = (sum(cons 0 (cons n l0))) = (sum(cons n l0))
ELAN pour la r´ecurrence en Coq
29/??
Exemple 3
Inductive list: Set := [_]: nat -> list | app: list -> list -> list.
Parameter sum_[] : (x:nat) (sum [x]) = x.
Parameter sum_app: (l1,l2:list) (sum (app l1 l2)) =
(nat_plus (sum l1) (sum l2)).
∀v : list.∃n : nat.v = [n] ∨ ∃v 0, v 00 : list.v = (app v 0 v 00)
Donc, pour th : (l : list)(sum(app [0] l)) = (sum l) on a
• σ[] = {l 7→ [n]} et
th[] = σ[](th) = (sum(app [0] [n])) = (sum [n])
• σHapp = {l 7→ l0} et thHapp = (sum(app [0] l0)) = (sum l0)
• σPapp = {l 7→ (app l00 l0)} et
thPapp = (sum(app [0] (app l00 l0))) = (sum(app l00 l0))
ELAN pour la r´ecurrence en Coq
30/??
.spc
Inductive sort (e.g. nat ::= 0 | S x)
Induction Schema (e.g. nat_ind)
COQ
theory (defined operators and rules)
Elan Induction x nat_ind theory
theorem
.eln
pi
ELAN pour la r´ecurrence en Coq
31/??