est très utile pour l'extraction de programme car il nous permet de supprimer des parties de code inutiles. Par exemple, pour extraire un algorithmetri nous prouvons la déclaration « pour chaque liste ℓ il y a une liste k tel que k est ordonnée et k est un permutatiom de ℓ ». Si nous écrivons ceci en Coq et extrayons sans utiliser P r o p , nous aurons:PropℓkkkℓProp
- « pour tous il y a k » nous donnera une carte qui prend des listes de listes,ℓk
sort
- "tel que soit ordonné" donnera une fonction qui traversek
verify
et vérifie qu'elle est triée, etk
- « est une permutation de ℓ » donnera une permutation qui prend ℓ à k . Notez qu'il ne s'agit pas simplement d'une cartographie, mais également d'une cartographie inverse et de programmes vérifiant que les deux cartes sont réellement des inverses.kℓ
pi
ℓkpi
Bien que le contenu supplémentaire ne soit pas totalement inutile, dans de nombreuses applications, nous souhaitons nous en débarrasser et le conserver sort
. Ceci peut être accompli si nous utilisons à l' état « k est ordonnée » et « k est une permutation de ℓ », mais pas « pour tous ℓ il y a k ».Propkkℓℓk
En général, une manière commune au code extrait est de considérer une déclaration de la forme ∀x:A.∃y:B.ϕ(x,y) where x is input, y is output, and ϕ(x,y) explains what it means for y to be a correct output. (In the above example A and B are the types of lists and ϕ(ℓ,k) is "k is ordered and k is a permutation of ℓ.") If ϕ is in Prop then extraction gives a map f:A→B such that ϕ(x,f(x)) holds for all x∈A. If ϕ is in Set then we also get a function g such that g(x) is the proof that ϕ(x,f(x)) holds, for all x∈A. Often the proof is computationally useless and we prefer to get rid of it, especially when it is nested deeply inside some other statement. Prop gives us the possibility to do so.
PropProp. Here is a simpe example, where Σ means that we are in Type and ∃ means we are in Prop. If we extract from
Πn:NΣb:{0,1}Σk:Nn=2⋅k+b
nbkΠn:NΣb:{0,1}∃k:Nn=2⋅k+b
then the program will only compute the lowest bit
b. The machine cannot tell which is the correct one, the user has to tell it what he wants.