1 Mitä funktionaalinen ohjelmointi on?

Koko: px
Aloita esitys sivulta:

Download "1 Mitä funktionaalinen ohjelmointi on?"

Transkriptio

1 1 Mitä funktionaalinen ohjelmointi on? On olemassa useita erilaisia ohjelmointiparadigmoja (programming paradigms) koska on useita erilaisia tapoja mallintaa ohjelmointiongelmia, esimerkiksi: Proseduraalinen ohjelmointi jossa mallinnuksen voi ajatella keskittyvän ohjaamaan tietokonetta. Esimerkkikieli: C. Olio-ohjelmointi jossa mallinnus keskittyy löytämään ongelmassa esiintyviä olioita ja niiden välisiä suhteita. Esimerkkikieliä: Java, C++, Objective C,... Tietovuo-ohjelmointi jossa mallinnus keskittyy tiedon kulkuun eri komponenttien välillä. Esimerkki ohjelmointiympäristöstä: LabView. Logiikkaohjelmointi jossa ongelma mallinnetaan loogisina relaatioina ja ohjelman suoritus todistamisena. Esimerkkikieli: Prolog. Ohjelmointiparadigmat liittyvät mallinnukseen, joten ne ovat sinänsä ohjelmointikielistä riippumattomia, mutta jokaiselle paradigmalle on suunniteltu omia kieliään, joilla siten suunniteltuja ohjelmia olisi vaivatonta kirjoittaa. Tällä kurssilla esiteltävä paradigma on siis Funktionaalinen ohjelmointi jossa mallinnus keskittyy löytämään ongelmasta sellaisia tiedon muunnoksia jotka voidaan esittää matemaattisina funktioina annetuilta syötetiedoilta haluttihin tulostietoihin. Ohjelmoinnissa funktion matemaattisuus tarkoittaa sitä, että se ottaa sisään informaatiota vain parametreissaan antaa ulos informaatiota vain tuloksessaan, ja tämä tulos riippuu vain sisään tulleesta informaatiosta. Tilaperustainen ja tilaton ohjelmointi Mutta meillähän on jo tuttu aliohjelman käsite! Mitä uutta funktionaalinen ohjelmointi muka tuo? Aliohjelma ei välttämättä ole funktio, koska se ei välttämättä noudata tätä informaationkulkukuria, vaan se voi lukea muistista (tai käyttäjältä tai tiedostosta tai...) jonkin ohjelmallisen muuttujan nykyisen arvon ja tämä on lisäinformaatiota joka ei näy sen argumenteissa! kirjoittaa tällaiselle muuttujalle uuden arvon jonka jälkeen tämän (tai jonkin toisen!) aliohjelman seuraava kutsukerta voikin palauttaa jonkin toisen arvon, vaikka sen saamat argumentit pysyisivätkin samoina! Hyvä ohjelmointapa kehottaa välttämään tällaisia aliohjelmia, koska ne vaikeuttavat ohjelman debuggausta ja muokkaamista. 1

2 Funktionaalisessa ohjelmoinnissa pyritään välttämään sellaisia jo suunnitteluvaiheessa. Yleisemmin eri ohjelmointiparadigmat voidaan ryhmitellä tilaperustaisiin joissa ohjelma sisältää sijoituslauseita (assignment statement) joka tämä = tuo 1 ensin laskee tuon lausekkeen (expression) arvon ja 2 sitten tallentaa sen tämän muistipaikan uudeksi sisällöksi. Ohjelman suoritus etenee askelin yhdestä muistin tilasta (eli sisällöstä) seuraavaan. Proseduraalinen ohjelmointi on tilaperustaista puhtaimmillaan: ohjelmoija kirjoittaa haluamansa askelsarjat. Useimmat olio-ohjelmointitavat ovat tilaperustaisia, joskin epäsuoremmin: oliolla on sisäinen tila jota sen metodit muokkaavat. tilattomiin joissa ohjelmoija ei käytäkään tällaista muokattavaa muistia ja ohjelman suoritus ei etenekään tällaisesta tilasta seuraavaan vaan jotenkin muuten. Funktionaalinen ohjelmointi on tilatonta: Muuttujaa määriteltäessä sille annetaan jokin arvo jota ei muuteta enää myöhemmin. Siten määrittely tämä = tuo antaa tämän nimen tuon lausekkeen arvolle. Ohjelman suoritus etenee laskemalla lausekkeiden arvoja (eikä tottelemalla lausein ilmaistuja käskyjä). Funktionaalista ohjelmointia kutsutaankin myös soveltavaksi (applicative) koska sen suoritusaskel on muotoa sovella (apply) tätä funktiota tuohon argumenttiin. Viittausten läpikuultavuus Tämä arvon nimeäminen mahdollistaa sen, että voimme korvata kaikki tämän nimen esiintymät lähdekoodissa tuolla lausekkeella, joka määritteli sen arvon, eikä ohjelman laskema tulos siitä muutu. Jos pelkän nimeämisen sijaan käytämmekin (uudelleen)sijoituslausetta, niin tätä ei voi enää tehdä, koska tämä muistipaikka voi sisältää eri arvoja eri aikoina ja nämä arvot riippuvat ohjelman suoritushistoriasta, joka ei näy pelkästä lähdekoodista. Samoin jos tuo lauseke sisältää sivuvaikutuksia, kuten syötteen lukemista käyttäjältä. Viittausten läpikuultavuus (referential transparency) tarkoittaa sitä, että ohjelmointikieli sallii tämän korvaamisen, koska tuon lausekkeen arvo on aina sama (eikä se riipu esimerkiksi siitä milloin se lasketaan). 2

3 Viittausten läpikuultavuus pätee pätee funktionaalisesti tehdyn ohjelmakoodin kaikissa niissä osissa, joissa ei käytetä kielen tilaperustaisia piirteitä voi rikkoutua tilaperustaisen ohjelmakoodin missä tahansa osassa, koska missä tahansa voi taphtua esimerkiksi uudelleensijoitus. Jos ohjelmoija voi luottaa viittausten läpikuultavuuteen, niin hän voi käsitellä ohjelmakoodiaan matemaattisin menetelmin. Matemaattisten menetelmien soveltaminen tilaperustaiseen ohjelmointiin on epäsuorempaa: Voidaan käsitellä ohjelman loogista spesifikaatiota, eli loogisia väitteitä siitä mitä ohjelma tekee mutta ei itse ohjelmakoodia. Funktionaalinen ohjelmoija voi käsitellä koodiaan erityisesti algebrallisesti: Hän voi muodostaa koodiyhtälöitä koodi koodi (1) jotka tarkoittavat ohjelmakoodinpätkä koodi laskee kaikilla muuttujiensa arvoilla saman tuloksen kuin ohjelmakoodinpätkä koodi. Viittausten läpikuultavuuden nojalla hän voi korvata ohjelmakoodinpätkän toisella koodiyhtälönsä (1) mukaisesti, eikä ohjelman muu koodi mene siitä rikki. Tilallisessa ohjelmoinnissa koodiyhtälöitä (1) on hankalampi muodostaa ja tarkistaa: Päteekö esimerkiksi koodiyhtälö 1 y = 1 x; 2 if x y 3 P 4 else Q 1 y = 1 x; 2 P kaikilla kokonaisluvun sisältävillä muistipaikoilla x ja y? (P ja Q ovat mielivaltaista ohjelmakoodia.) Ei jos x ja y ovat sama muistipaikka! (Muuten kyllä.) Se voi puolestaan riippua (ei vain näistä ohjelmakoodinpätkistä vaan myös) ohjelman muusta tilasta ja suoritushistoriasta: Olkoot x ja y viittaukset a[i] ja a[j] samaan taulukkoon a. Tämän vuoksi tilallisessa ohjelmoinnissa tavallisesti todistetaankin konkreettinen koodi toimivaksi eikä yritetä lausua abstraktimpia yleisperiaatteita kaikilla x ja y pätee Tällaisessa todistuksessa käsitellään loogisia väitteitä jotka koskevat suorituksen tilaa ohjelmakoodin eri kohdissa väitteet ilmaistaan eri kielellä kuin koodi. 3

