Sissejuhatus informaatikasse Semantika, tuubid, loogika ja programmeerimine Varmo Vene Arvutiteaduse Instituut Tartu Ulikool 5. mai 2009.
Tsitaat klassikutelt Sissejuhatus Everyone knows that debugging is twice as hard as writing a program in the rst place. So if you're as clever as you can be when you write it, how will you ever debug it? Brian Kernighan, P.J. Plauger "The Elements of Programming Style", 2ed., 1978.
Tsitaat klassikutelt Sissejuhatus Everyone knows that debugging is twice as hard as writing a program in the rst place. So if you're as clever as you can be when you write it, how will you ever debug it? Brian Kernighan, P.J. Plauger "The Elements of Programming Style", 2ed., 1978. 30 aastat hiljem,... me kulutame ikkagi rohkem aega silumisele ja testimisele kui tegelikule programmeerimisele; sellele vaatamata sisaldavad meie kasutatavad ja/v~oi loodavad programmid vigu (teinekord vagagi ohtlikke).
V~oimalikke p~ohjuseid Human imperfection Sissejuhatus To err is human, to forgive divine. (Alexander Pope, 1688{1744) Laws of nature Program testing can be used to show the presence of bugs, but never to show their absence! (Edsger Dijkstra, 1970) Imperfection of tools The most eective debugging tool is still careful thought, coupled with judiciously placed print statements. (Brian Kernighan, 1979)
V~oimalikke p~ohjuseid Human imperfection Sissejuhatus To err is human, to forgive divine. (Alexander Pope, 1688{1744) Laws of nature Program testing can be used to show the presence of bugs, but never to show their absence! (Edsger Dijkstra, 1970) Imperfection of tools The most eective debugging tool is still careful thought, coupled with judiciously placed print statements. (Brian Kernighan, 1979)
V~oimalikke p~ohjuseid Human imperfection Sissejuhatus To err is human, to forgive divine. (Alexander Pope, 1688{1744) Laws of nature Program testing can be used to show the presence of bugs, but never to show their absence! (Edsger Dijkstra, 1970) Imperfection of tools The most eective debugging tool is still careful thought, coupled with judiciously placed print statements. (Brian Kernighan, 1979)
V~oimalikke p~ohjuseid Human imperfection Sissejuhatus To err is human, to forgive divine. (Alexander Pope, 1688{1744) Laws of nature Program testing can be used to show the presence of bugs, but never to show their absence! (Edsger Dijkstra, 1970) Imperfection of tools The most eective debugging tool is still careful thought, coupled with judiciously placed print statements. (Brian Kernighan, 1979)
Sissejuhatus Programmeerimiskeelte semantika uks eesmarke Selliste programmeerimist toetavate vahendite loomine, mis annaksid rangeid garantiisid programmi omaduste kohta. { Nait. garanteerib, et teatud liiki vigu programmis pole. Preventatiivsed meetodid { Nait. range tuubisusteemiga programmeerimiskeeled. Retroaktiivsed meetodid { Nait. staatilised programmianalusaatorid. Proaktiivsed meetodid { Nait. programmide sunteesimismeetodid.
Sissejuhatus Programmeerimiskeelte semantika uks eesmarke Selliste programmeerimist toetavate vahendite loomine, mis annaksid rangeid garantiisid programmi omaduste kohta. { Nait. garanteerib, et teatud liiki vigu programmis pole. Preventatiivsed meetodid { Nait. range tuubisusteemiga programmeerimiskeeled. Retroaktiivsed meetodid { Nait. staatilised programmianalusaatorid. Proaktiivsed meetodid { Nait. programmide sunteesimismeetodid.
Sissejuhatus Programmeerimiskeelte semantika uks eesmarke Selliste programmeerimist toetavate vahendite loomine, mis annaksid rangeid garantiisid programmi omaduste kohta. { Nait. garanteerib, et teatud liiki vigu programmis pole. Preventatiivsed meetodid { Nait. range tuubisusteemiga programmeerimiskeeled. Retroaktiivsed meetodid { Nait. staatilised programmianalusaatorid. Proaktiivsed meetodid { Nait. programmide sunteesimismeetodid.
Sissejuhatus Programmeerimiskeelte semantika uks eesmarke Selliste programmeerimist toetavate vahendite loomine, mis annaksid rangeid garantiisid programmi omaduste kohta. { Nait. garanteerib, et teatud liiki vigu programmis pole. Preventatiivsed meetodid { Nait. range tuubisusteemiga programmeerimiskeeled. Retroaktiivsed meetodid { Nait. staatilised programmianalusaatorid. Proaktiivsed meetodid { Nait. programmide sunteesimismeetodid.
Tuubid Ulevaade { Dunaamiline vs. staatiline tuupimine { Parameetriline ja "ad-hoc" polumorsm Loogika ja programmeerimine { Klassikaline vs. konstruktiivne loogika { Intuitsionistlik lausearvutus { Curry-Howard'i vastavus { Programmide suntees ja ektraheerimine
Tuubid Mida teeb jargmine programmil~oik? x 1 := "Pii siinus on: "; x 2 := 3:1415926; : : : print x 2 ; print (sin(x 1 ));
Tuubid Mida teeb jargmine programmil~oik? x 1 := "Pii siinus on: "; x 2 := 3:1415926; : : : print x 2 ; print (sin(x 1 )); Vastus Ei tea (loodetavasti siiski mitte midagi vaga hullu :)
Tuubid Mida teeb jargmine programmil~oik? x 1 := "Pii siinus on: "; x 2 := 3:1415926; : : : print x 2 ; print (sin(x 1 )); Milleks tuubid? Peaeesmark on valtida selliste vigade tekkimist Idee: { Seome vaartustega/muutujatega/... tuubid { Kontrollime, kas tuubid klapivad Dunaamiline tuupimine Staatiline tuupimine
Dunaamiline tuupimine Tuubid Tuubikontroll toimub programmi taitmise ajal x Int 123 APL, Lisp, Perl, Python, Ruby, Tcl/Tk,... Vaga paindlik Ebaefektiivne Tuubivigade leidmine raske
Staatiline tuupimine Tuubid Tuubikontroll toimub programmi transleerimise ajal x Int 123 Fortran, Algol, Pascal, C, Java, Haskell,... Tuubivigade leidmine lihtne Efektiivne Tugevalt kitsendav, aga...
Staatiline tuupimine Probleem Baastuubid Struktuurid Algoritmid Int List size Char... Tree... sort...
Lahendused Staatiline tuupimine Lepime olukorraga (Pascal) Petame tuubisusteemi (C) Kasutame v~oimsamat tuubisusteemi { Geneeriline programmeerimine (Ada, C++, Java) { Polumorsm (ML, Haskell) { Polutuupsus (Polyp, Generic Haskell) { S~oltuvad tuubid (Epigram, Agda)
Lahendused Staatiline tuupimine Lepime olukorraga (Pascal) Petame tuubisusteemi (C) Kasutame v~oimsamat tuubisusteemi { Geneeriline programmeerimine (Ada, C++, Java) { Polumorsm (ML, Haskell) { Polutuupsus (Polyp, Generic Haskell) { S~oltuvad tuubid (Epigram, Agda)
Lahendused Staatiline tuupimine Lepime olukorraga (Pascal) Petame tuubisusteemi (C) Kasutame v~oimsamat tuubisusteemi { Geneeriline programmeerimine (Ada, C++, Java) { Polumorsm (ML, Haskell) { Polutuupsus (Polyp, Generic Haskell) { S~oltuvad tuubid (Epigram, Agda)
Lahendused Staatiline tuupimine Lepime olukorraga (Pascal) Petame tuubisusteemi (C) Kasutame v~oimsamat tuubisusteemi { Geneeriline programmeerimine (Ada, C++, Java) { Polumorsm (ML, Haskell) { Polutuupsus (Polyp, Generic Haskell) { S~oltuvad tuubid (Epigram, Agda)
Polumorsm Staatiline tuupimine Programm on parametriseeritud tuubi suhtes (1 + 2) == 3 =) True [1; 2; 3] == [4; 5] =) False length [1; 2; 3] =) 3 length ["Abc"; ""; "efg"; "hj"] =) 4 "Ad-hoc" polumorsm Parameetriline (universaalne) polumorsm
Polumorsm "Ad-hoc" polumorsm Deneeritud induktsiooniga ule tuubivaljendi Erinevate tuupide jaoks erinev realisatsioon equal Int i 1 i 2 = priminteq i 1 i 2 equal [a] [ ] [ ] = True equal [a] (x : xs) (y : ys) = equal a x y && equal [a] xs ys equal [a] xs ys = False
Parameetriline polumorsm Polumorsm Uks denitsioon k~oigi tuupide jaoks length :: [a]! Int length [ ] = 0 length (x : xs) = 1 + length xs map :: (a! b)! [a]! [b] map f [ ] = [ ] map f (x : xs) = f x : map f xs
"Tasuta" teoreemid Prameetriline polumorsm length (map f xs) = length xs
"Tasuta" teoreemid Prameetriline polumorsm length (map f xs) = length xs "Tasuta" denitsioonid Mis funktsioon on tuupi (a; b)! (b; a)? Vastus: swap (x; y) = (y; x)... ja ainult swap!! Mis funktsioon on tuupi (Int; Char)! (Char; Int)? Neid on palju; naiteks swap, aga ka boo (x; y) = ( 0 A 0 ; 13) foo (x; y) = (ord x; chr y)
"Tasuta" teoreemid Prameetriline polumorsm length (map f xs) = length xs "Tasuta" denitsioonid Mis funktsioon on tuupi (a; b)! (b; a)? Vastus: swap (x; y) = (y; x)... ja ainult swap!! Mis funktsioon on tuupi (Int; Char)! (Char; Int)? Neid on palju; naiteks swap, aga ka boo (x; y) = ( 0 A 0 ; 13) foo (x; y) = (ord x; chr y)
"Tasuta" teoreemid Prameetriline polumorsm length (map f xs) = length xs "Tasuta" denitsioonid Mis funktsioon on tuupi (a; b)! (b; a)? Vastus: swap (x; y) = (y; x)... ja ainult swap!! Mis funktsioon on tuupi (Int; Char)! (Char; Int)? Neid on palju; naiteks swap, aga ka boo (x; y) = ( 0 A 0 ; 13) foo (x; y) = (ord x; chr y)
"Tasuta" teoreemid Prameetriline polumorsm length (map f xs) = length xs "Tasuta" denitsioonid Mis funktsioon on tuupi (a; b)! (b; a)? Vastus: swap (x; y) = (y; x)... ja ainult swap!! Mis funktsioon on tuupi (Int; Char)! (Char; Int)? Neid on palju; naiteks swap, aga ka boo (x; y) = ( 0 A 0 ; 13) foo (x; y) = (ord x; chr y)
"Tasuta" teoreemid Prameetriline polumorsm length (map f xs) = length xs "Tasuta" denitsioonid Mis funktsioon on tuupi (a; b)! (b; a)? Vastus: swap (x; y) = (y; x)... ja ainult swap!! Mis funktsioon on tuupi (Int; Char)! (Char; Int)? Neid on palju; naiteks swap, aga ka boo (x; y) = ( 0 A 0 ; 13) foo (x; y) = (ord x; chr y)
Loogika? Vikipeedia (et.wikipedia.org ) Loogika on teadus m~otlemise reeglitest, struktuuridest ja vormidest. Formaalne loogika tegeleb sellega, kuidas jareldada t~oestest vaidetest t~oeseid vaiteid, kuid reeglina ei utle, millised vaited on t~oesed. Seet~ottu oeldakse, et formaalsel loogikal puudub sisu: ta ei utle midagi selle kohta, missugune maailm tegelikult on.
Loogika? Vikipeedia (et.wikipedia.org ) Loogika on teadus m~otlemise reeglitest, struktuuridest ja vormidest. Formaalne loogika tegeleb sellega, kuidas jareldada t~oestest vaidetest t~oeseid vaiteid, kuid reeglina ei utle, millised vaited on t~oesed. Seet~ottu oeldakse, et formaalsel loogikal puudub sisu: ta ei utle midagi selle kohta, missugune maailm tegelikult on.
Loogika? Vikipeedia (et.wikipedia.org ) Loogika on teadus m~otlemise reeglitest, struktuuridest ja vormidest. Formaalne loogika tegeleb sellega, kuidas jareldada t~oestest vaidetest t~oeseid vaiteid, kuid reeglina ei utle, millised vaited on t~oesed. Seet~ottu oeldakse, et formaalsel loogikal puudub sisu: ta ei utle midagi selle kohta, missugune maailm tegelikult on.
Loogika Klassikaline loogika Iga vaide on kas t~oene v~oi vaar. P~ohikusimus: "Kas antud vaide on t~oene v~oi vaar?"
Loogika Klassikaline loogika Iga vaide on kas t~oene v~oi vaar. P~ohikusimus: "Kas antud vaide on t~oene v~oi vaar?" Konstruktiivne loogika Vaide on t~oene ainult siis, kui me oskame seda t~oestada. P~ohikusimus: "Kuidas antud vaide muutub t~oeseks?" Sealhulgas, kui vaide vaidab millegi leidumist, siis peame oskama naidata vahemalt uhe konkreetse objekti mis selle vaite jargi leidub.
Loogika Klassikaline vs. konstruktiivne loogika Alljargnevad vaited on klassikaliselt tautoloogiad, kuid konstruktiivselt ei kehti: A _ :A ::A A ((A B) A) A
Loogika Lausearvutuse suntaks P ::= A j P ^ P j P _ P j P P j > j? Tuletusreeglid Tuletusreeglite uldkuju: P 1 P 2 : : : Pn P 0 Valemid P 1, P 2,..., P n on eeldused; valem P 0 on jareldus.
Tuletusreeglid Tuletusreeglite uldkuju: Loogika P 1 P 2 : : : Pn P 0 Iga konnektiivi (^, _,,... ) jaoks on kahesugused reeglid. Sissetoomisreeglid: { konnektiiv asub jarelduses P 0 ; { "kuidas jarelduse kehtivust naidata?" Valjaviimisreeglid: { konnektiiv asub eelduses P i ; { "kuidas olemasolevat t~oestust ara kasutada?"
Loogika Tuletusreeglid: konjunktsioon Sissetoomisreegel: P 1 P 2 P 1 ^ P 2 Valjaviimisreeglid: P 1 ^ P 2 P 1 P 1 ^ P 2 P 2
Tuletusreeglid: implikatsioon Sissetoomisreegel: Loogika P 1. P 2 P 1 P 2 Valjaviimisreegel: P 1 P 2 P 1 P 2
Tuletusreeglid: disjunktsioon Sissetoomisreeglid: Loogika P 1 P 1 _ P 2 P 2 P 1 _ P 2 Valjaviimisreegel: P 1 _ P 2 P 1. P 0 P 2. P 0 P 0
Loogika Tuletusreeglid: t~ode ja vastuolu Sissetoomisreegel: > Valjaviimisreegel:? P
Loogika A ^ B B ^ A
Loogika A ^ B B ^ A A ^ B B ^ A
Loogika A ^ B A ^ B B A B ^ A A ^ B B ^ A
Loogika A ^ B A ^ B B A B ^ A A ^ B B ^ A
Loogika snd A ^ B fst A ^ B B A B ^ A A ^ B B ^ A
Loogika A ^ B snd B pair B ^ A fst A ^ B A A ^ B B ^ A
Loogika x A ^ B snd B pair x: x fst B ^ A A ^ B B ^ A A ^ B A
Loogika x A ^ B snd snd x B pair x: x A ^ B fst fst x A B ^ A A ^ B B ^ A
Loogika x A ^ B x A ^ B snd fst snd x B fst x A pair pair (snd x; fst x) B ^ A x: A ^ B B ^ A
Loogika x A ^ B snd snd x B pair pair (snd x; fst x) x: x A ^ B fst fst x A B ^ A x: pair (snd x; fst x) A ^ B B ^ A
Loogika x A ^ B snd snd x B pair pair (snd x; fst x) x: x A ^ B fst fst x A B ^ A x: pair (snd x; fst x) A ^ B B ^ A T~oestamine ON programmeerimine!! swap x = (snd x; fst x)
Loogika ja programmeerimine Curry-Howard'i vastavus Loogika valem lausemuutuja t~oestus eeldus loogiline konnektiiv t~oestatavus normaliseerimine -arvutus tuup tuubimuutuja term termimuutuja tuubikonstruktor asustatavus reduktsioon
Loogika ja programmeerimine Curry-Howard'i vastavuse rakendused Programmide suntees: { ulesanne spetsitseeritakse mingi loogika valemina; { antud valem t~oestatakse automaatselt susteemi poolt; { t~oestusi t~olgendatakse programmina. { Nait. mitmed Enn T~ougu poolt arendatud susteemid (Priz, Nut, Cocovila).
Loogika ja programmeerimine Curry-Howard'i vastavuse rakendused T~oestusassistendid { Nait. Isabelle/HOL, Coq { Kasutavad spetsiaalseid programmeerimiskeeli t~oestuste kirjutamiseks. { V~oimaldavad t~oestustest programme ekstraheerida (eraldada t~oestustest arvutuslikult oluline osa). Tuubiteoorial baseeruvad programmeerimiskeeled { Nait. Epigram, Agda { On reaalsed programmeerimiskeeled, kus "programmeerimine" ja "t~oestamine" on uks ja sama.
Loogika ja programmeerimine Curry-Howard'i vastavuse rakendused T~oestusassistendid { Nait. Isabelle/HOL, Coq { Kasutavad spetsiaalseid programmeerimiskeeli t~oestuste kirjutamiseks. { V~oimaldavad t~oestustest programme ekstraheerida (eraldada t~oestustest arvutuslikult oluline osa). Tuubiteoorial baseeruvad programmeerimiskeeled { Nait. Epigram, Agda { On reaalsed programmeerimiskeeled, kus "programmeerimine" ja "t~oestamine" on uks ja sama.