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

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

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

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

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

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

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

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

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

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, 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

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

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

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

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

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

815338A Ohjelmointikielten periaatteet 2014-2015

815338A Ohjelmointikielten periaatteet 2014-2015 815338A Ohjelmointikielten periaatteet 2014-2015 X Skriptiohjelmointi Sisältö 1. Johdanto 2. Skriptikielten yleispiirteitä 3. Python 815338A Ohjelmointikielten periaatteet, Skriptiohjelmointi 2 X.1 Johdanto

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

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

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

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

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

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

8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että

8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että 85 Takarekursiosta Sanoimme luvun 83 foldl -esimerkissämme että foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs olisi pelkkä silmukka Tämä johtuu siitä, että

Lisätiedot

LAUSELOGIIKKA (1) Sanalliset ilmaisut ovat usein epätarkkoja. On ilmaisuja, joista voidaan sanoa, että ne ovat tosia tai epätosia, mutta eivät molempia. Ilmaisuja, joihin voidaan liittää totuusarvoja (tosi,

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

Ohjelmoinnin peruskurssi Y1

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

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 7.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 7.2.2011 1 / 39 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

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

Kokeellista matematiikkaa SAGE:lla

Kokeellista matematiikkaa SAGE:lla Kokeellista matematiikkaa SAGE:lla Tutkin GeoGebralla 1 luonnollisen luvun jakamista tekijöihin 2. GeoGebran funktio Alkutekijät jakaa luvun tekijöihin ja tuottaa alkutekijät listana. GeoGebrassa lista

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

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

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

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan

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

Funktionaalinen ohjelmointi

Funktionaalinen ohjelmointi Funktionaalinen ohjelmointi Aiemmin on käsitelty nykyohjelmoinnin suosituimpia ohjelmointiparadigmoja: imperatiivista ohjelmointia ja olio-ohjelmointia. Tässä osassa perehdytään funktionaaliseen ohjelmointiin

Lisätiedot

Tietotyypit ja operaattorit

Tietotyypit ja operaattorit Tietotyypit ja operaattorit Luennossa tarkastellaan yksinkertaisten tietotyyppien int, double ja char muunnoksia tyypistä toiseen sekä esitellään uusia operaatioita. Numeeriset tietotyypit ja muunnos Merkkitieto

Lisätiedot

TIE448 Kääntäjätekniikka, syksy 2009. Antti-Juhani Kaijanaho. 7. joulukuuta 2009

TIE448 Kääntäjätekniikka, syksy 2009. Antti-Juhani Kaijanaho. 7. joulukuuta 2009 TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 7. joulukuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio Arvostelukappale

Lisätiedot

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin?

Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin? Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin? 2013-2014 Lasse Lensu 2 Algoritmit ovat deterministisiä toimintaohjeita

Lisätiedot

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

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

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015 TIEA241 Automaatit ja, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. joulukuuta 2015 Sisällys Formaalisti Määritelmä Nelikko G = (V, Σ, P, S) on kontekstiton kielioppi (engl. context-free

Lisätiedot

Toinen muotoilu. {A 1,A 2,...,A n,b } 0, Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin kun 1 / 13

Toinen muotoilu. {A 1,A 2,...,A n,b } 0, Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin kun 1 / 13 2 3 Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin kun {A 1,A 2,...,A n,b } 0, jatkoa jatkoa 1 / 13 2 3 Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin

Lisätiedot

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu

Lisätiedot

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b Pythonin Kertaus Cse-a1130 Tietotekniikka Sovelluksissa Versio 0.01b Listat 1/2 esimerkkejä listan peruskäytöstä. > lista=['kala','kukko','kissa','koira'] ['kala','kukko','kissa','koira'] >lista.append('kana')

Lisätiedot

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5. 1. Toteuta Pythonilla seuraava ohjelma:

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5. 1. Toteuta Pythonilla seuraava ohjelma: Kerta 2 Kerta 3 Kerta 4 Kerta 5 Kerta 2 1. Toteuta Pythonilla seuraava ohjelma: 2. Tulosta Pythonilla seuraavat luvut allekkain a. 0 10 (eli, näyttää tältä: 0 1 2 3 4 5 6 7 8 9 10 b. 0 100 c. 50 100 3.

Lisätiedot

Diskreetit rakenteet. 3. Logiikka. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1

Diskreetit rakenteet. 3. Logiikka. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1 811120P 3. 5 op Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1 ja laskenta tarkastelemme terveeseen järkeen perustuvaa päättelyä formaalina järjestelmänä logiikkaa sovelletaan

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

k=1 b kx k K-kertoimisia polynomeja, P (X)+Q(X) = (a k + b k )X k n+m a i b j X k. i+j=k k=0

k=1 b kx k K-kertoimisia polynomeja, P (X)+Q(X) = (a k + b k )X k n+m a i b j X k. i+j=k k=0 1. Polynomit Tässä luvussa tarkastelemme polynomien muodostamia renkaita polynomien ollisuutta käsitteleviä perustuloksia. Teemme luvun alkuun kaksi sopimusta: Tässä luvussa X on muodollinen symboli, jota

Lisätiedot

1 Kannat ja kannanvaihto

1 Kannat ja kannanvaihto 1 Kannat ja kannanvaihto 1.1 Koordinaattivektori Oletetaan, että V on K-vektoriavaruus, jolla on kanta S = (v 1, v 2,..., v n ). Avaruuden V vektori v voidaan kirjoittaa kannan vektorien lineaarikombinaationa:

Lisätiedot

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100 Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).

Lisätiedot

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: Tietorakenteet, laskuharjoitus 10, ratkaisuja 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: SamaLuku(T ) 2 for i = 1 to T.length 1 3 if T [i] == T [i + 1] 4 return True 5 return

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

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

Lisätiedot

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Viimeksi muokattu 5. toukokuuta 2012 Maastotietokannan torrent-jakeluun sisältyy yli 5000 zip-arkistoa,

Lisätiedot

Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset

Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset 2000-08-03T10:30/12:00 Huomaa, että joihinkin kysymyksiin on useampia oikeita vastauksia, joten nämä ovat todellakin vain mallivastaukset. 1 Logiikkaa

Lisätiedot

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

Lisätiedot

MAT-13510 Laaja Matematiikka 1U. Hyviä tenttikysymyksiä T3 Matemaattinen induktio

MAT-13510 Laaja Matematiikka 1U. Hyviä tenttikysymyksiä T3 Matemaattinen induktio MAT-13510 Laaja Matematiikka 1U. Hyviä tenttikysymyksiä T3 Matemaattinen induktio Olkoon a 1 = a 2 = 5 ja a n+1 = a n + 6a n 1 kun n 2. Todista induktiolla, että a n = 3 n ( 2) n, kun n on positiivinen

Lisätiedot

14/20: Keittokirja I

14/20: Keittokirja I Ohjelmointi 1 / syksy 2007 14/20: Keittokirja I Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/13 Tämän luennon

Lisätiedot

kaikki kielet tunnistettavat A TM HALT TM { a n } { a n b n } { a n b n c n } TOTAL TM EQ TM

kaikki kielet tunnistettavat A TM HALT TM { a n } { a n b n } { a n b n c n } TOTAL TM EQ TM Kurssi tähän asti: säännölliset yhteydettömät ratkeavat { a n } { a n b n } { a n b n c n } tunnistettavat A TM HALT TM kaikki kielet A TM HALT TM TOTAL TM TOTAL TM EQ TM EQ TM 277 5. Laskennan vaativuus

Lisätiedot

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä olevilla komponenteilla? Voisiko jollakin ohjelmointikielellä

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa

Lisätiedot

Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet:

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

Lisätiedot

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin Ohjausjärjestelmien jatkokurssi Visual Basic vinkkejä ohjelmointiin http://www.techsoft.fi/oskillaattoripiirit.htm http://www.mol.fi/paikat/job.do?lang=fi&jobid=7852109&index=240&anchor=7852109 Yksiköt

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto 811312A Tietorakenteet ja algoritmit 2015-2016 I Johdanto Sisältö 1. Algoritmeista ja tietorakenteista 2. Algoritmien analyysistä 811312A TRA, Johdanto 2 I.1. Algoritmeista ja tietorakenteista I.1.1. Algoritmien

Lisätiedot

2 Konekieli, aliohjelmat, keskeytykset

2 Konekieli, aliohjelmat, keskeytykset ITK145 Käyttöjärjestelmät, kesä 2005 Tenttitärppejä Tässä on lueteltu suurin piirtein kaikki vuosina 2003-2005 kurssin tenteissä kysytyt kysymykset, ja mukana on myös muutama uusi. Jokaisessa kysymyksessä

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet

Lisätiedot

JFO: Johdatus funktionaaliseen ohjelmointiin

JFO: Johdatus funktionaaliseen ohjelmointiin JFO: Johdatus funktionaaliseen ohjelmointiin Matti Nykänen Tietojenkäsittelytieteen laitos, Itä-Suomen yliopisto matti.nykanen@uef.fi Lukuvuosi 2010-11, IV periodi Sisältö 1 Johdanto 1 1.1 Historiaa.....................................

Lisätiedot

14.1 Rekursio tyypitetyssä lambda-kielessä

14.1 Rekursio tyypitetyssä lambda-kielessä Luku 14 Rekursiiviset tyypit Edellisessä luvussa esitetyt tietue- ja varianttityypit eivät yksinään riitä kovin mielenkiintoisten tietorakenteiden toteuttamiseen. Useimmissa ohjelmissa tarvitaan erilaisia

Lisätiedot

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

Lisätiedot

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010 kielenä 9. joulukuuta 2010 Historia kielenä Historia Sovelluksia kehitettiin vuonna 1972 Kehittäjinä ranskalaiset Pääkehittäjä Alain Colmerauer Philippe Roussel programmation en logique Robert Kowalski

Lisätiedot

Muita vaativuusluokkia

Muita vaativuusluokkia Muita vaativuusluokkia Käydään lyhyesti läpi tärkeimpiä vaativuusluokkiin liittyviä tuloksia. Monet tunnetuista tuloksista ovat vaikeita todistaa, ja monet kysymykset ovat vielä auki. Lause (Ladner 1975):

Lisätiedot

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen

Lisätiedot

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä Sisällys 11. Javan toistorakenteet Laskuri- ja lippumuuttujat.. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja

Lisätiedot

L models. Vaatimusmäärittely. Ryhmä Rajoitteiset

L models. Vaatimusmäärittely. Ryhmä Rajoitteiset Teknillinen Korkeakoulu T-76.5 Tietojenkäsittelyopin ohjelmatyö Lineaaristen rajoitteiden tyydyttämistehtävän ratkaisija L models Vaatimusmäärittely Ryhmä Rajoitteiset Versio Päivämäärä Tekijä Muutokset

Lisätiedot

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

Kielioppia: toisin kuin Javassa

Kielioppia: toisin kuin Javassa Object Pascal Pascal kielen oliolaajennus (Inprise/Borland:n oma) luokat Voit uudelleenkäyttää luomiasi objekteja esim. komponentteja Periytyminen Kielioppia: toisin kuin Javassa Ei eroa isojen ja pienien

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 3: SICP kohdat 2.22.3, 33.1 ja 3.33.3.2 Riku Saikkonen 8. 11. 2010 Sisältö 1 Lisää listoista 2 Symbolit ja sulkulausekkeet 3 Derivoijaesimerkki 4 Muuttujan

Lisätiedot

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne. Proseduurit Proseduuri voi olla 1) Funktio, joka palauttaa jonkin arvon: real function sinc(x) real x sinc = sin(x)/x... y = sinc(1.5) 2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

Karteesinen tulo. Olkoot A = {1, 2, 3, 5} ja B = {a, b, c}. Näiden karteesista tuloa A B voidaan havainnollistaa kuvalla 1 / 21

Karteesinen tulo. Olkoot A = {1, 2, 3, 5} ja B = {a, b, c}. Näiden karteesista tuloa A B voidaan havainnollistaa kuvalla 1 / 21 säilyy Olkoot A = {1, 2, 3, 5} ja B = {a, b, c}. Näiden karteesista tuloa A B voidaan havainnollistaa kuvalla c b a 1 2 3 5 1 / 21 säilyy Esimerkkirelaatio R = {(1, b), (3, a), (5, a), (5, c)} c b a 1

Lisätiedot

plot(f(x), x=-5..5, y=-10..10)

plot(f(x), x=-5..5, y=-10..10) [] Jokaisen suoritettavan rivin loppuun ; [] Desimaalierotin Maplessa on piste. [] Kommentteja koodin sekaan voi laittaa # -merkin avulla. Esim. #kommentti tähän [] Edelliseen tulokseen voi viitata merkillä

Lisätiedot

LUMA Suomi kehittämisohjelma 8.10.2015 14:53 Joustava yhtälönratkaisu Matemaattinen Ohjelmointi ja Yhtälönratkaisu

LUMA Suomi kehittämisohjelma 8.10.2015 14:53 Joustava yhtälönratkaisu Matemaattinen Ohjelmointi ja Yhtälönratkaisu (MOJYR) Sisällysluettelo (MOJYR)... 1 1. Taustaa... 1 2. MOJYR-ohjelma... 2 2.1 Ohjelman asentaminen... 2 2.2 Käyttöliittymä... 2 3. Puumalli... 3 4. MOJYR-ohjelman ominaisuudet... 5 4.1 Yhtälön muodostaminen...

Lisätiedot

fix e e (fix e). fix = λf.(λx.f (x x)) (λx.f (x x)) (9)

fix e e (fix e). fix = λf.(λx.f (x x)) (λx.f (x x)) (9) Käytännön funktionaaliset ohjelmointikielet esittävät rekursion tällä tavalla. Teorian näkökulmasta olisi kuitenkin eleganttia, jos oikean puolen Termissä ei tarvittaisi vasemman puolen Muuttujannimeä,

Lisätiedot

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA Tavallisimmin lukuja käsittelevien datasanojen tyypiksi kannattaa asettaa kokonaisluku 16 bitin INT, jonka vaihtelualueeksi tulee

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

1 Logiikkaa. 1.1 Logiikan symbolit

1 Logiikkaa. 1.1 Logiikan symbolit 1 Logiikkaa Tieteessä ja jokapäiväisessä elämässä joudutaan tekemään päätelmiä. Logiikassa tutkimuskohteena on juuri päättelyt. Sen sijaan päätelmien sisältöön ei niinkäään kiinnitetä huomiota. Päätelmät

Lisätiedot

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, että se pystyy suorittamaan kaikki mahdolliset algoritmit?

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita Käyttäjän kanssa keskusteleva ohjelma 1 Kirjoittaminen konsolinäkymään //Java ohjelma, joka tulostaa konsoli-ikkunaan public class HeiMaailma { public void aja() { // kirjoitus ja

Lisätiedot