4 Miksi funktionaalinen ohjelmointi on kiinnostavaa? Ohjelmistotekniikan näkökulmasta: Ohjelmoijan kannattaa tuntea erilaisia ohjelmointiparadigmoja, jotta kohdatessaan erilaisia ohjelmointiongelmia hän osaa valita kuhunkin niistä sopivimman. Jos sinulla on vain vasara, niin kaikki näyttää naulalta. Funktionaalinen ohjelmointi painottaa erittäin tiukkoja rajapintoja. Millaista sellainen ohjelmointi on vapauteen tottuneelle ohjelmoijalle? Funktionaalinen ohjelmointi painottaa koodin uudelleenkäytettävyyttä erilaisten abstraktioiden kautta ja tarjoaa siihen välineitä. Funktionaalinen ohjelmointi kannustaa näin kokoamaan ohjelmat monesta pienestä (aiemmin ohjelmoidusta) funktiosta. Teorian näkökulmasta: LAP-kurssilla mainitut Turingin koneet ovat hyvä teoreettinen malli sille, miten mekaaninen tilaperustainen laskenta etenee ja mitä sillä voidaan laskea. Turingin koneiden teoria ei kuitenkaan tarjoa kovin luontevaa mallia sille, mikä ohjelma on itsenäisenä käsitteenä erillään sitä suorittavasta laitteesta. Funktionaalisen ohjelmoinnin taustalla oleva λ-laskenta voidaan nähdä tällaisena ohjelmien teoriana. Funktionaalinen ohjelmointi on λ-laskennan kautta ohjelmaparadigmoista lähimpänä formaalin logiikan todistusteoreettisia ideoita. Funktionaalinen ohjelmanpätkä ja sen oikeellisuustodistus voidaan ilmaista samalla kielellä. Ohjelmointikielten näkökulmasta: Tämä λ-laskenta on myös yleisen ohjelmointikielten teorian perusväline. Se soveltuu funktionaalisen ohjelmoinnin lisäksi muihinkin ohjelmointiparadigmoihin. Esimerkiksi tilaperustainen ohjelmointikieli voidaan mallintaa muokattavan muistin ja λ-laskennan yhdistelmänä. Siinä yhdistelmässä λ-laskenta tarjoaa aliohjelman ja muuttujannimen käsitteet, mutta ne nimeävätkin muistipaikkoja. Ohjelmointikielten uusia ideoita esitelläänkin koekäyttöön usein ensin johonkin funktionaaliseen kieleen, koska niissä matka teoriasta käytäntöön on lyhyt. Siksi ohjelmointikielistä kiinnostuneen kannattaa tuntea myös λ-laskentaa ja funktionaalista ohjelmointia, vaikka pääkiinnostus olisikin muissa ohjelmointiparadigmoissa. Millaiseen ohjelmointitehtävään funktionaalinen ohjelmointi soveltuu erityisen hyvin? Sellaiseen, jossa saatuun syötteeseen kohdistetaan jokin (monivaiheinen) muunnos, ja lopuksi ilmoitetaan muunnoksen tuottama tulos. 4

5 Sellaiseen, jossa tällä muunnettavalla informaatiolla on lista- tai puurakenne. Tällaista on esimerkiksi XML-dokumenttien käsittely. Tällaista on myös ohjelmointikielen kääntäminen: 1 Selausvaihe lukee lähdekooditiedoston ja muuntaa sen alkiojonoksi. 2 Jäsennysvaihe muuntaa alkiojonon sitä vastaavaksi jäsennyspuuksi kieliopin mukaisesti. 3 Seuraavat työvaiheet kuten tyypintarkistus jne. käyvät läpi jäsennyspuuta ja lisäävät siihen uutta informaatiota. 4 Lopuksi koodingenerointivaihe käy läpi lopullisen jäsennyspuun ja tulostaa sitä vastaavan konekoodin tulostiedostoon. Millaiseen ohjelmointitehtävään funktionaalinen ohjelmointi ei sovellu kovin hyvin? Sellaiseen, jossa halutaankin tuottaa jokin vaikutus (eikä tulosta). Esimerkiksi ikkunoiva käyttöliittymä. Sellaiseen, jossa keskeisessä osassa on jokin tila jota luetaan ja päivitetään eri tavoin monessa eri kohdassa ohjelmaa koska silloin tämä tila toimii informaationsiirtokanavana ohjelman osien välillä. Esimerkiksi jonkin tietokannan ympärille rakennettu ohjelma. Sellaiseen, jossa on seurattava tarkasti suoitusajan ja muistin kulutusta. Esimerkiksi laiteläheinen ohjelmointi. Tällaisissa ohjelmointitehtävissä funktionaalisen ohjelmoinnin haasteena onkin modulaarisuus: Suunnitella sellaiset rajapinnat, joilla ohjelma voidaan osittaa funktionaaliseen ja ei-funktionaaliseen osaan sekä niiden väliseen kommunikointiin. 2 Lambda-laskennan perusteista Esitellään seuraavaksi λ-laskennan pääperiaatteet. Valitsemme ohjelmoijan näkökulman aiheeseen: Meille λ-laskenta on abstrakti melli ohjelmointikielelle. Tämä abstraktius tarkoittaa, että esitämme ohjelmointikielen ja sen toiminnan puhtaasti mekaanisena systeeminä joka käsittelee symbolisia lausekkeita. Me emme siis vetoa mihinkään taustalla olevaan tietokoneeseen (tai sellaisen abstraktiin malliin malliin, kuten Turingin koneisiin) jossa olisi muistipaikkoja joita ohjelman suoritus muokkaisi edetessään, tai muuhun sellaiseen. 5

