P r o p ist sehr nützlich für das Extrahieren von Programmen, da es uns ermöglicht, Teile von Code zu löschen, die unbrauchbar sind. Um zum Beispiel einen Sortieralgorithmus extrahieren wir die Aussage beweisen würden „für jede Liste ℓ gibt es eine Liste k , so dass k bestellt und k ist eine permutatiom von l “. Wenn wir dies in Coq aufschreiben und ohne P r o p extrahieren, erhalten wir:PropℓkkkℓProp
- „für alle ℓ gibt es k “ wird uns eine Karte , die Listen Listen nimmt,ℓk
sort
- "so dass k geordnet ist" gibt eine Funktion, die k durchläuft und prüft, ob es sortiert ist, undk
verify
k
- " k ist eine Permutation von ℓ " ergibt eine Permutation, die ℓ für k benötigt . Beachten Sie, dass dies nicht nur ein Mapping ist, sondern auch das inverse Mapping zusammen mit Programmen, die überprüfen, ob die beiden Maps wirklich invers sind.kℓ
pi
ℓkpi
Während das zusätzliche Zeug nicht völlig nutzlos ist, wollen wir es in vielen Anwendungen loswerden und einfach behalten sort
. Dies kann erreicht werden, wenn wir mit P r o p angeben, " k ist geordnet" und " k ist eine Permutation von ℓ ", aber nicht "für alle ℓ gibt es k ".Propkkℓℓk
Im Allgemeinen besteht eine übliche Methode zum Extrahieren von Code darin, eine Anweisung der Form ∀ x : A zu betrachten.∃ y : B.ϕ ( x , y ) wobei x eingegeben wird, y ausgegeben wird und ϕ ( x , y ) erklärt, was es bedeutet, dass y eine korrekte Ausgabe ist. (In dem obigen Beispiel A und B sind die Arten von Listen und φ ( l , k ) ist " k bestellt wirdund k ist eine Permutation von l ") Wenn φ in ist P r o p dann Extraktion eine Karte gibt f :∀x:A.∃y:B.ϕ(x,y)xyϕ(x,y)yABϕ(ℓ,k)kkℓϕPropA → B so, dass ϕ ( x , f ( x ) ) für alle x ∈ A gilt . Wenn φ in ist S e t dann bekommen wir auch eine Funktion g , so dass g ( x ) ist der Beweisdass φ ( x , f ( x ) ) gilt, für alle x ∈ Af:A→Bϕ(x,f(x))x∈AϕSetgg(x)ϕ(x,f(x))x∈A. Oft ist der Beweis rechnerisch nutzlos und wir ziehen es vor, ihn loszuwerden, besonders wenn er tief in einer anderen Anweisung verschachtelt ist. P r o p gibt uns die Möglichkeit dazu.Prop
Hinzugefügt am 29.07.2015: Es gibt eine Frage, ob wir P r o p ganz vermeiden könnten, indem wir automatisch "nutzlos extrahierten Code" wegoptimieren . Bis zu einem gewissen Grad können wir das tun, zum Beispiel ist der gesamte Code, der aus dem negativen Fragment der Logik extrahiert wurde (Material, das aus dem leeren Typ, dem Einheitentyp und den Produkten besteht), unbrauchbar, da er nur um die Einheit herumgemischt wird. Bei der Verwendung von P r o p müssen jedoch echte Designentscheidungen getroffen werden . Hier ist ein Beispiel simpe, wobei Σ bedeutet , dass wir in sind T y p e und ∃ bedeutet , dass wir in P r o p . Wenn wir aus extrahieren
PropPropΣType∃PropΠn:NΣb:{0,1}Σk:Nn=2⋅k+b
Πn:NΣb:{0,1}Σk:Nn=2⋅k+b
we will get a program which decomposes
nn into its lowest bit
bb and the remaining bits
kk, i.e., it computes everything. If we extract from
Πn:NΣb:{0,1}∃k:Nn=2⋅k+bΠn:NΣb:{0,1}∃k:Nn=2⋅k+b
then the program will only compute the lowest bit
bb. The machine cannot tell which is the correct one, the user has to tell it what he wants.