programirati znaci dokazati - csnedelja.mg.edu.rs fileuvodkonstruktivna logikatipovikari–hauard...

39
Programirati znaˇ ci dokazati Andrej Ivaškovi´ c Matematiˇ cka gimnazija NEDELJA 4 INFORMATIKE 29. mart 2018. Programirati znaˇ ci dokazati Andrej Ivaškovi´ c

Upload: others

Post on 29-Aug-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Programirati znaci dokazati

Andrej Ivaškovic

Matematicka gimnazijaNEDELJA4

INFORMATIKE

29. mart 2018.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Pojam proof assistant

I Jedna neobicna i zanimljiva oblast matematike i teorijskogracunarstva se tice formalizacije matematike i dokaza.

I Dokazi koje matematicari pišu uglavnom nisu formalni, alijesu rigorozni. Greške mogu da se potkradu!

I Postoje programski jezici sa specificnom namenom daomoguce matematicarima da budu sigurni da su njihovidokazi zapravo formalni i potpuni, medu kojima su Agda,Coq i slicni.

I Ovakvi jezici se nazivaju proof assistants.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Tipovi u proof assistant jezicima

I Ono što je uocljivo kod jezika poput Agda jeste jako složeni mocan sistem tipova.

I Tipovi o kojima je rec nisu prosti brojevi ili samo nizovi, vecdaleko fleksibilniji i mocniji sistemi.

I Programeri imaju ogromnu fleksibilnost pri definisanjusopstvenih tipova.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Kari–Hauard izomorfizam

I Ovi proof assistant jezici imaju izuzetno mocne i fleksibilnesisteme tipova zbog toga što se ispostavlja da postojiveoma prirodna i jasna analogija (zapravo bijekcija!)izmedu tipova i teorema – Kari–Hauard izomorfizam.

I Osnovna ideja ove veze se ogleda u tome da tip nekogizraza (ili programa) odgovara nekom tvrdenju, a izraz togtipa je primer dokaza tog istog tvrdenja.

I Veza je izmedu teorije tipova i takozvane konstruktivnelogike, te ce iz dokaza moci i da se konstruišu programi.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Plan predavanja

I Najpre cemo se baviti idejama konstruktivne logike.

I Nakon toga cemo posmatrati pojam induktivnog sistemai videti kako je konstruktivna logika modelovana jednimtakvim sistemom.

I Nakon toga cemo videti kako teorija tipova takode možeda se modeluje induktivnim sistemom.

I Odavde ce Kari-Hauardov izomorfizam doci "prirodno".

I Necemo posmatrati nijedan proof assistant jezik.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Šta znaci konstruktivnost?

I U matematici postoje konstruktivni dokazi, koji dokazujupostojanje nekih objekata (∃x) eksplicitnom konstrukcijom.

I Ovi dokazi, dakle, ne koriste identitet(∃x)(P (x)) ≡ ¬(∀x)(¬P (x)) i suprotne pretpostavke.

I Konstruktivna logika je inspirisana ovim idejama(necemo moci da se oslonimo na pravila duple negacije izakona iskljucenja treceg).

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Primer nekonstruktivnog dokaza

I Postoje iracionalni brojevi a i b takvi da je ab racionalan.

I Dokaz:

I Posmatrajmo a =√

2 i b =√

2√2.

I a je iracionalan, a b je ili racionalan ili nije.I Ako je b racionalan, onda je tvrdenje vec dokazano.I Ako je b iracionalan, tada je

ba =

(√2√2)√2

=(√

2)√2·

√2

=(√

2)2

= 2 racionalan.

I Dakle, ovakvi brojevi postoje (ili√

2 i√

2 ili√

2√2

i√

2)

I Primetimo da naš dokaz nema eksplicitno konstruisanprimer!

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Primer konstruktivnog dokaza

I Postoje iracionalni brojevi a i b takvi da je ab racionalan.

I Dokaz:

I Posmatrajmo a =√

2 i b = 2 log2 3.

I I a i b su iracionalni, što može da se pokaže konstruktivnimdokazima.

I Medutim, ab =(√

2)2 log2 3

= 2log2 3 = 3, što je racionalanbroj.

I Dakle, ovakvi brojevi a i b postoje.

I U konstruktivnoj matematici postoji razlika izmeduiracionalnog broja i realnog broja koji nije racionalan –necemo se baviti ovim.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Konstruktivna logika

I Konstruktivna logika je slicna logici sa kojom vec imamoiskustva, ali neka pravila više ne važe.

I Pojam negacije postoji, ali neka ocekivana svojstva više nevaže.

I Zakon iskljucenja treceg: p ∨ ¬p

I Dupla negacija: p↔ ¬¬p

I Naša interpretacija logickih veznika se sada znacajnomenja.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Konstruktivna interpretacija logickih veznika