6 Termien syntaksi Otetaan käyttöön joukko X Muuttujasymboleita. Tyypittömän λ-laskennan Termien kontekstiton kielioppi: Termi Muuttuja (2) λmuuttuja.termi (3) (Termi 1 Termi 2 ) (4) Termistä voi jättää pois sisäkkäisiä sulkuja sopimalla että ja niin edelleen. (Termi 1 Termi 2 Termi 3 ) on sama kuin ((Termi 1 Termi 2 ) Termi 3 ) (5) Sulkuja voi jättää pois myös sopimalla, että λ-abstraktion (3) sisällä oleva Termi on mahdollisimman laaja eli että sen Muuttuja näkyy mahdollisimman laajasti. Termiin voi myös lisätä sulkuja (...) selkeyttämään sen rakennetta lukijalle. Termien merkitysoppi Ohjelmoijina ajattelemme Termiä lähdekoodin pätkänä: λ-abstraktio (3) määrittelee funktion, jonka ainoa formaali parametri on tämä Muuttuja ja tulos on tuon Termin arvo tälle Muuttujalle annetulla argumenttiarvolla. Muuttuja (2) viittaa tällaiselle formaalille parametrille annettuun argumenttiarvoon. Soveltaminen (4) kutsuu sitä funktiota jota Termi 1 esittää sillä argumenttiarvolla jota Termi 2 esittää. Muuttujan x esiintymä Termissä f on vapaa jos se ei ole minkään λ-abstraktion (3) λx.g sisällä, eli sen Termissä g sidottu muuten lähimpään sen sisältävään λ-abstraktioon (3) λx.g. Siten λ-abstraktioilla (3) on tuttu leksikaalinen näkyvyys (lexical scope). Termi on suljettu (closed) jos kaikki siinä olevat Muuttujan esiintymät ovat sidottuja. Määritellään λ-laskenta koodiyhtälöinä Termi Termi. Sellainen tarkoittaa intuitiivisesti, että kun valitaan mitkä tahansa Termit arvoiksi niissä vapaina esiintyville muuttujille, niin kummankin antama tulos on sama. Idea on sama kuin koodiyhtälössä (1). Emme kuitenkaan ole vielä määritelleet, mitä tarkoitamme tuloksella... 6

