Warum hat Coq Prop?

35

Coq hat eine Art Prop of Proof irrelevante Aussagen, die während der Extraktion verworfen werden. Was ist der Grund dafür, wenn wir Coq nur für Proofs verwenden? Prop ist aussagekräftig, daher leitet Coq jedoch automatisch Universumsindizes ein, und wir können stattdessen überall Type (i) verwenden. Es scheint, dass Prop alles sehr kompliziert macht.

Ich habe gelesen, dass es in Luos Buch philosophische Gründe gibt, Set und Prop zu trennen, aber ich habe sie nicht in dem Buch gefunden. Was sind Sie?

Konstantin Solomatov
quelle
6
"Wenn wir Coq nur für Beweise verwenden": Ich denke, Sie haben hier einen wichtigen Punkt identifiziert. Coq wird nicht nur für Proofs verwendet.
Gilles 'SO- hör auf böse zu sein'

Antworten:

34

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:PropkkkProp

  1. „für alle gibt es k “ wird uns eine Karte , die Listen Listen nimmt,ksort
  2. "so dass k geordnet ist" gibt eine Funktion, die k durchläuft und prüft, ob es sortiert ist, undkverifyk
  3. " 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.kpikpi

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 ".Propkkk

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:ABϕ(x,f(x))xAϕSetgg(x)ϕ(x,f(x))xA. 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ΣTypePropΠn:NΣb:{0,1}Σk:Nn=2k+b

Πn:NΣb:{0,1}Σk:Nn=2k+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=2k+b
Πn:NΣb:{0,1}k:Nn=2k+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.
Andrej Bauer
quelle
1
I'm slightly confused. Are you saying that without PropProp it'd be impossible to recognize in the extracted program that g(x)g(x) doesn't contribute to the output (i.e. that it merely verifies it)? Are there scenarios where one wouldn't be able to pull out such useless code through the usual means available to code optimizers?
user
1
From the extracted program one could say, "I want kk," and backtrack from there. I haven't been able to come up with a scenario so entangled that we couldn't optimize away anything that doesn't directly contribute to determining the permutation without it in fact being necessary for computing said permutation (from a global optimization standpoint, anyway).
user
1
You do not have the information "I want kk". That is an extra assumption, and obviously once they tell you which particular result they want, you can just optimize away dead code. Actually, I thought of a better answer: it is a design question which things to put in PropProp. You need to know what the user wants, and he tells you what he wants by using PropProp. It is easy to come up with examples where there are several options. I will add one to my answer.
Andrej Bauer
2
As far as I know nobody can really tell how to extract anything from (1)(1)-types. It's clear that they contain some computational content, but not what this might be.
Andrej Bauer
3
Ah, okay. Using PropProp as a way of specifying design decisions makes a lot more sense to me than as a way of deleting useless code.
user
19

PropProp is impredicative, which create a very expressive proof system. However it is "too" expressive in the following sense:

impredicative Prop+large elimination+excluded middle

impredicative Prop+large elimination+excluded middle

is inconsistent. Usually you want to keep the possibility to add the excluded middle, so one solution is to keep large elimination and make Prop predicative. The other is to suppress large elimination.

Coq did both! They renamed the predicative Prop to Set, and disabled large elimination in Prop.

The expressiveness gained by impredicativity is "reassuring" in the sense 99% of "reasonable" mathematics can be formalized with it, and it is known to be consistent relative to set theory. This makes it likely they won't weaken it to something like Agda, which only has predicative universes.

cody
quelle
8
Oh and I forgot to mention: it is not the case that Prop : Prop, that would be inconsistent. Rather quantifications over all propositions is again a proposition.
cody
Could you point me to any more resources about this? Everything I can find seems very scattered.
user833970
1
@user833970 any specific things you'd like pointers to? I'm afraid there isn't really an all encompassing reference for meta theory of dependent types. This discussion (which points back here!) might be useful: github.com/FStarLang/FStar/issues/360
cody
thank, I'm working through the Berardi paradox paper now, I think that will clear up my confusion.
user833970
14

Even if you are not interested in extracting programs, the fact that Prop is impredicative allows you to build some models which you can't build using a predicative tower of universes. IIRC Thorsten Altenkirch has a model of System F using Coq's impredicativity.

gallais
quelle