I Dokaz implikacije φ→ ψ je sada konstrukcija koja,polazeci od dokaza za φ, formira dokaz za ψ.

I Dokaz konjunkcije φ ∧ ψ je konstrukcija koja je uredenipar dokaza za φ i dokaza za ψ.

I Dokaz disjunkcije φ ∨ ψ je konstrukcija koja je dokaz φ iliza ψ.

I Dokaz negacije ¬φ je sada konstrukcija koja, polazeci odnekog (hipotetickog) dokaza za φ, izvodi kontradikciju (⊥).

I Dokaz univerzalne kvantifikacije (∀x)(P (x)) jekonstrukcija koja konstruiše sve objekte a koji mogu dabudu vrednost x u dokaze za P (a).

I Dokaz egzistencijalne kvantifikacije (∃x)(P (x)) jekonstrukcija koja konstruiše uredeni par nekog eksplicitnogobjekta a koji može da bude vrednost x i dokaza za P (a).

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Formalni sistem zakljucivanja

I Posmatracemo logiku na formalan nacin – ne postojetablice istinosti, vec izvodimo tacne formule koristeciiskljucivo aksiome i jasna pravila zakljucivanja.

I Zato koristimo ` φ da bismo naglasili da neka logickaformula Φ može da se izvede bez dodatnih pretpostavki.

I Ako je skup pretpostavki Φ, tada Φ ` φ znaci da se iz togskupa pretpostavki može izvesti Φ. Na primer, p, q ` p ∧ q(ne pišemo zagrade radi jednostavnosti).

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Pravila zakljucivanja

I Pravila zakljucivanja (i kada su opšta i kada ihinstanciramo) pišemo kao "razlomke", gde su premiseiznad crte, a zakljucak ispod:

svi A su B X je AX je B

svi ljudi su smrtni Aristotel je covekAristotel je smrtan

I Ovo rezultuje dokazima koji imaju oblik stabla:

sve životinje su smrtne svi ljudi su životinjesvi ljudi su smrtni

Aristotel je covek

Aristotel je smrtan

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema konstruktivne logike

Φ ` φako φ ∈ Φ

Ψ ` φΦ ` φ

ako Ψ ⊆ Φ

φ ∧ ψ ` φ

φ ∧ ψ ` ψΦ ` φ Φ ` ψ

Φ ` φ ∧ ψ

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema konstruktivne logike

Φ, φ ` ψΦ ` φ→ ψ

Φ ` φ→ ψ Φ ` φΦ ` ψ

Φ ` φΦ ` (∀p)(φ)

ako se p ne pojavljuje u φ

Φ ` (∀p)(φ)

Φ ` φ[ψ/p]gde je ψ bilo koja formula

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Kuda dalje?

I Ova pravila su navedena samo da bi ilustrovala kako sekoristi neki formalan sistem – zakljucivanje brzo postajenepregledno.

I Ispostavlja se da su jedini neophodni veznici ∀ i→, sveostalo možemo da predstavimo preko njih (ukljucujuci i > i⊥).

I Pogledacemo sada rigorozan (ne formalan) dokaz` p ∧ (q ∨ r)→ (p ∧ q) ∨ (p ∧ r).

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

` p ∧ (q ∨ r)→ (p ∧ q) ∨ (p ∧ r)

I Dovoljno je dokazati p ∧ (q ∨ r) ` (p ∧ q) ∨ (p ∧ r).

I Jasno je da p ∧ (q ∨ r) ` p i p ∧ (q ∨ r) ` q ∨ r.

I Posmatramo dva moguca slucaja:I Ako p ∧ (q ∨ r) ` q, tada na osnovu prethodnog važip ∧ (q ∨ r) ` p ∧ q.

Dakle, p ∧ (q ∨ r) ` (p ∧ q) ∨ (p ∧ r).

I Ako p ∧ (q ∨ r) ` r, tada na osnovu prethodnog važip ∧ (q ∨ r) ` p ∧ r.