7 Määritellään keskeinen apuoperaatio f[x a] = Termi f jossa Muuttujan x jokainen vapaa esiintymä on korvattu Termillä a induktiolla yli Termin f rakenteen seuraavasti: { a kun y on sama Muuttuja kuin x y[x a] = y kun y on eri Muuttuja kuin x. Ylemmässä haarassa tapahtuu se korvaus. { λy.g kun y on sama Muuttuja kuin x λy.g[x a] = λy.(g[x a]) kun y on eri Muuttuja kuin x. Alemmassa haarassa vaaditaan myös, ettei Muuttuja y esiinny vapaana Termissä a, jotta tämä korvaus olisi laillinen. 2.1 α-konversio (g h)[x a] = ((g[x a]) (h[x a])). Ensimmäinen koodiyhtälömme on α-konversio (α-conversion): λx.f λy.(f[x y]) (α) jossa tämän korvauksen pitää olla laillinen. Laillisuus voidaan järjestää valitsemalla Muuttuja y sopivasti. Tämä α-konversio sanoo, että formaalille parametrille annetulla nimellä ei ole merkitystä. Ohjelmointikielen toteutuksessa ei tarvita tätä α-konversiota, koska käännetyssä koodissa ei enää ole Muuttujannimiä. Muistisääntö: α is about the alphabet. 2.2 β-reduktio Keskeisin koodiyhtälömme on β-reduktio (β-reduction): ((λx.f) g) f[x g] (β) jossa tämän korvauksen pitää olla laillinen. Vasemmalta oikealle luettuna se määrittelee mitä funktiokutsu tarkoittaa: Formaali parametri x korvataan argumentilla g kutsuttavan funktion rungossa f. Laillisuus voidaan aina järjestää tekemällä Termiin f ensin tarvittavat α- konversiot. Sellainen lauseke, joka on samaa muotoa kuin sen vasen puoli, on nimeltään redeksi (redex, reducible expression). Tämä β-reduktio on funktionaalisen ohjelman suorituksen perusaskel. Muistisääntö: β is the basic computation step. 7

8 Kuritus Vailla λ-laskennassa määritelläänkin vain 1-parametriset funktiot, niin siinä on myös 2-parametriset funktiot: ((λx.λy.f) g h) (((λx.(λy.f)) g) h) kun sulut merkitään näkyviin. Tämä selittää myös miksi näkymättömät sulut sovittiin näin päin. kun tehdään 1. β-reduktio. kun tehdään 2. β-reduktio. ((λy.(f[x g])) h) f[x g][y h] Siten 1. parametri x korvautui 1. argumentilla g, ja 2. parametri y korvautui 2. argumentilla h, kuten pitääkin. Näin k-parametrinen funktio voidaan kirjoittaa 1-parametrisena funktiona, jonka runko on (k 1)-parametrinen funktio, ja niin edelleen. Ääritapauksena vakiot ovat 0-parametrisia funktioita. Tämän tekniikan nimi on Currying. Suomeksi voisimme kutsua sitä kuritukseksi. Kuritus on yleistä funktionaalisessa ohjelmoinnissa, jossa on luontevaa määritellä sellainen funktio, joka palauttaa tuloksenaan toisen funktion. Funktionaaliset ohjelmointikielet mahdollistavat kurituksen, mutta useimmissa niistä sitä käytetään silti harvoin. Ohjelmointikielessä Haskell kuritusta käytetään hyvin usein. Kuritus lisää omalta osaltaan koodin modulaarisuutta, koska esimerkiksi osittain kutsuttu funktio ((λx.λy.f) g) voi olla hyödyllinen eri arvoilla h 1, h 2, h 3, η-konversio Kolmas koodiyhtälömme on η-konversio (η-conversion): f λx.(f x) jos Muuttuja x ei esiinny vapaana Termissä f. (η) Sen oikealla puolella voidaan ehkä tehdä sellaisia β-reduktioita, joita sen vasemmalla puolella ei voida tehdä (koska siellä ei ole Muuttujaa x). Näin se ilmaisee ekstensionaalisuus-idean: Kaksi Termiä tarkoittavat samaa täsmälleen silloin kun ne antavat saman tuloksen kaikilla argumenteilla. Toisin sanoen, vain Termin tuloksilla on väliä, mutta ei sillä miten se on kirjoitettu. Vastakkainen idea olisi nimeltään intensionaalisuus. Muistisääntö: η is about extensionality. 8

9 2.4 Normalisointi Normaalimuodon (Normal Form, NF) idea on yleisesti: Olkoon meillä jokin kieli, jossa voimme ilmaista saman asian monin eri tavoin. Keskitymme yhteen tiettyyn tapaan, ja muunnamme eli normalisoimme muut ilmaukset sellaisiksi. Esimerkiksi propositio- eli lauselogiikassa voimme käyttää negaatioita ( ), konjunktioita ( ) ja disjunktioita ( ) monin eri tavoin ilmaisemaan saman loogisen väitteen. Konjunktiivisessa normaalimuodossa (Conjunctive NF, CNF) keskitymme ilmaisemaan väitteet seuraavasti: Disjunktio Konjunktio Literaali Konjunktio Konjunktio Disjunktio Literaali Literaali Konjunktio Propositiosymboli Propositiosymboli Koska tahdomme määritellä käsitteen Termin tulos niin silloin luonteva normaalimuoto on: Termi on β-normaalimuodossa täsmälleen silloin kun siinä ei ole yhtään redeksiä. Intuitiivisesti, kun se on loppuun saakka laskettu. Usein etuliite β- jätetäänkin pois, ja niin mekin teemme. Normalisointi voidaan ilmaista yleisellä tasolla seuraavana pseudokoodina: normalisoi f 1 while Termissä f on yhä redeksejä 2 Valitse jokin niistä; 3 Korvaa se vastaavan β-reduktion oikealla puolella; 4 return f. Tämä on λ-ohjelmointikielemme toteutus epädeterministisenä (rivi 2) ja tulkattuna (rivi 3). Käytännössä ohjelmointikielet määritellään (useimmiten) deterministisinä ja ne voidaan toteuttaa kääntäjinä, joiden ei tarvitse etsiä ja korvata redeksejä. Termillä ei välttämättä ole normaalimuotoa. Esimerkiksi Termin normalisointi ei koskaan pääty. (λx.(x x)) (λx.(x x)) (6) Intuitiivisesti sellaiset Termit vastaavat päättymätöntä laskentaa. 9

10 normalisoinnin päättyminen voi riippua rivin 2 valinnoista. Esimerkiksi Termissä (λy.λz.z) (Termi (6)) (7) kutsuttava funktio ei käytä lainkaan parametriaan y, joten sen normalisointi pysähtyy, jos joskus valitaan se redeksi (eikä koko ajan Termiä (6)). Lause 1 (normaalimuodon yksikäsitteisyys). Jos Termillä on monia eri β-normaalimuotoja, niin ne saadaan täsmälleen samaan muotoon α-konversioilla. Siten voimme määritellä, että Termin tulos on sen (mikä tahansa) β-normaalimuoto, koska se on hyvin määritelty. Lause 1 osoittaa λ-laskennan kiinnostavuuden myös rinnakkaisuuden (parallelism) kannalta: Ohjelman lopputulos pysyy samana, vaikka sen eri osia β-redusoitaisiinkin yhtä aikaa. Kun λ-laskennalla mallinnetaan ohjelmointikieliä, niin silloin käytetäänkin jotakin heikkoa (Weak) normaalimuotoa β-normaalimuodon sijasta... jossa redeksin etsintä ei etene λ-abstraktion λx.g sisään sen alitermiin g... koska se on käännetty konekieliseksi aliohjelmaksi, ja sen alitermiin g muokkaaminen tarkoittaisi jo käännetyn konekoodin muokkaamista ja sellaista kutsutaan eikä muokata. Lause 2 (Turing-täydellisyys). Osittain määritelty funktio f : N N voidaan laskea Turingin koneella täsmälleen silloin kun f voidaan esittää tyypittömän λ-laskennan Terminä. Osittain määritelty (partially defined, partial) funktio g on sellainen, jonka tulosta ei olekaan määritelty jokaiselle mahdolliselle parametrin arvolle. Esimerkiksi g(n) = 1 n on sellainen, koska parametrin arvolla n = 0 sen tulosta 1 0 ei ole määritelty. Lauseen 2 vasenta puolta varten pitäisi ensin määritellä, mitä tarkoittaa että Turingin kone M laskee funktion f : Sovitaan luonnollisille luvuille N jokin esitystapa merkkijonoina, jotta Turingin koneet voivat lukea ja kirjoittaa niitä nauhoillaan. Kun moninauhainen M saa syötenauhallaan luvun n merkkijonona (ja sen mahdolliset työnauhat ovat aluksi tyhjiä) niin laskenta joko pysähtyy ja sen tulosnauhalla on arvo f(n) merkkjonona tai ei pysähdy jos arvoa f(n) ei ole määritelty. Kääntäen Lauseen 2 oikeaa puolta varten pitäisi määritellä, mitä tarkoittaa Termi h esittää funktion f : Sovitaan jokaiselle luonnolliselle luvulle n N jokin Termi n joka esittää sitä, jotta Termien voidaan ajatella laskevan luonnollisilla luvuilla. SovellusTermin normalisointi 10 (h n )

11 joko päättyy ja sen normaalimuoto on arvon f(n) esitys f(n) Terminä tai ei pääty kun arvoa f(n) ei ole määritelty. Lauseen 2 perusteella myös tyypittömien λ-termien normalisointi on eräs mekaanisen laskettavuuden (computability, eli sen mitä voidaan laskea) malli vaikka se ei olekaan lainkaan niin ilmeistä kuin Turingin koneilla. Toisin kuin Turingin koneilla, tässä mallissa on laiteriippumaton itsenäinen ohjelman käsite: Termit. Eräs yksinkertainen luonnollisten lukujen Termiesitys ovat Churchin numeraalit n = λf.λx.(f (f (f (...(f } {{ } n kappaletta eli sovella n kertaa funktiota f argumenttiin x. Siten 0 = λf.λx.x Esimerkiksi niiden yhteenlasku on 1 = λf.λx.(f x) 2 = λf.λx.(f (f x)). m + n = λf.λx.(( n f) ( m f x)). x)...)))) Lause 3 (normaali sievennysjärjestys). Jos rivillä 2 valitaan aina vasemmanpuoleisin redeksi, niin silloin Termin normalisointi päättyy jos sillä on jokin normaalimuoto. Näin käy esimerkiksi Termillä (7). Tämä valinta tarkoittaa, että kun redeksin etsintä aloitetaan koko Termin juuresta, ja kohdataan soveltaminen (Termi 1 Termi 2 ) niin siitä jatketaan etsintää ensin Termi 1 stä, ja jos sieltä ei löydy, niin vasta sen jälkeen Termi 2 sta. Tätä valintaperiaatetta kutsutaan normaaliksi sievennysjärjestykseksi (normal order reduction). Päänormaalimuodossa (Head NF) redeksiä etsitään soveltamisessa vain Termi 1 stä, ja Termi 2 unohdetaan. Lauseen 3 mukaan valitsemalla aina mekaanisesti Mene aina (ensin) vasemmalle! löydetään aina sellainen redeksi, jonka valitseminen on oikein, koska sen valitseminen ei voi johtaa normalisointia mihinkään ikuiseen silmukkaan, joka olisi voitu välttää valitsemalla jokin muu redeksi sen sijasta. Siten oikean redeksin valintaan ei (ehkä yllättäen) tarvitakaan älykkyyttä, joten myös tyypittömien λ-termien normalisointi on eräs mekaanisen laskennan (computation, eli sen, miten voidaan laskea) malli vaikka se ei olekaan lainkaan niin ilmeistä kuin Turingin koneilla. 11

12 Lauseen 3 mukaan normaali sievennysjärjestys sallii koodiyhtälöiden vapaan käytön: Jos Termissä f korvataan jokin sen alitermi g jollakin toisella Termillä h jolla f h, niin Termin f normalisointi ei voi sen seurauksena muuttua pysähtyvästä pysähtymättömäksi. Muut sievennysjärjestykset eivät pysty takaamaan tätä! Normaalissa sievennysjärjestyksessä redeksi (funktio argumentti) suoritetaan niin, että argumenttia ei lasketakaan ennen kuin se lähetetään kutsuttavaan funktioon sen parametrina. Sen sijaan argumentti lasketaankin vain jos kutsuttava funktio tarvitsee sen arvoa. Esimerkiksi Termissä (7) kutsuttava funktio ei tarvitse argumenttinsa arvoa ja sen laskeminen johtaisikin ikuiseen silmukkaan. Tätä parametrinvälitystapaa kutsutaan nimellä CBN: Call by... Name jos argumentti lasketaan aina uudelleen jokaisen kerran kun funktio tarvitsee sen arvoa, koska se sai parametrinaan arvon nimen eli määritelmän. Need jos argumentti lasketaankin vain silloin kun funktio tarvitsee sen arvoa ensimmäisen kerran, ja se muistetaan myöhäisempiä kertoja varten. Tämtä kutsutaan myös laiskaksi (lazy) suoritukseksi, koska argumentti lasketaan vain jos sen arvoa tarvitaan, ja silloinkin vain kerran. Kun käytössä on Call by Name, niin β-reduktiot etenevät (λx.(x x)) ((λy.a y) b) ((λy.a y) b) ((λy.a y) b) (a b) ((λy.a y) b) (a b) (a b) koska argumenttilausekkeen kumpikin kopio β-redusoidaan erikseen. Kun käytössä on Call by Need, niin ne etenevät kuin (x x) jossa x on ((λy.a y) b) koska siinä muistetaan, että Muuttujan x molemmat esiintymät jakavat yhteisen argumenttilausekkeen. Sitten (x x) jossa x on (a b) koska tämä yhteinen argumenttilauseke β-redusoidaan vain kerran, ja sen arvo näkyy samalla kumpaankin esiintymään. Se tarkoittaa samaa kuin (a b) (a b). Nykyisissä ohjelmointikielissä käytetään kuitenkin tavallisesti muuta kuin normaalia sievennysjärjestystä: tavallisesti redeksi (funktio argumentti) määritelläänkin sievennettäväksi niin, että 12

13 1 ensin lasketaan argumentti arvoonsa a, ja vasta 2 sitten kutsutaan funktiota siten, että sen parametriksi annetaan tämä laskettu arvo a. Se voidaan määritellä normalisoinnissa siten, että 1 ensin normalisoidaankin sen argumentti näillä samoilla säännöillä, ja vasta 2 sitten suoritetaan tämän redeksin β-reduktio. Tätä parametrinvälitystapaa kutsutaan nimellä Call by Value (CBV). Sitä kutsutaan myös ahkeraksi tai innokkaaksi (eager) koska siinä riennetään laskemaan a tietämättä onko se tarpeen. Sitä kutsutaan myös tiukaksi (strict) koska a lasketaan siksi että niin ohjelma käskee tekemään. Kääntäen, CBN on non-strict, suomeksi vaikkapa rento. Ahkeraan ohjelmointikieleen voidaan lisätä tuki laiskuudelle (joko uutena piirteenä tai erillisenä kirjastona). Esimerkiksi Lisp-murteessa Scheme (Dybvig, 1996, luku 5.7) lauseke (delay e) ei laskekaan argumenttilausekkeensa e arvoa heti, vaan luo siitä lupauksen (promise) p, jonka (force p) myöhemmin lunastaa, eli sieventää lausekkeen e arvoonsa a. Jos sama p lunastetaan uudelleen, niin lauseketta e ei sievennetä uudelleen, vaan käytetään jo saatua arvoa a. Ohjelmoijan vastuulle jää kertoa koodissaan, mitkä sen osat hän haluaa suoritettavan laiskasti eikä ahkerasti koordinaatio laiskan ja ahkeran koodinsa välillä. Jos e ei ole funktionaalista koodia, niin a riippuu siitä, milloin p lunastetaan ensimmäisen kerran! pysytellä funktionaalisena laiskan koodinsa sisällä mutta ohjelmointikielet eivät voi yleensä varmistaa, että hän tottelisi... Laiskassaa ohjelmointikielessä on puolestaan käänteinen ongelma: Miten ohjelmoija voi kertoa koodissaan, että sen jokin osa pitääkin suorittaa ahkerasti eikä laiskasti? Erityisesti: Miten laiskassa kielessä ilmaistaan, että tämä osa koodia pitää suorittaa loppuun ennen kuin tuon osan suoritus alkaa? Koska laiska suoritusjärjestys riippuu vain siitä, mitä informaatiota kutsuttava funktio käyttää argumentistaan, niin ohjelmoijan on luotava tällainen riippuvuus: tämän funktion pitää tuottaa jokin sellainen välitulos, jota tuo funktio tarvitsee päästäkseen käyntiin. Silloin laiskankin suorituksen on pakko edetä samassa järjestyksessä kuin ahkera etenisi. 13

14 Ohjelmointikielemme Haskell käyttää tätä lähestymistapaa esimerkiksi siinä osassa ohjelmaa, jolla on oikeus suorittaa I/O-operaatioita. Haskell voi varmistaa tämän oikeuden jo ohjelmakoodin käännösaikana kehittyneen tyyppijärjestelmänsä vuoksi. Kolmas yleinen parametrinvälitystapa on Call by Reference (CBR) jossa kutsuttava funktio saakin parametrinaan sen muistiosoitteen johon argumentti on talletettu. Silloin kutsuttava funktio voi vaihtaa koko argumenttinsa arvon toiseksi. Siten CBR rikkoo funktioiden informaationkulkukuria, jonka mukaan informaatiota saa tulla ulos vain tuloksessa. Oliokielissä käytetään usein CBR-johdannaista, jossa funktio ei voi vaihtaa koko argumenttiaan kokonaan toiseksi olioksi, mutta se voi muuttaa sen sisältöä. Tätä johdannaista on kutsuttu nimellä Call by Worth (CBW). CBW on myös laiskuuden toteutustekniikka: Silloin ohjelmointikielen toteutuksen ajonaikainen järjestelmä (run-time system) voi muuttaa argumenttina saadun lausekkeen arvokseen. Näin saadaan toteutettua lasketun argumenttiarvon muistaminen siten, että kun kutsuttu funktio viittaa argumenttiinsa joskus myöhemmin, niin se näkeekin sille nyt lasketun arvon. Muistintaminen (memoization) on yleisnimi tällaiselle ohjelmointitekniikalle, jossa funktion toimintaa tehostetaan sisäisesti muistamalla sen laskemia välituloksia, vaikka funktio näyttääkin ulospäin yhä matemaattiselta. 2.5 δ-määritelmät Nämä αβη-periaatteet antavat puhtaan λ-laskennan, jossa on vain Termien funktioita, mutta ei minkään muun tyyppisiä alkioita. Esimerkiksi luonnolliset luvut N lisättiin leikisti päättämällä, että tietty Termi n esittää luonnollista lukua n N. Matematiikassa yleisesti ja ohjelmoinnissa erityisesti on kuitenkin hyödyllistä ajatella, että jotkut perusasiat kuten Z = {..., 2, 1, 0, 1, 2,...} ja B = {False,True} ja niiden alkeisoperaatiot on jo annettu valmiina. (Vertaa konearitmetiikka.) Sitten voimme tarkastella miten λ-laskennalla voi määritellä niille mutkikkaampia funktioita. δ-reduktiot ovat tekninen väline tähän. Muistisääntö: δ is about definitions. Esimerkiksi kokonaisluvut Z voidaan lisätä aidosti λ-laskentaan seuraavasti: Myös jokainen kokonaisluku on Termi. 14

15 Tällaiset vakiotermit ovat valmiiksi normaalimuodossaan (joten niitä ei tietenkään enää tarvitse laskea eteenpäin). Myös alkeisoperaatioita saa käyttää Termien muodostamiseen. Esimerkiksi p + Z q, jossa + Z on alkeisoperaation kahden kokonaisluvun yhteenlasku nimi, on Termi kun myös sen argumentit p ja q ovat. Tällaisen alkeisoperaation merkitysoppi on annettu kokoelmana (joka saa olla ääretön) δ-reduktioita ja niin edelleen. 0 + Z Z Z Z Z Z 2 3 Tällainen vasen oikea luetaan jos redeksiä etsittäessä kohdataan vasen puoli, niin korvataan se oikealla puolella. Ennen tätä korvausta kumpikin Termi p ja q on ensin pitänyt normalisoida vastaaviksi vakioiksi. Siten alkeisoperaatiot voivat tarvita argumenttiensa arvoja ahkerasti myös laiskassa kielessa. Ehtolauseke on puolestaan totuusarvojen B keskeinen alkeisoperaatio: Sen δ-reduktiot ovat if True toka vika toka if False toka vika vika. Se siis tarvitsee ensimmäisen parametrinsa totuusarvoa, mutta ei tokan eikä vikan parametrinsa arvoa. Itse asiassa tokan ja vikan arvoa ei saa laskea, ennen kuin on selvinnyt, kumpaa niistä tarvitaan. Siten ahkerakin kieli tarvitsee myös tämän rennon piirteen. Tämä piirre lisätään ahkeraan kieleen kontrollirakenteina kuten if... then... else... joilla ohjelmoija ohjaa käsin sievennyksen etenemistä. Laiska kieli ei puolestaan tarvitse tätä jakoa kontrollirakenteisiin ja lausekkeisiin, koska siellä if voidaan tulkita tavalliseksi funktioksi Ohjelmoijan tekemät määritelmät Myös ohjelmoija voi kirjoittaa omia määritelmiään muodossa Muuttuja = Termi ja nekin tulkitaan kuten alkeisoperaatioiden δ-reduktiot: Jos redeksin etsintä kohtaa tämän Muuttujannimen, niin korvaa se tuolla Termillä. Funktionaalinen ohjelma onkin kokoelma tällaisia määritelmiä, ja sen suoritus on annetun Termin redusointia niitä käyttäen. Nämä määritelmät saavat olla rekursiivisia eli niiden oikean puolen Termi saavat käyttää niiden vasenten puolten Muuttujannimiä. 15

16 Rekursio onkin arkipäiväistä funktionaalisessa ohjelmoinnissa: Ohjelmoinnin perustyökalu on funktionkutsu, eikä ole eroa kutsutaanko siinä jotakin toista vaiko tätä samaa funktiota. Tämä johtuu siitä, että funktionaalisessa ohjelmoinnissa kaikki toisto pitää ilmaista rekursion avulla: Miten tavallinen silmukka kuten kertomafunktion arvon laskenta 1 m = 1; 2 while n > 1 3 m = m n; 4 n = n 1; 5 return m n! = n voisi pysähtyä, jos silmukan runko ei saakaan muuttaa sen ehdossa mainittujen muuttujien arvoja? Tämän silmukan rekursiivisessa muotoilussa fact = λn. if (n > 1) (n fact (n 1)) 1 (8) jokainen rekursiokutsu saakin oman paikallisen kopionsa muuttujasta n, ja niillä saa siten olla eri arvot. Funktionaalisen ohjelmoijan näkökulmasta silmukka onkin yksinkertaista rekursiota, eikä kaksi erillistä käsitettä. Arvon 2! laskenta etenee ahkerasti seuraavalla tavalla, jossa alleviivaus osoittaa sen kohdan, jota käsitellään seuraavaksi, ja alaindeksi osoittaa, mitä sille tehdään: fact 2 δ (λn. if (n > 1) (n fact (n 1)) 1) 2 β if (2 > 1) (2 fact (2 1)) 1 δ if True (2 fact (2 1)) 1 δ 2 fact (2 1) δ 2 fact 1 δ 2 ((λn. if (n > 1) (n fact (n 1)) 1) 1) β 2 (if (1 > 1) (1 fact (1 1)) 1) δ 2 (if False (1 fact (1 1)) 1) δ 2 1 δ 2. 16

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

Lisää pysähtymisaiheisia ongelmia

Lisää pysähtymisaiheisia ongelmia Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti

Lisätiedot

Matematiikan tukikurssi, kurssikerta 2

Matematiikan tukikurssi, kurssikerta 2 Matematiikan tukikurssi kurssikerta 1 Relaatioista Oletetaan kaksi alkiota a ja b. Näistä kumpikin kuuluu johonkin tiettyyn joukkoon mahdollisesti ne kuuluvat eri joukkoihin; merkitään a A ja b B. Voidaan

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 13. lokakuuta 2016 Sisällys Harjoitustehtävätilastoa Tilanne 13.10.2016 klo 9:42 passed waiting redo submitters

Lisätiedot

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016 ICS-C2000 Tietojenkäsittelyteoria Kevät 206 Kierros 0, 2. 24. maaliskuuta Huom! Perjantaina 25. maaliskuuta ei ole laskareita (pitkäperjantai), käykää vapaasti valitsemassanne ryhmässä aiemmin viikolla.

Lisätiedot

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Lisää laskentoa TIEA341 Funktio ohjelmointi 1 Syksy 2005 Kertausta: Laajennettu aritmetiikka Lasketaan rationaaliluvuilla vakiot yhteen, vähennys, kerto ja jakolasku Laajennetaan sitä määrittelyillä: vakio

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 1 Määrittelyjoukoista Tarkastellaan funktiota, jonka määrittelevä yhtälö on f(x) = x. Jos funktion lähtöjoukoksi määrittelee vaikkapa suljetun välin [0, 1], on funktio

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013 ja ja TIEA241 Automaatit ja kieliopit, kesä 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. kesäkuuta 2013 Sisällys ja ja on yksi vanhimmista tavoista yrittää mallittaa mekaanista laskentaa. Kurt

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

Tutoriaaliläsnäoloista

Tutoriaaliläsnäoloista Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VI Funktionaalinen ohjelmointi Sisältö 1. Johdanto ja peruskäsitteitä 2. LISP- ja Scheme-kielet 3. Haskell 4. IO funktionaalisissa kielissä 5. Muita funktionaalisia

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 4 Jatkuvuus Jatkuvan funktion määritelmä Tarkastellaan funktiota f x) jossakin tietyssä pisteessä x 0. Tämä funktio on tässä pisteessä joko jatkuva tai epäjatkuva. Jatkuvuuden

Lisätiedot

JFO: Johdatus funktionaaliseen ohjelmointiin

JFO: Johdatus funktionaaliseen ohjelmointiin 3621334 JFO: Johdatus funktionaaliseen ohjelmointiin Matti Nykänen Tietojenkäsittelytieteen laitos, Itä-Suomen yliopisto matti.nykanen@uef.fi Lukuvuosi 2013-14, III periodi Sisältö 1 Mitä funktionaalinen

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

SAT-ongelman rajoitetut muodot

SAT-ongelman rajoitetut muodot SAT-ongelman rajoitetut muodot olemme juuri osoittaneet että SAT on NP-täydellinen perusidea on nyt osoittaa joukolle kiinnostavia ongelmia A NP että SAT p m A, jolloin kyseiset A myös ovat NP-täydellisiä

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:

Lisätiedot

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 Toisinaan voi olla syytä kirjoittaa α- tai β-kirjain yhtäsuuruusmerkin yläpuolelle kertomaan, mitä muunnosta käytetään. Esimerkki 4 1. (λx.x)y β = y 2.

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 8. syyskuuta 2016 Sisällys a https://tim.jyu.fi/view/kurssit/tie/ tiea241/2016/videoiden%20hakemisto Matemaattisen

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Pienen ohjelmointikielen tulkki (ohjelmoitava laskin) (mm. SICP 4-4.1.5 osin) Riku Saikkonen 15. 11. 2012 Sisältö 1 Nelilaskintulkki, globaalit muuttujat

Lisätiedot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 31. maaliskuuta 2011 Sisällys Sisällys Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti

Lisätiedot

Laiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005

Laiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005 Laiska laskenta, korekursio ja äärettömyys TIEA341 Funktio ohjelmointi Syksy 2005 Muistatko graafinsievennyksen? DAG esitys ja graafinsievennys DAG esitys Lausekkeen rakennepuu, jossa yhteiset alilausekkeet

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 4. Joukot, relaatiot ja funktiot Osa 3: Funktiot 4.3 Funktiot Olkoot A ja B joukkoja. Funktio joukosta A joukkoon B on sääntö, joka liittää yksikäsitteisesti määrätyn

Lisätiedot

Mathematica Sekalaista asiaa

Mathematica Sekalaista asiaa Mathematica Sekalaista asiaa Asetusoperaattorit Mathematicassa voi käyttää omia muuttujasymboleja melko rajattomasti ja niiden nimeämisessä voi käyttää miltei mitä tahansa merkkejä. Käytännössä nimeämisessä

Lisätiedot

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet )

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet ) T-79.144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet 9.1 9.5) 30.11. 3.12.2004 1. Osoita lauselogiikan avulla oheisten ehtolausekkeiden ekvivalenssi. (a)!(a

Lisätiedot

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet ) T-79144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet 11-22) 26 29102004 1 Ilmaise seuraavat lauseet predikaattilogiikalla: a) Jokin porteista on viallinen

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Sisällys 3. Pseudokoodi Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet: Valinta if- ja if--rakenteilla. oisto while-, do-while- ja for-rakenteilla. 3.1 3.2 Johdanto

