programirati znaci dokazati

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 23-Oct-2021

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programirati znaci dokazati

Programirati znaci dokazati

Andrej Ivaškovic

Matematicka gimnazijaNEDELJA4

INFORMATIKE

29. mart 2018.

Programirati znaci dokazati Andrej Ivaškovic

Page 2: Programirati znaci dokazati

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

Page 3: Programirati znaci dokazati

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

Page 4: Programirati znaci dokazati

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

Page 5: Programirati znaci dokazati

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

Page 6: Programirati znaci dokazati

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

Page 7: Programirati znaci dokazati

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

Page 8: Programirati znaci dokazati

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

Page 9: Programirati znaci dokazati

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

Page 10: Programirati znaci dokazati

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

Page 11: Programirati znaci dokazati

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

Page 12: Programirati znaci dokazati

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

Page 13: Programirati znaci dokazati

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema konstruktivne logike

Φ ` φako φ ∈ Φ

Ψ ` φΦ ` φ

ako Ψ ⊆ Φ

φ ∧ ψ ` φ

φ ∧ ψ ` ψΦ ` φ Φ ` ψ

Φ ` φ ∧ ψ

Programirati znaci dokazati Andrej Ivaškovic

Page 14: Programirati znaci dokazati

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

Page 15: Programirati znaci dokazati

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

Page 16: Programirati znaci dokazati

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

Page 17: Programirati znaci dokazati

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

Page 18: Programirati znaci dokazati

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

Page 19: Programirati znaci dokazati

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

Page 20: Programirati znaci dokazati

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

Page 21: Programirati znaci dokazati

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

Page 22: Programirati znaci dokazati

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

Page 23: Programirati znaci dokazati

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

Page 24: Programirati znaci dokazati

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

Page 25: Programirati znaci dokazati

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

Page 26: Programirati znaci dokazati

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

Page 27: Programirati znaci dokazati

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

Page 28: Programirati znaci dokazati

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

Page 29: Programirati znaci dokazati

Uvod Konstruktivna logika Tipovi Kari–Hauard izomorfizam Zakljucak

Deo formalnog sistema tipova: polimorfizam

Γ ` e : τ

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

Γ ` e : (∀α)(τ)

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

Programirati znaci dokazati Andrej Ivaškovic

Page 30: Programirati znaci dokazati

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

Page 31: Programirati znaci dokazati

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

Page 32: Programirati znaci dokazati

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

Page 33: Programirati znaci dokazati

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

Page 34: Programirati znaci dokazati

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

Page 35: Programirati znaci dokazati

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

Page 36: Programirati znaci dokazati

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

Page 37: Programirati znaci dokazati

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

Page 38: Programirati znaci dokazati

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

Page 39: Programirati znaci dokazati

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