Dakle, p ∧ (q ∨ r) ` (p ∧ q) ∨ (p ∧ r).

I Time je ovo tvrdenje dokazano.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Da li ovo lici na program?

I Primetimo da ovaj dokaz ima pretežno linijsku strukturu, uzjedno grananje.

I Jasno su definisani nekakvi koraci u dolasku do svihzakljucaka.

I Postoje eksplicitne konstrukcije za svaki korak, nigde nijekorišcena nikakva negacija ili suprotna pretpostavka.

I Ovo je kao program u sred kog je nalazi jedan IF kojirazdvaja dva slucaja.

I Vraticemo se ovome malo kasnije!

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Teorija tipova

I Teorija tipova je oblast teorijskog racunarstva koja se bavisistemima tipova u programskim jezicima i algoritmimaprovere i otkrivanja tipova.

I Želimo da nam sistem tipova premesti veliki broj problemau toku izvršavanja na vreme kompajliranja.

I Ova oblast je posebno znacajna u funkcionalnimprogramskim jezicima (poput OCaml, Haskell).

I Mi cemo da se fokusiramo na proceduralan jezik cijasintaksa podseca na C i izmišljen je za potrebe ovogpredavanja.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Programski jezik

I Programski jezik ce sintaksno podsecati na C++ bezpokazivaca, ulazno-izlaznih rutina i bilo cega posebnokomplikovanog.

I Argumenti se prosleduju po vrednosti (nikada referenci).

I Kastovanje više ne postoji, tipovi su strogi.

I Neke stvari dodajemo. . .

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Unije

I Zadržavamo unije iz C++, gde jedna promenljiva može dasadrži podatak jednog od nekoliko razlicitih tipova.

I Menjamo sintaksu i nacin upotrebe: dodajemo kljucnu recmatch koja vrši grananje koje zavisi od toga koji je tippromenljive tipa unije; drugacije vršimo dodelu.

union Data {I: int i;C: char c; };

.................................Data x = Data.int(7);.................................match (x) {

I: x.i = 42;C: x.c = 'p'; }

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Parovi

I U STL postoji std::pair<S,T> za uredene parove, i micemo imati pair<S,T> tipovnu konstrukciju.

I Dodajemo .first i .second, a vrednosti zapisujemo kaox,y.

pair<int,char> x = {1, 'c'};x.first = 42;pair<char,char> y = {y.second, 'x'};

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Parametarski polimorfizam

I Od templejtova zadržavamo samo mogucnostprosledivanja tipova, izbacujemo class.

I Ovo nam omogucava pisanje polimorfnih funkcija, ali ipolimorfnih unija.

template<T> T ident(T x) { return x; }template<T> pair_up<int,T> f(T a) { ... }.................................template<T>union Tree {

Leaf: T val;Branch: pair<T, pair<Tree<T>, Tree<T> > > node;

};.................................f<char>('a');

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Konstruisanje funkcija

I Postoji i eksplicitan tip funkcija: na primer, ako f uzima inti char argument, a vraca int, tip cemo zapisivati kaoint(int,char).

I Možemo da konstruišemo funkcijske vrednosti kojima nedajemo eksplicitno ime pomocu [].

int f(int x) { return x + 1; }.................................int(int) g = f;int(int,int) h = [](int x, int y){ return x + y; }

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Rezonovanje o tipovima

I Dosta smo se obezbedili – nemamo mogucnostsegmentation fault, memory leak i slicnih stvari.

I Sada cemo se upoznati sa nacinom da formalnorezonujemo o tipovima izraza, gde izraz podrazumeva iaritmeticke i logicke izraze, ali i nizove naredbi.

I Ispostavlja se da je i ovo formalan, induktivno definisansistem.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Trojka rezonovanja o tipu izraza

I Za neki izraz e i tip τ pišemo e : τ ako e ima tip τ . Naprimer, 3 : int.

I Medutim, cesto postoje promenljive u nekom izrazu, i ondakonacan tip i validnost izraza zavise od tipa te promenljive.Na primer, { x, 3 } ima tip pair<int,int> (daljeint× int) ako je x tipa int, a može da bude ipair<char,int> (dalje char× int) ako je x tipa char.

I Uvodimo pojam konteksta Γ, funkcije iz skupapromenljivih u skup svih tipova (kome pridružujemo iundef). Pišemo Γ ` e : τ .

I Dakle, x : char ` { x, 3 } : char× int.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema tipova: osnove

Γ ` x : τako Γ(x) = τ

Γ ` n : intn ∈ Z

Γ ` true : bool

Γ ` false : bool

Γ ` e1 : τ1 Γ ∪∆ ` e2 : τ2Γ ` e1; e2 : τ2

gde je ∆ nova definicija u e1

Γ ` e1 : bool Γ ` e2 : τ Γ ` e3 : τ

Γ ` if e1 then e2 else e3 : τ

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema tipova: parovi

Γ ` e1 : τ1 Γ ` e2 : τ2Γ ` {e1, e2} : τ1 × τ2

Γ ` e : τ1 × τ2Γ ` e.first : τ1

Γ ` e : τ1 × τ2Γ ` e.second : τ2

Za unije uvodimo tip τ1 + τ2 i ova pravila izgledaju malo ružnijeu ovom jeziku.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema tipova: funkcije

Γ, x1 : τ1, . . . , xk : τk ` e : τ

Γ ` [](τ1 x1, . . ., τk xk){e} : τ1 × . . .× τk → τ

Γ ` f : τ1 × . . .× τk → τ Γ ` e1 : τ1 . . . Γ ` ek : τkΓ ` f(e1, . . ., ek) : τ

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema tipova: polimorfizam

Γ ` e : τ