Lisätiedot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

Lisätiedot

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen.

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen. Lause: Tyhjyysongelma ei ole osittain ratkeava; ts. kieli ei ole rekursiivisesti lueteltava. L e = { w { 0, 1 } L(M w ) = } Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia,

Lisätiedot

1 Määrittelyjä ja aputuloksia

1 Määrittelyjä ja aputuloksia 1 Määrittelyjä ja aputuloksia 1.1 Supremum ja infimum Aluksi kerrataan pienimmän ylärajan (supremum) ja suurimman alarajan (infimum) perusominaisuuksia ja esitetään muutamia myöhemmissä todistuksissa tarvittavia

Lisätiedot

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos. TIE303 Formaalit menetelmät, kevät 2005 Logiikan kertausta Antti-Juhani Kaijanaho antkaij@mit.jyu.fi Jyväskylän yliopisto Tietotekniikan laitos TIE303 Formaalit mentetelmät, 2005-01-27 p. 1/17 Luento2Luentomoniste

Lisätiedot

T kevät 2007 Laskennallisen logiikan jatkokurssi Laskuharjoitus 1 Ratkaisut

T kevät 2007 Laskennallisen logiikan jatkokurssi Laskuharjoitus 1 Ratkaisut T-79.5101 kevät 2007 Laskennallisen logiikan jatkokurssi Laskuharjoitus 1 Ratkaisut 1. Jokaiselle toteutuvalle lauselogiikan lauseelle voidaan etsiä malli taulumenetelmällä merkitsemällä lause taulun juureen

