Semantika, tuubid, loogika ja programmeerimine

Similar documents
Milleks tüübid? Mida teeb järgmine programmijupp? x 1 := "Pii siinus on : "; x 2 := ; printx 2 ; print(sin(x 1 ));

Puudub protseduur. Protseduuri nimi võib olla valesti kirjutatud. Protseduuri (või funktsiooni) poole pöördumisel on vähem argumente kui vaja.

Topic 9: Type Checking

Topic 9: Type Checking

SQL Server 2005 Expressi paigaldamine

Vea haldus ja logiraamat hajutatud süsteemides Enn Õunapuu.

COMP1730/COMP6730 Programming for Scientists. Testing and Debugging.

Functional Programming and Haskell

Erik Jõgi. twitter.com/erikjogi twitter.com/codeborne

Mälu interfeisid Arvutikomponendid Ergo Nõmmiste

Lõimed. Lõime mõiste. Lõimede mudelid. Probleemid lõimedega seoses. Pthreads. Solarise lõimed. Windowsi lõimed. FreeBSD lõimed.

FUNKTSIONAALNE PROGRAMMEERIMINE. Animatsioonid

Programming Languages Fall 2013

EESTI STANDARD EVS-ISO 11620:2010

Dependent Polymorphism. Makoto Hamana

Andmebaasid (6EAP) I praktikum

Lambda-termide redutseerimine

EESTI STANDARD EVS-ISO/IEC 27003:2011

Informal Semantics of Data. semantic specification names (identifiers) attributes binding declarations scope rules visibility

XmlHttpRequest asemel võib olla vajalik objekt XDomainRequest

Dspace, milleks. -säilitamine, pikaajaline -avaldamine, kohe, ruttu ja kõikjale

CSc 372 Comparative Programming Languages

G Programming Languages - Fall 2012

Spring & AOP. Margus Jäger Lauri Tulmin

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions

CSC 326H1F, Fall Programming Languages. What languages do you know? Instructor: Ali Juma. A survey of counted loops: FORTRAN

2

Languages october 22, 2017 Éric Lévénez < FORTRAN III end-1958 FORTRAN II FORTRAN I october 1956

Lecture 1: Course Introduction

Principles of Programming Languages

COMP 201: Principles of Programming

PC204. Lecture 5 Programming Methodologies. Copyright 2000 by Conrad Huang and the Regents of the University of California. All rights reserved.

Programmeerimiskeeled. Sissejuhatus informaatikasse Aivar Annamaa 28. november 2012

A Tour of Language Implementation

TYPES OF PROGRAMMING LANGUAGES

Types and Type Inference

Software System Design and Implementation

Testing. Wouter Swierstra and Alejandro Serrano. Advanced functional programming - Lecture 2. [Faculty of Science Information and Computing Sciences]

NAS, IP-SAN, CAS. Loeng 4

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

Androidi rakenduste ligipääsu õigused

Standard prelude. Appendix A. A.1 Classes

SKILL AREA 304: Review Programming Language Concept. Computer Programming (YPG)

TARTU ÜLIKOOL. Arvutiteaduse instituut LOODUS- JA TÄPPISTEADUSTE VALDKOND

WD My Net N600 juhend:

QuickCheck, SmallCheck & Reach: Automated Testing in Haskell. Tom Shackell

Informatics 1 Functional Programming Lecture 5. Function properties. Don Sannella University of Edinburgh

Types and Type Inference

Software System Design and Implementation

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 15 Testing

Logic - CM0845 Introduction to Haskell

Lecture 1: Course Introduction

Topic I. Introduction and motivation References: Chapter 1 of Concepts in programming languages by J. C. Mitchell. CUP, 2003.

Chapter 5. Names, Bindings, and Scopes

CSCE 314 Programming Languages

Tuples. CMSC 330: Organization of Programming Languages. Examples With Tuples. Another Example

Programmeerimine. 3. loeng

Concepts in Programming Languages

Design Issues. Subroutines and Control Abstraction. Subroutines and Control Abstraction. CSC 4101: Programming Languages 1. Textbook, Chapter 8

A general introduction to Functional Programming using Haskell

Software II: Principles of Programming Languages. Why Expressions?

INF 212 ANALYSIS OF PROG. LANGS ELEMENTS OF IMPERATIVE PROGRAMMING STYLE. Instructors: Crista Lopes Copyright Instructors.

IT infrastruktuuri teenused. Failiserver. Margus Ernits

Faith, Evolution, and Programming Languages. Philip Wadler University of Edinburgh

Names, Scopes, and Bindings II. Hwansoo Han

Programming Paradigms Languages F28PL, Lecture 1

Course outline. CSE 341: Programming Languages. Why study programming languages? Course motivation and objectives. 1 lecture: Concepts

Pinu põhine puhvri ületäitumine DCE/RPC kontroll mootoris Cisco ASA 5500 seeria ja Cisco Catalyst 6500 seeria seadmetel CVE

D2D Coupon Dissemination

Provably Correct Software

Types, Type Inference and Unification

Informatics 1 Functional Programming Lecture 7. Map, filter, fold. Don Sannella University of Edinburgh

1 The smallest free number

cs242 Kathleen Fisher Reading: Concepts in Programming Languages, Chapter 6 Thanks to John Mitchell for some of these slides.

Lühike paigaldusjuhend TK-V201S TK-V401S 1.01

G Programming Languages Spring 2010 Lecture 6. Robert Grimm, New York University

Scripted Components: Problem. Scripted Components. Problems with Components. Single-Language Assumption. Dr. James A. Bednar

Scripted Components Dr. James A. Bednar

Programming with Math and Logic

UNIT I Programming Language Syntax and semantics. Kainjan Sanghavi

C07: Testing and JUnit

Haskell Types, Classes, and Functions, Currying, and Polymorphism

CSCI.4430/6969 Programming Languages Lecture Notes

CS 345. Functions. Vitaly Shmatikov. slide 1

How does ML deal with +?

Does the Shannon bound really apply to all data structures?

Lecture 4 Memory Management

Outline. Introduction to Programming (in C++) Introduction. First program in C++ Programming examples

CS A331 Programming Language Concepts

More Examples. Lecture 24: More Scala. Higher-Order Functions. Control Structures

Concepts Introduced in Chapter 7

Simon Peyton Jones Microsoft Research August 2013

Programs are: CMPSCI 105/119/120: Programming, Flowchar<ng, and Running Program Flowcharts

COSC Software Engineering. Lecture 23: Multilingual and Component Programming

Expressions and Assignment

Logic Programming II & Revision

Introduction to Scientific Computing Languages

Pädevushaldus RESTful veebiteenuste abil

CSE341, Spring 2013, Final Examination June 13, 2013

LECTURE 1. Overview and History

Transcription:

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.