Γ ` template<α> e : (∀α)(τ)

Γ ` e : (∀α)(τ)

Γ ` e<τ ′> : τ [τ ′/α]

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Kako koristimo ova pravila?

I Nije teško pokazati ovim sistemom da, na primer,prethodno uvedena pair_up funkcija ima tip(∀α)(α→ int× α).

I Provera da li su svi tipovi odgovarajuci zato nije teška imože se implementirati u kompajleru.

I Sva pravila su sintaksne prirode.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Slicnosti izmedu implikacija i funkcija

Φ, φ ` ψΦ ` φ→ ψ

Γ, x1 : τ1, . . . , xk : τk ` e : τ

Γ ` [](τ1 x1, . . ., τk xk){e} : τ1 × . . .× τk → τ

Φ ` φ→ ψ Φ ` φΦ ` ψ

Γ ` f : τ1 × . . .× τk → τ Γ ` e1 : τ1 . . . Γ ` ek : τkΓ ` f(e1, . . ., ek) : τ

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Slicnosti izmedu konjunkcija i parova

φ ∧ ψ ` φΓ ` e : τ1 × τ2

Γ ` e.first : τ1

φ ∧ ψ ` ψΓ ` e : τ1 × τ2

Γ ` e.second : τ2

Φ ` φ Φ ` ψΦ ` φ ∧ ψ

Γ ` e1 : τ1 Γ ` e2 : τ2Γ ` {e1, e2} : τ1 × τ2

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Kari–Hauard izomorfizam

I Ispostavlja se da ove slicnosti nisu slucajne – ova vezaizmedu tipova i teorema naziva se Kari–Hauardizomorfizam (Curry–Howardisomorphism/correspondence).

I Kako tipovima odgovaraju teoreme, tako se ispostavlja dase izrazi nekog tipa zapravo model dokaza neke teoreme.

I Dakle, dokazati teoremu u konstruktivnoj logici znacinapisati izraz odgovarajuceg tipa. Važi i obratno!

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Prevod

I Implikacije odgovaraju funkcijama.

I Konjunkcije odgovaraju uredenim parovima.

I Disjunkcije odgovaraju unijama.

I Dokazivanje ∀ tvrdenja odgovara pisanju polimorfnogizraza.

I Ovo nam maltene direktno daje program – možemo davidimo ovo na primeru ` p ∧ (q ∨ r)→ (p ∧ q) ∨ (p ∧ r), akoimamo odgovarajuce tipove P, Q, R.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Program koji je i dokaz

template<S,T> union Disj {Fst: S l;Snd: T r;

};

Disj<pair<P,Q>, pair<P,R> > f(pair<P, Disj<Q,R> > x) {P a = x.first;Disj<Q,R> b = x.second;match (b) {

Fst: return Fst({a, b.l});Snd: return Snd({a, b.r});

}}Uporediti sa dokazom koji smo imali ranije!

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Šta sve možemo da dokažemo?

I Sve što možemo da dokažemo u konstruktivnoj logici imaodgovarajuci program.

I Kako bismo, na primer, napisali program koji je dokaz za(∀p, q, r)((p ∨ q) ∨ r → p ∨ (q ∨ r))?

I A za (∀p, q, r)((p→ (q → r))→ ((p→ q)→ (p→ r)))?

I Ispostavlja se da je > zapravo tip (∀α)(α→ α), a ⊥ je(∀α)(α). Zašto?

I Setimo se: ¬φ ≡ φ→ ⊥.

I Zašto onda ne možemo da dokažemo ¬¬p→ p?

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Šta je sa složenijim programima i jezicima?

I Od dokaza napraviti program nije teško.

I Za silne programe je jasno šta dokazuju – dovoljno jeodrediti izraza.

I Ako u programskom jeziku imamo složenije konstrukcije,onda modeluje neke druge (i dalje konstruktivne) logike.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Zavisni tipovi

I Postoje sistemi tipova (i programski jezici) kojiomogucavaju da povratna vrednost funkcije ima tip kojizavisi od argumenata.

I Na primer funkcija ntorka uzima za argument prirodan brojn i vraca uredenu n-torku (1, 1, 1, . . . , 1), tipaint× . . .× int (n puta int).

I Ovo je veoma korisno u raznim proof assistant jezicima.

Programirati znaci dokazati Andrej Ivaškovic

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Zakljucak

I Postoji duboka i jasna veza izmedu kontruktivne logike iprograma.

I Teoreme odgovaraju tipovima, dokazi tih teoremaodgovaraju izrazima tih tipova.

I Zbog ovoga je posao formalizacije matematike zapravozajednicki posao programera i matematicara.

Programirati znaci dokazati Andrej Ivaškovic