Lisätiedot

Nimitys Symboli Merkitys Negaatio ei Konjuktio ja Disjunktio tai Implikaatio jos..., niin... Ekvivalenssi... jos ja vain jos...

Nimitys Symboli Merkitys Negaatio ei Konjuktio ja Disjunktio tai Implikaatio jos..., niin... Ekvivalenssi... jos ja vain jos... 2 Logiikkaa Tässä luvussa tutustutaan joihinkin logiikan käsitteisiin ja merkintöihin. Lisätietoja ja tarkennuksia löytyy esimerkiksi Jouko Väänäsen kirjasta Logiikka I 2.1 Loogiset konnektiivit Väitelauseen

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 19. tammikuuta 2012 Sisällys Sisällys Muistathan A B -konstruktion 0 k 1 i 2 s 3 s 4 a 5 0 k 1 o 2 i 3 r 4

Lisätiedot

Zeon PDF Driver Trial

Zeon PDF Driver Trial Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin

Lisätiedot

11.4. Context-free kielet 1 / 17

11.4. Context-free kielet 1 / 17 11.4. Context-free kielet 1 / 17 Määritelmä Tyypin 2 kielioppi (lauseyhteysvapaa, context free): jos jokainenp :n sääntö on muotoa A w, missäa V \V T jaw V. Context-free kielet ja kieliopit ovat tärkeitä

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015 TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2015 Sisällys t Väitöstilaisuus 4.12.2015 kello 12 vanhassa juhlasalissa S212 saa tulla 2 demoruksia

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

