Coq | |
---|---|
Tyyppi | Lauseen todistaja |
Kehittäjä | INRIA ; kehitystiimi |
Sisään kirjoitettu | OCaml ; C |
Käyttöjärjestelmä | cross-platform |
Ensimmäinen painos | 1. toukokuuta 1989 |
Laitteistoalusta | cross-platform |
uusin versio |
|
Osavaltio | aktiivinen |
Lisenssi | LGPL 2.1 |
Verkkosivusto | coq.inria.fr |
Mediatiedostot Wikimedia Commonsissa |
Coq ( fr. coq - rooster ) on interaktiivinen ohjelmistolauseen todistaja, joka käyttää omaa toiminnallista ohjelmointikieltä ( Gallina ) [2] riippuvaisilla tyypeillä . Voit kirjoittaa muistiin matemaattisia lauseita ja niiden todisteita , muokata niitä kätevästi, tarkistaa niiden oikeellisuuden. Käyttäjä luo vuorovaikutteisesti todisteen ylhäältä alas, alkaen tavoitteesta (eli todistettavasta hypoteesista). Coq voi automaattisesti löytää todisteita joistakin rajoitetuista teorioista käyttämällä niin kutsuttua taktiikkaa. Coqia käytetään ohjelman varmentamiseen .
Coq kehitettiin Ranskassa osana TypiCal -projektia (entinen LogiCal ) [3] , jota hallinnoivat yhdessä INRIA , Ecole Polytechnique , Paris-South XI -yliopisto ja National Center for Scientific Research . Aiemmin korkeakoulussa oli oma ryhmä. Normaali Lyonin koulu .
Coqin teoreettinen perusta on rakennuslaskenta ; sen lyhenne on piilotettu nimeen ( CoC , eng. calculus of constructions ) ja lyhenne laskennan luojan Thierry Cocanin nimestä .
Todiste "paperille" funktion koostumuksen assosiatiivisuudesta :
; δ-ekvivalenssi ; δ-ekvivalenssi ; β-ekvivalenssi ; δ-ekvivalenssi ; δ-ekvivalenssi ; β-ekvivalenssiTasa-arvon transitiivisuudella:
Todiste Coqissa:
Määritelmä cf := fun t0 t1 t2 : Tyyppi => hauskaa (f : t1 -> t2) (g : t0 -> t1) => hauskaa x => f (gx). Implisiittiset argumentit vrt. [t0 t1 t2]. Merkintä "f @ g" := (vrt. fg) (tasolla 65, assosiatiivisuus vasemmalla). Määritelmä cf_assoc := hauskaa (t0 t1 t2 t3 : tyyppi) (f : t2 -> t3) (g : t1 -> t2) (h : t0 -> t1) => (refl_equal _) : (f @ g) @ h = f @ (g @ h).cf - toimintojen koostumuksen määrittely. Notationottaa käyttöön infix-merkinnän @funktion koostumukselle.
cf_assoc - todellinen todiste. Coq perustuu Curry-Howard-isomorfismiin , joten todiste on lambda -lasken termi .
fun … => …Coq tarkoittaa lambda-abstraktiota . Funktiot on nimetty f, g, hja niiden laajuudet ja alueet on nimetty t0, t1, t2, t3.
Todistus koostuu lambda-abstraktion lisäksi refl_equal tasa-arvon refleksiivisyysaksioomasta. Meidän on vähennettävä yhtälön vasen ja oikea osa βδ-pelkistysten avulla yhdeksi lausekkeeksi. Coq suorittaa itse βδ-pelkistyksen, joten todistus on käytännössä tyhjä.
Ymmärtääksesi roolin refl_equal, suorita Check (refl_equal 2).Coq näyttää tämän termin automaattisesti päätellyn tyypin, nimittäin 2 = 2. Mutta todistuksessa cf_assocargumentti refl_equalkorvataan alleviivauksella. Coq itse voi päätellä tämän argumentin (katso " Argumenttiarvojen päättäminen tyypeistä "). Tämä vähentää todisteiden määrää. Suorittamalla Print cf_assoc., voit varmistaa, että Coq tulostaa termin (f @ g) @ halaviivan sijaan.
Luonnollisten lukujen tyyppi määritellään standardikirjastossa induktiivisesti:
Induktiivinen nat : Set := | O: nat | S: nat -> nat.Rakentajat ja ovat nolla ja funktio, joka palauttaa seuraavan luvun.
Se on tarpeen todistaa . Kommutatiivisuuden todiste Peanon aritmetiikassa on rakennettu käyttämällä matemaattista induktiota yhdelle tekijästä.
Todiste "paperilla"Coqissa käytettyä merkintää käytetään helpottamaan molempien todisteiden vertailua.
Tehdään induktio päälle .
Induktion perusta: todistaa . Lausuma seuraa βδι-muunnoksesta. todistetaan erillisellä lemmalla (katso Coq.Init.Peano.mult_n_O).
Vaihe induktio: ottaa induktiivinen hypoteesi , todistaa . βδι-muunnoksesta seuraa, että . On lemma (katso Coq.Init.Peano.mult_n_Sm), jossa todetaan . Käytämme summauksen kommutatiivisuutta ja induktiivista hypoteesia.
Todistus CoqissaSeuraava todistus on kopioitu pienin muutoksin vakiokirjastosta. Se käyttää taktiikkaa.
Taktiikka tuottaa automaattisesti todisteen (tai osan siitä) tavoitteen (mitä on todistettava) perusteella. Tietenkin, jotta taktiikka toimisi, on oltava algoritmi todisteiden löytämiseksi. Joissakin tapauksissa taktiikka voi vähentää todisteiden määrää huomattavasti.
Taktiikkaa varten sinun on määritettävä tyyppi Määritelmän jälkeen (tavoite, todistettava väite), mutta jätetään pois lambda-termi eli itse todistus. Sitten Coq siirtyy todisteen muokkaustilaan, jossa voit rakentaa todisteen taktiikalla.
Jos taktiikka pystyi täysin todistamaan maalin, se tuottaa nollan välimaaleja. Jos taktiikka ei onnistunut viimeistelemään todistetta, vaikka se suoritti joitakin vaiheita, taktiikka tuottaa nollasta poikkeavan määrän alitavoitteita. Todistuksen suorittamiseksi on todistettava osatavoitteet muilla taktiikoilla. Voit siis yhdistää erilaisia taktiikoita.
Vedosmuokkaustila ei estä vedoksen rakentamista lambda- termiksi . Taktiikka (katso " #Kertolaskun kommutatiivisuus Grothendieck-renkaassa ") on todistaa tavoite käyttämällä sen jälkeen merkittyä lambda-termiä. on seuraava lisäominaisuus: jos lambda-termissä on alaviiva joidenkin aliehtojen sijaan ja Coq ei voi päätellä aliehtojen arvoa automaattisesti, tämä alaviiva luo alakohteen. Siten se voi luoda mielivaltaisen määrän alitavoitteita. refinerefinerefinerefine
Vaadi Import Coq.Arith.Plus. Määritelmä mult_comm : kaikille nm, n * m = m * n. todiste. intros. Elim n. auto arithin kanssa. intros. yksinkertainen |- *. elim mult_n_Sm. elim H. apply plus_comm. Qed.introsesittelee edellytykset ( nja m). elimsoveltaa matemaattista induktiota, jonka jälkeen todistuksen tavoite jaetaan kahteen osatavoitteeseen: induktion kanta ja askel. auto with arithosoittaa induktion perustan; Taktiikka autoetsii lausetietokannasta sopivan lauseen yksinkertaisella luettelolla ja korvaa sen todistuksessa. Tässä tapauksessa hän löytää lemman mult_n_O. Tämä voidaan varmistaa suorittamalla Show Proof.lemmat mult_n_Sm, plus_comm, ja induktiivinen hypoteesi H. Induktiivisen hypoteesin nimi syntyi automaattisesti taktiikalla intros, taktiikan toinen esiintyminen. simpl in |- *suorittaa kohteen βδι-muunnoksen. Vaikka se ei tuota todisteita, se tuo kohteen sellaiseen muotoon, jota tarvitaan taktiikan argumenttien päättelemiseksi apply plus_comm.
Sama todiste voidaan ilmaista lambda-termillä.
Määritelmä mult_comm := hauskaa n:nat => fix rec (m : nat) : n * m = m * n := täsmää m:ksi m palauttaa n * m = m * n kanssa | O => sym_eq(mult_n_O_) | S pm => match pm in _ = dep return _ = n + dep kanssa refl_equal => vastaa mult_n_Sm _ _ in _ = dep return dep = _ jossa refl_equal => plus_comm _ _ end loppu loppu.elim nkirjeenvaihto fix … match … as …. Loput elimsopivat match … in _=dep …. Taktiikkatodistuksessa ei tarvitse määritellä Oja konstruktoreita S, koska ne on johdettu nat.
Määritelmä mult_comm := hauskaa n:nat => nat_ind(hauska m => n * m = m * n) (sym_eq(mult_n_O_)) (fun_rec => eq_ind _ (hauska dep => _ = n + dep) (eq_ind _ (hauska dep => dep = _) (plus_comm _ _) _ (mult_n_Sm _ _)) _rec).Tämä on kompaktimpi, vaikkakin vähemmän visuaalinen merkintä. nat_indja eq_indniitä kutsutaan induktioperiaatteiksi ja ne ovat induktiivisten tyyppien rakenteen mukaan generoituja funktioita ( nat, if nat_ind, ja eq, if eq_ind). Taktikot lisäävät juuri nämä funktiot todisteeseen.
Kuten näet, taktiikan avulla voit jättää pois monia termejä, jotka voidaan päätellä automaattisesti.
Tämä on esimerkki erikoistaktiikkojen käytöstä ring. Se suorittaa muunnoksia kaavoista, jotka on rakennettu puoli- tai rengasoperaatioista .
Grothendieckin rengas on rakennettu puolirenkaasta seuraavasti. int_bipart - renkaan kantaja - on toinen karteesinen aste nat - puolirenkaan kantaja.
Record int_bipart : Set := {pneg : nat; ppos: nat}.Tietue ei ainoastaan konstruoi joukoista karteesista tuloa, vaan myös generoi vasemman (nimetty pneg) ja oikean (nimetty ppos) projektioita. Joukon arvo voidaan ymmärtää ratkaisuna yhtälöön , jossa on tuntematon suure. Jos , niin ratkaisu on negatiivinen. int_bipart
Summa renkaassa määritellään komponenttikohtaiseksi lisäykseksi, eli pnegvasen termi lisätään pnegoikeaan termiin, pposvasen termi lisätään pposoikeaan termiin.
Merkintä "a !+ b" := (Peano.plus ab) (tasolla 50, vasen assosiaatio). Määritelmä plus ab := Build_int_bipart (pneg a !+ pneg b) (ppos a !+ ppos b). Merkintä "a + b" := (plus ab).Merkitsemme lisäystä puolirenkaassa " !+" ja lisäystä renkaassa " +".
Kertominen määritellään seuraavasti: osa pneg(tämä on ensimmäinen argumentti Build_int_bipart) on eri komponenttien tulos, osa ppos(tämä on toinen argumentti Build_int_bipart) on samojen komponenttien tulos.
Merkintä "a !* b" := (Peano.mult ab) (tasolla 40, vasen assosiaatio). Määritelmä multab := Build_int_bipart (pneg a !* ppos b !+ ppos a !* pneg b) (pneg a !* pneg b !+ ppos a !* ppos b). Merkintä "a * b" := (mult ab) (tasolla 40, vasen assosiaatio).Merkitsemme kertolaskua puolirenkaassa nimellä " !*" ja kertolaskua renkaalla nimellä " *".
Ensin todistetaan lemma "jos molemmat komponentit int_bipartovat yhtä suuret, ne int_bipartovat yhtä suuret".
Määritelmä int_bipart_eq_part : kaikille an bn, an = bn -> kaikille ap bp, ap = bp -> Build_int_bipart an ap = Build_int_bipart bn bp. todiste. tarkentaa (hauskaa _ _ eqn _ _ eqp => _). tarkentaa (eq_ind _ (hauska n => _ = Build_int_bipart n _) _ _ eqn). refine(f_equal_eqp). Qed.Todistetaan nyt kertolaskun kommutatiivisuus renkaassa, eli n * m = m * n.
Vaadi Tuo ArithRing. Määritelmä mult_comm : kaikille nm, n * m = m * n. todiste. refine(fun nm => int_bipart_eq_part _ _ _ _ _ _); yksinkertainen; rengas. Qed.Meidän on todistettava, että kaksi on yhtä suuri int_bipart. Lemma int_bipart_eq_partjakaa tavoitteemme kahdeksi osamaaliksi. Ensimmäinen osatavoite on pneg-komponenttien yhtäläisyys, toinen osatavoite on ppos-komponenttien yhtäläisyys. Näet nämä alitavoitteet, jos suoritat Proof." refine (fun n m => int_bipart_eq_part _ _ _ _ _ _).;" välittömästi sen jälkeen refineja ( ) välillä simpl; ringtarkoittaa , että yhdistetty taktiikka ( simpl; ring) todistaa kaikki taktiikan luomat osatavoitteet refine.
Todistaaksesi "paperilla" sinun on sovellettava johdonmukaisesti semiring-toimintojen ominaisuuksia:
; kertolaskujen kommutatiivisuus ; kertolaskujen kommutatiivisuus ; lisäyksen kommutatiivisuus ; kertolaskujen kommutatiivisuus ; kertolaskujen kommutatiivisuusTactics ringluo kaikki nämä muutokset automaattisesti.