coq au win
TRANSCRIPT
IntelliSense Integration for Coq Theorem Prover
Adam Abonyi, Charles University in Prague
Advisor: Tomáš Petříček, University of Cambridge
Motivace
Proč dokazovat korektnost?
některé chyby se můžou prodražit
FDIV bug v procesorech Intel
V roce 1994 odhalena chyba v FPU
Neúplná lookup tabulka používaná při dělení
Výměna všech procesorů - škoda 475 milionů USD
Ariane 5 - Nosná raketa
1996 – výbuch po 37 vteřinách zkušebního letu
Nedostatečná ochrana proti přetečení integeru
Škoda odhadována 370 milionů USD
Vývoj počítačově asistovaného dokazování
4-Color Theorem – Problém čtyř barev (1890) „Stačí čtyři barvy na obarvení libovolné politické mapy tak, aby žádné
dva sousedící státy nebyly obarveny stejnou barvou?“
V roce 1976 vyřešen za pomoci počítače
Problém rozdělen na 1936 menších map
Spousta pochybů, zda počítač neobsahuje chyby
V roce dokázan pomocí Coqu
CompCert (2005) 2005 - Založení projektu
Snaha o vytvoření verifikovanýho kompilátor
Vytvořili ověřenou podmnožinu Cčkového kompilátoru
Kompilátor specifikován, naprogramován a dokázán v Coqu
Vývoj počítačově asistovaného dokazování
Vývoj nástrojů pro dokazování (proof assistants)
Oproti důkazu 4CT ušel kus cesty
Lze zpětně ověřit, že postup byl korektní
Příklady: Coq, Isabelle
Nástroje pro vývoj
Omezenější oproti klasickým vývojovým nástrojům
CoqIde, ProofGeneral (využívá oblíbený editor emacs)
Důkazy se musí zpracovávat dávkově.
Existuje část programu, která nelze editovat a znám výstup poze k tomuto místu, se kterým můžu posouvat
Cíl práce
Rozšířit možnosti současných nástrojů pro dokazování
Hlavní cíl:
Implementace ItelliSense pro Coq
Další cíle:
Eliminovat posouvání hranice
Důkaz půjde upravovat kdekoliv, né jen před hranicí
Výstupní okna rozšířit, aby podávaly co nejvíce informací
Vytvořit vnitřní reprezentaci kódu
Pomocí této reprezentace umožnit automatické doplňování (IntelliSense)
Rozšířit MonoDevelop o podporu Coq - nástroje pro dokazování vět
Kontrola důkazu na pozadí
Obsahovat všechny vymoženosti moderních vývojových nástrojů
Rozdělení
1. Budování reprezentace kódu Zpracování výrazů jazyka Gallina (dokazovací jazyk Coqu)
Vybudování ASTčka
2. Práce na pozadí (Asynchronní) kontrola důkazů automaticky na pozadí
Příprava dat pro panely
Práce s reprezentací kódu
3. Implementace podpory do MonoDevelopu Vytvořit nový projekt pro Coq
Přidat chování známé z CoqIDE Proof, Output panel
Obarvování kódu
Umožnit pouštět důkaz
Reprezentace kódu
Podpora jazyka podle specifikace
Podpora všech základních pravidel jazyka Gallina
Jsou udané v pseudokódu, takže byla potřeba jistá úprava
Podpora pro uživatelské Commandy není kompletní
Spíš command line pomocníci
Implementační detail
Podpora pro dokazování není kompletní
Časově náročné – spousta příkazů a způsobů zápisu
Práce na pozadí
Při změně důkazu:
Vytvoří se nové AST
Může být později použito při zjišťování hodnot na doplnění
Kontrola důkazu na pozadí
Kód se pošle Coq compileru a zapamatují se výstupy
Naplní se tabulky pro zobrazení výstupů (obsah output a proof oken)
Při práci s prostředím lze vyvolat tyto události:
Zjistit identifikátory, které lze použít na aktuálním místě v kódu
Z AST zjistí, které identifikátory jsou platné
Zjistí výstup pro tooltip, output či proof panel
Pomocí pomocných struktur zjistí co se má vypsat
Integrace do MonoDevelop
Podporované featury MonoDevelopu: Přidání podporovaných projektů a souborů
Asociace s .v souborama a .coqproject
Obarvování textu
Parsování kódu a jeho zpracování Vybudování AST
Zavolání Coq kompilátoru a předpříprava dat
Podtrhávání chyb, Panely, Tooltipy Vytáhne informace z předpřipravených dat
Automatické doplňování Z AST pozná, jaké identifikátory má napovědět
Klávesové zkratky pro posílání do panelu Pomocí Ctrl+Entr pošle označený text do Coq Interactive panelu
Implementace
Funkcionální jazyk F#
Parser
FSLex a FSYacc
Manipulace s AST
Pomocí funkcionálních jazyků se pěkně pracuje s AST
Práce na pozadí
BackgroundAgent - řeší asynchronní volání a synchronizaci
Imperativní jazyk C#
Použit pro integraci do MonoDevelop
Snadná komunikace s F#
Ukázka důkazu
Lemma distr_impl : (A -> B -> C) -> (A -> B) -> A -> C.
Závěr
Klíčové přínosy práce
Pokročilá editace zdrojového kódu Přidání podpory do IDE MonoDevelop Obarvování kódu a našeptávání Interaktivní a výstupní panely Tooltipy Bez potřeby posouvat hladinu po příkazech
Kontrola korektnosti na pozadí Automatická kontrola na pozadí Chyby zvýrazněné ihned (vyznačením, výpisem, tooltipem)
Rozšiřitelnost Vybudování AST, které lze poskytnout