Tenttiin valmentavia harjoituksia

Tenttiin valmentavia harjoituksia Tenttiin valmentavia harjoituksia Alla olevissa harjoituksissa suluissa oleva sivunumero viittaa Juha Partasen kurssimonisteen siihen sivuun, jolta löytyy apua tehtävän ratkaisuun. Funktiot Harjoitus.

Lisätiedot

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö Algoritmit 1 Luento 2 Ke 11.1.2017 Timo Männikkö Luento 2 Algoritmin esitys Algoritmien analysointi Suoritusaika Asymptoottinen kertaluokka Peruskertaluokkia NP-täydelliset ongelmat Algoritmit 1 Kevät

Lisätiedot

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014 Yhtälönratkaisusta Johanna Rämö, Helsingin yliopisto 22. syyskuuta 2014 Yhtälönratkaisu on koulusta tuttua, mutta usein sitä tehdään mekaanisesti sen kummempia ajattelematta. Jotta pystytään ratkaisemaan

Lisätiedot

4. Tehtävässä halutaan todistaa seuraava ongelma ratkeamattomaksi:

4. Tehtävässä halutaan todistaa seuraava ongelma ratkeamattomaksi: T-79.148 Kevät 2004 Tietojenkäsittelyteorian perusteet Harjoitus 12 Demonstraatiotehtävien ratkaisut 4. Tehtävässä halutaan todistaa seuraava ongelma ratkeamattomaksi: Hyväksyykö annettu Turingin kone

Lisätiedot

Vaihtoehtoinen tapa määritellä funktioita f : N R on

Vaihtoehtoinen tapa määritellä funktioita f : N R on Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: 1 (Alkuarvot) Ilmoitetaan funktion arvot

Lisätiedot

Automaatit. Muodolliset kielet

Automaatit. Muodolliset kielet Automaatit Automaatit ovat teoreettisia koneita, jotka käsittelevät muodollisia sanoja. Automaatti lukee muodollisen sanan kirjain kerrallaan, vasemmalta oikealle, ja joko hyväksyy tai hylkää sanan. Täten

