Dlaczego Coq ma Prop?


35

Coq ma typ Prop dowodu nieistotne propozycje, które są odrzucane podczas ekstrakcji. Jaki jest tego powód, jeśli używamy Coq tylko do dowodów. Rekwizyt jest impredykatywny, więc Prop: Prop, Coq automatycznie wyszukuje indeksy wszechświata i zamiast tego możemy używać Type (i) wszędzie. Wygląda na to, że Prop bardzo wszystko komplikuje.

Czytałem, że istnieją filozoficzne powody oddzielenia Seta i Propa w książce Luo, jednak nie znalazłem ich w książce. Czym oni są?


6
„Jeśli używamy Coq tylko do dowodów”: Myślę, że zidentyfikowałeś tutaj kluczową kwestię. Coq nie jest używany tylko do dowodów.
Gilles „SO- przestań być zły”

Odpowiedzi:


34

Prop jest bardzo przydatny do ekstrakcji programu, ponieważ pozwala nam usuwać części kodu, które są bezużyteczne. Na przykład, aby wyodrębnić algorytm sortowania, udowodnilibyśmy zdanie „dla każdej listy istnieje lista taka, że jest uporządkowane, a jest permutatiom z ”. Jeśli zapiszemy to w Coq i wyodrębnimy bez użycia , otrzymamy:k k k P r o pkkkProp

  1. „dla wszystkich jest ” da nam mapę, która przenosi listy do list,kksort
  2. „takie, że jest uporządkowane” da funciton, który biegnie przez i sprawdza, czy jest posortowany, ikkverifyk
  3. „ jest permutacją ” daje permutację, która prowadzi do . Zauważ, że to nie tylko mapowanie, ale także mapowanie odwrotne wraz z programami weryfikującymi, czy te dwie mapy są rzeczywiście odwrotne.kkpikpi

Podczas gdy dodatkowe rzeczy nie są całkowicie bezużyteczne, w wielu aplikacjach chcemy się ich pozbyć i zachować sprawiedliwość sort. Można to osiągnąć, jeśli użyjemy aby stwierdzić, że „ jest uporządkowane”, a „ jest permutacją ”, ale nie „dla wszystkich istnieje ”. k k kPropkkk