Lisätiedot

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: Rekursio Funktio f : N R määritellään yleensä

Lisätiedot

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017

Lisätiedot

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006 Jatkeet TIES341 Funktio ohjelmointi 2 Kevät 2006 Havainto: häntäkutsu (1) Funktiokutsun yleinen toimintaperiaate: (koskee vain täysiä kutsuja, ts. jotka eivät palauta funktiota) kutsuja kirjaa pinoon paluuosoitteen

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset 815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Rajoite-esimerkki, funktionaalista ohjelmointia (mm. SICP 3.3.5, 3.5) Riku Saikkonen 8. 11. 2012 Sisältö 1 SICP 3.3.5 esimerkki: rajoitteiden vyörytysjärjestelmä

Lisätiedot

7. Olemassaolo ja yksikäsitteisyys Galois n kunta GF(q) = F q, jossa on q alkiota, määriteltiin jäännösluokkarenkaaksi

7. Olemassaolo ja yksikäsitteisyys Galois n kunta GF(q) = F q, jossa on q alkiota, määriteltiin jäännösluokkarenkaaksi 7. Olemassaolo ja yksikäsitteisyys Galois n kunta GF(q) = F q, jossa on q alkiota, määriteltiin jäännösluokkarenkaaksi Z p [x]/(m), missä m on polynomirenkaan Z p [x] jaoton polynomi (ks. määritelmä 3.19).

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,

Lisätiedot

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Uusi näkökulma TIEA341 Funktio ohjelmointi 1 Syksy 2005 Aloitetaan alusta... Otetaan uusi näkökulma Haskelliin ohjelmointi laskentana kertausta toisaalta, uusia käsitteitä toisaalta helpottanee sitten

Lisätiedot

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 5. Timo Savola. 28. huhtikuuta 2006 UNIX-käyttöjärjestelmä Luento 5 Timo Savola 28. huhtikuuta 2006 Osa I Shell-ohjelmointi Ehtolause Lausekkeet suoritetaan jos ehtolausekkeen paluuarvo on 0 if ehtolauseke then lauseke

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 1 1 Matemaattisesta päättelystä Matemaattisen analyysin kurssin (kuten minkä tahansa matematiikan kurssin) seuraamista helpottaa huomattavasti, jos opiskelija ymmärtää

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

Lisätiedot

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9 Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9 Tuntitehtävät 9-10 lasketaan alkuviikon harjoituksissa ja tuntitehtävät 13-14 loppuviikon harjoituksissa. Kotitehtävät 11-12 tarkastetaan loppuviikon

Lisätiedot

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Hyvä ohjelmointitapa. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VII Logiikkaohjelmointi Sisältö 1. Johdanto 2. Predikaattilogiikan käsitteistöä 3. Prolog 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 2

Lisätiedot

Johdatus Ohjelmointiin

Johdatus Ohjelmointiin Johdatus Ohjelmointiin Syksy 2006 Viikko 2 13.9. - 14.9. Tällä viikolla käsiteltävät asiat Peruskäsitteitä Kiintoarvot Tiedon tulostus Yksinkertaiset laskutoimitukset Muuttujat Tiedon syöttäminen Hyvin

Lisätiedot

Mitään muita operaatioita symbolille ei ole määritelty! < a kaikilla kokonaisluvuilla a, + a = kaikilla kokonaisluvuilla a.

Mitään muita operaatioita symbolille ei ole määritelty! < a kaikilla kokonaisluvuilla a, + a = kaikilla kokonaisluvuilla a. Polynomit Tarkastelemme polynomirenkaiden teoriaa ja polynomiyhtälöiden ratkaisemista. Algebrassa on tapana pitää erillään polynomin ja polynomifunktion käsitteet. Polynomit Tarkastelemme polynomirenkaiden

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 9 1 Implisiittinen derivointi Tarkastellaan nyt yhtälöä F(x, y) = c, jossa x ja y ovat muuttujia ja c on vakio Esimerkki tällaisesta yhtälöstä on x 2 y 5 + 5xy = 14

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, todistamisesta (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 7. 11. 2011 Sisältö 1 Muuttujan arvon muuttaminen: set! 2 SICP-oliot

Lisätiedot

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa

Lisätiedot

1 Raja-arvo. 1.1 Raja-arvon määritelmä. Raja-arvo 1

1 Raja-arvo. 1.1 Raja-arvon määritelmä. Raja-arvo 1 Raja-arvo Raja-arvo Raja-arvo kuvaa funktion f arvon f() kättätmistä, kun vaihtelee. Joillakin funktioilla f() muuttuu vain vähän, kun muuttuu vähän. Toisilla funktioilla taas f() hppää tai vaihtelee arvaamattomasti,

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 31. maaliskuuta 2011 Sisällys Sisällys Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti

Lisätiedot

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista Matematiikan johdantokurssi, syksy 06 Harjoitus, ratkaisuista. Valitse seuraaville säännöille mahdollisimman laajat lähtöjoukot ja sopivat maalijoukot niin, että syntyy kahden muuttujan funktiot (ks. monisteen

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

S BAB ABA A aas bba B bbs c

S BAB ABA A aas bba B bbs c T-79.148 Kevät 2003 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut 4. Tehtävä: Laadi algoritmi, joka testaa onko annetun yhteydettömän kieliopin G = V, Σ, P, S) tuottama

Lisätiedot

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä. TIETOKONEOHJELMIEN RAKENNE Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä. Teollisuusautomaation ohjelmiin on lainattu runsaasti perinteisen

Lisätiedot

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat

Lisätiedot

5/20: Algoritmirakenteita III

5/20: Algoritmirakenteita III Ohjelmointi 1 / syksy 2007 5/20: Algoritmirakenteita III Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/17 Tämän

Lisätiedot

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

Hahmon etsiminen syotteesta (johdatteleva esimerkki) Hahmon etsiminen syotteesta (johdatteleva esimerkki) Unix-komennolla grep hahmo [ tiedosto ] voidaan etsia hahmon esiintymia tiedostosta (tai syotevirrasta): $ grep Kisaveikot SM-tulokset.txt $ ps aux

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet

Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 24. toukokuuta 2013 Sisällys Formaalit kielet On tapana sanoa, että merkkijonojen joukko on (formaali) kieli. Hieman

Lisätiedot

MS-A0402 Diskreetin matematiikan perusteet

MS-A0402 Diskreetin matematiikan perusteet MS-A0402 Diskreetin matematiikan perusteet Osa 1: Joukko-oppi ja logiikka Riikka Kangaslampi 2017 Matematiikan ja systeemianalyysin laitos Aalto-yliopisto Kiitokset Nämä luentokalvot perustuvat Gustaf

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 7: Funktionaalista ohjelmointia (mm. SICP 3.5) Riku Saikkonen 13. 11. 2012 Sisältö 1 Laiskaa laskentaa: delay ja force 2 Funktionaalinen I/O 3 Funktionaalista

Lisätiedot

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 3 (9 sivua) OT

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 3 (9 sivua) OT Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 3 (9 sivua) 31.1.-4.2.2011 OT 1. Määritellään kokonaisluvuille laskutoimitus n m = n + m + 5. Osoita, että (Z, ) on ryhmä.

Lisätiedot

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n)) Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia

Lisätiedot