Ogólnie powszechnym sposobem na wyodrębnienie kodu jest rozważenie wyrażenia w postaci gdzie jest wprowadzane, jest wyjściem, a wyjaśnia, co to znaczy, że jest poprawnym wyjściem. (W powyższym przykładzie i to typy list, a to „ jest uporządkowane, a jest permutacją .”) Jeśli znajduje się w to wyodrębnij daje mapę taką, że dla wszystkichx y ϕ ( x , y ) y A B ϕ ( , k ) k k ϕ P r o p f : A B ϕ ( x , f ( x ) ) x A ϕ S e t g g ( x ) ϕ ( x ,x:ZA.y:b.ϕ(x,y)xyϕ(x,y)yZAbϕ(,k)kkϕP.ropfa:ZAbϕ(x,f(x))xA . Jeśli znajduje się w wtedy również uzyskać funkcję takie, że jest dowodem na to, że posiada, dla każdego . Często dowód jest bezużyteczny obliczeniowo i wolimy się go pozbyć, zwłaszcza gdy jest głęboko zagnieżdżony w innym wyrażeniu. daje nam taką możliwość.ϕSetgg(x)x A P r o pϕ(x,f(x))xAProp

Dodano 2015-07-29: Istnieje pytanie, czy moglibyśmy całkowicie uniknąć , automatycznie optymalizując „bezużyteczny wyodrębniony kod”. Do pewnego stopnia możemy to zrobić, na przykład cały kod wyodrębniony z negatywnego fragmentu logiki (rzeczy zbudowane z pustego typu, typu jednostki, produktów) jest bezużyteczny, ponieważ tylko tasuje wokół jednostki. Ale przy użyciu należy podjąć autentyczne decyzje projektowe . Oto prosty przykład, w którym oznacza, że ​​jesteśmy w a oznacza, że ​​jesteśmy w . Jeśli wyciągniemy z P r o p Σ T y p eP r o p Π n : N Σ b : { 0 , 1 } Σ k : NPropPropΣTypePropn b k Π n : N Σ b : { 0 , 1 }k : N

Πn:NΣb:{0,1}Σk:Nn=2k+b
otrzymamy program, który rozkłada na najniższy bit a pozostałe bity , tzn. oblicza wszystko. Jeśli wyciągniemy z wówczas program obliczy tylko najniższy bit . Maszyna nie może powiedzieć, który jest prawidłowy, użytkownik musi powiedzieć mu, czego chce.nbkb
Πn:NΣb:{0,1}k:Nn=2k+b
b

1
Jestem trochę zdezorientowany. Czy mówisz, że bez nie byłoby możliwe rozpoznanie w wyodrębnionym programie, że nie przyczynia się do wyniku (tj. Że jedynie go weryfikuje)? Czy istnieją scenariusze, w których nie można wyciągnąć tak bezużytecznego kodu za pomocą zwykłych środków dostępnych dla optymalizatorów kodu? g ( x )Propg(x)
użytkownik

1
Z wyodrębnionego programu można powiedzieć „chcę ” i stamtąd cofnąć się. Nie byłem w stanie wymyślić takiego scenariusza, który byłby tak uwikłany, że nie mogliśmy zoptymalizować niczego, co nie przyczynia się bezpośrednio do ustalenia permutacji, bez faktycznej konieczności obliczenia wspomnianej permutacji (zresztą z globalnego punktu widzenia optymalizacji ). k
użytkownik

1
Nie masz informacji „Chcę ”. To dodatkowe założenie i oczywiście, gdy powiedzą ci, jaki konkretny wynik chcą, możesz po prostu zoptymalizować martwy kod. Właściwie pomyślałem o lepszej odpowiedzi: jest to pytanie projektowe, które należy umieścić w . Musisz wiedzieć, czego chce użytkownik, a on powie ci, czego chce, używając . Łatwo jest wymyślić przykłady, w których istnieje kilka opcji. Dodam jedną do mojej odpowiedzi. P r o p P r o pkPropProp
Andrej Bauer,

2
O ile wiem, nikt nie jest w stanie powiedzieć, jak wydobyć cokolwiek z typów . To jasne, że zawierają one pewną obliczeniową treści, ale nie to, co to może być. (1)
Andrej Bauer

3
Ah, dobrze. Używanie jako sposobu określania decyzji projektowych jest dla mnie o wiele bardziej sensowne niż jako sposób usuwania niepotrzebnego kodu. Prop
użytkownik

19

Prop jest impredykacyjny , co tworzy bardzo ekspresyjny system dowodowy. Jest jednak „zbyt” ekspresyjny w następującym znaczeniu:

impredicative Prop+large elimination+excluded middle

jest niespójny. Zwykle chcesz zachować możliwość dodania wykluczonego środka, więc jednym z rozwiązań jest utrzymanie dużej eliminacji i uczynienie Prop predykatywnym. Drugim jest powstrzymanie dużej eliminacji.

Coq zrobił oba! Zmienili nazwę predykatywnej Prop na Set i wyłączili dużą eliminację w Prop.

Ekspresyjność uzyskana przez impredykatywność jest „uspokajająca” w tym sensie, że 99% „rozsądnej” matematyki można z nią sformalizować i wiadomo, że jest spójna w stosunku do teorii mnogości. To sprawia, że ​​prawdopodobnie nie osłabią go do czegoś takiego jak Agda, która ma tylko predykatywne wszechświaty.


8
No i zapomniałem wspomnieć: to nie jest tak, że Prop : Prop, to byłoby niespójne. Raczej kwantyfikacja wszystkich zdań jest znowu twierdzeniem.
cody

Czy możesz wskazać mi więcej informacji na ten temat? Wszystko, co mogę znaleźć, wydaje się bardzo rozproszone.
user833970,

1
@ user833970 jakieś konkretne rzeczy, na które chcesz wskazać? Obawiam się, że nie ma tak naprawdę całościowego odniesienia do meta teorii typów zależnych. Ta dyskusja (która wskazuje tutaj!) Może być przydatna: github.com/FStarLang/FStar/issues/360
cody

dzięki, pracuję teraz nad paradoksem Berardi, myślę, że rozwiąże to moje zamieszanie.
user833970

14

Nawet jeśli nie jesteś zainteresowany wydobywaniem programów, fakt, że Propjest impredykatywny, pozwala ci budować modele, których nie możesz zbudować za pomocą predykcyjnej wieży wszechświatów. IIRC Thorsten Altenkirch ma model Systemu F wykorzystujący impredykatywność Coqa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.