humisevat symbolit,
ja korvissani;
aine kuin aine, vailla
mieltä tai merkitystä.
582305 Symbolinen ohjelmointi (3ov)
Kurssikuvaus
Kurssilla tutustutaan ohjelmointimenetelmiin joilla voi käsitellä symboleina ja niiden yhdistelminä esitettyä dataa. Tällaisia ongelmia kohtaa esimerkiksi tekoälyssä. Kurssi on samalla johdatus funktionaaliseen ohjelmointikieleen Scheme (eräs LISP-murre) ja logiikkaohjelmointikieleen Prolog.Osallistujilta edellytetään perustiedot ohjelmoinnista ja tietorakenteista, esimerkiksi kurssin "Tietorakenteet" (58131-8) laajuudessa.
Kurssi korvaa poistuneen kurssin "Tekoälykielet" (581241-3) joten niitä molempia ei voi sisällyttää samaan tutkintoon.
Suoritustavat
- LUENNOT SYYSLUKUKAUDELLA 2002:
- Yonleht. Matti Nykänen
- Tiistaisin ja torstaisin kello 12-14 seuraavasti:
- 12.09.-10.10. salissa A217.
- 15.10. salissa A216.
- 29.10.-14.11. salissa A216.
- HARJOITUKSET SYYSLUKUKAUDELLA 2002:
- Luennoija: torstaisin 26.09.-21.11. kello 14-16 salissa A216.
- Tuntiop. Lauri Alanko: torstaisin 26.09.-21.11. kello 08-10 salissa C454.
- Harjoitukset ovat vapaaehtoisia, mutta niistä saa lisäpisteitä kurssin päättävässä välikokeessa ja ensimmäisessä sen jälkeisessä loppukokeessa (muttei enää seuraavissa).
- Harjoitusten vapaaehtoisuuden vuoksi kurssin jonotuslistalle kannattaa ilmoittautua, vaikka ryhmät ovatkin jo täysiä; osallistujamäärää ei siis ole rajoitettu.
Arvostelu
Kurssikokeessa ja ensimmäisessä erilliskokeessa on jaossa 60 pistettä. Tehdyistä laskuharjoituksista saa korkeintaan 12 lisäpistettä seuraavsti:teit | saat |
---|---|
3 | 1 |
6 | 2 |
10 | 3 |
14 | 4 |
18 | 5 |
22 | 6 |
26 | 7 |
30 | 8 |
34 | 9 |
38 | 10 |
42 | 11 |
46 | 12 |
Luentokurssin aikataulu
pvm | klo | sali | aihe |
---|---|---|---|
12.09. | 12-14 | A217 | Luento. |
17.09. | 12-14 | A217 | Luento. |
19.09. | 12-14 | A217 | Luento. Luentokalvot 1-50 ovat nyt saatavilla PostScript (PS) ja Portable Document Format (PDF) -muodoissa. Myös ensimmäisten laskuharjoitusten tehtävät ovat nyt saatavilla PS ja PDF -muodoissa. (GhostView on ilmainen PS- ja PDF-tiedostojen katselu- ja tulostusohjelma.) |
24.09. | 12-14 | A217 | Luento.
Lambda-termien normalisoijan
Tiedosto antaa käyttöösi funktion
Tämä termi on
|
26.09. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A217 | Luento. Luentokalvot 51-84 ovat nyt saatavilla PS- ja PDF-muodoissa. Myös toisten laskuharjoitusten tehtävät ovat nyt saatavilla PS- ja PDF-muodoissa. |
|
14-16 | A216 | Harjoitusryhmä. |
|
01.10. | 12-14 | A217 | Luento. |
03.10. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A217 |
Luento.
Luentokalvot 85-108 ovat nyt saatavilla
PS-
ja
PDF-muodoissa.
Myös kolmansien laskuharjoitusten tehtävät ovat nyt saatavilla
PS-
ja
PDF-muodoissa.
HUOM!
Tehtävän 3.2 tulosesimerkissä on lyöntivirhe:
arvon pitäisi olla
|
|
14-16 | A216 | Harjoitusryhmä. |
|
08.10. | 12-14 | A217 | Luento. |
10.10. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A217 | Luento. Luentokalvot 109-128 ovat nyt saatavilla PS- ja PDF-muodoissa. Myös neljänsien laskuharjoitusten tehtävät ovat nyt saatavilla PS- ja PDF-muodoissa. |
|
14-16 | A216 | Harjoitusryhmä. Näissä harjoituksissa ilmeni DrScheme-toteutuksesta seuraava piirre: Welcome to DrScheme, version 202. Language: Standard (R5RS). > '(1 . 2 . 3) (2 1 3) > Lauri Alanko kertoi jälkeenpäin, että kyseessä on tämän toteutuksen ikioma laajennus, josta on kerrottu PLT MzScheme: Language Manual -käsikirjan luvussa 14.3. (It wasn't a bug, it was a feature.) |
|
15.10. | 12-14 | A216 |
Luento.
Luentokalvot 129-148 ovat nyt saatavilla
PS-
ja
PDF-muodoissa.
Myös viidensien laskuharjoitusten tehtävät ovat nyt saatavilla
PS-
ja
PDF-muodoissa.
Osassa näistä tehtävistä tarvitset luennolla olleen
samastusalgoritmin Scheme-lähdekoodia, jonka saat seuraavista kolmesta
tiedostosta:
|
17.10. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A216 | Harjoitusryhmä. |
|
29.10. | 12-14 | A216 | Luento. |
31.10. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A216 |
Luento.
Luentokalvot 149-173 ovat nyt saatavilla PS-
ja PDF-muodoissa.
Myös kuudensien laskuharjoitusten tehtävät ovat nyt saatavilla
PS-
ja
PDF-muodoissa.
Joissakin tehtävissä tarvitset luennoilla ollutta kuningatar
Victorian jälkeläisten sukupuuta Prolog-kielellä, joka saat
täältä.
Lisäksi voit noutaa Scheme-kielisen sääntötulkin loput
kaksi lähdekooditiedostoa
|
|
14-16 | A216 | Harjoitusryhmä. |
|
05.11. | 12-14 | A216 | Luento.
Voit noutaa täältä
luennoilla läpikäydyt Prolog-esimerkit
lisäyksestä
2-3-hakupuuhun
ja
totuusarvojen etsijästä.
|
07.11. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A216 | Luento. Luentokalvot 174-201 ovat nyt saatavilla PS- ja PDF-muodoissa. Myös seitsemänsien laskuharjoitusten tehtävät ovat nyt saatavilla PS- ja PDF-muodoissa. |
|
14-16 | A216 | Harjoitusryhmä. |
|
12.11. | 12-14 | A216 | Luento. |
14.11. | 08-10 | C454 | Harjoitusryhmä. |
12-14 | A216 | Luento. Viimeiset luentokalvot 202-235 ovat nyt saatavilla PS- ja PDF-muodoissa. Myös kahdeksansien eli viimeisten laskuharjoitusten tehtävät ovat nyt saatavilla PS- ja PDF-muodoissa. |
|
14-16 | A216 | Harjoitusryhmä. |
|
21.11. | 08-10 | C454 | Harjoitusryhmä. |
13-15 | A216 | Harjoitusryhmä. HUOM! Tämä ryhmä kokoontuukin siis tuntia aiemmin kuin normaalisti. Jos pääset paikalle vasta klo 14, niin saat silti tekemistäsi tehtävistä lisäpisteet. |
|
29.11. | 16-20 | Auditorio |
Kurssikoe. Koealue käsittää luennoilla ja laskuharjoituksissa esillä olleet asiat. Huomaa ennakkotietoja myöhäisempi kellonaika! Kaikki luentokalvot 1-235 ovat nyt saatavilla pienennettynä PS- ja normaalikokoisena PDF-muodossa. Tulokset ovat nähtävillä cum laude -kurssikokeiden ilmoitustaululla salissa A412. Arvosteluun voi tutustua 20.12.2002 klo 10-11 salissa C475. Lauri Alanko korjasi tehtävät 2 ja 4. Niiden malliratkaisut ovat verkossa. Luennoija korjasi tehtävät 1 ja 3. Niiden malliratkaisut ovat alla: ; Lista 1 on listan 2 alilista jos lista 2 sisaltaa listan 1 ; alkiot samassa jarjestyksessa muttei valttamatta perakkain. ; Palautetaan #f jos argumentti ei ole aito lista. (define (subseq? list-1 list-2) (or (and (null? list-1) (list? list-2)) (and (pair? list-1) (pair? list-2) (subseq? (if (equal? (car list-1) (car list-2)) (cdr list-1) list-1) (cdr list-2))))) (define (subseqs list-2) (cond ((null? list-2) '(())) ((pair? list-2) (let ((tail-subs (subseqs (cdr list-2)))) (let filter ((head-subs (map (lambda (tail-sub) (cons (car list-2) tail-sub)) tail-subs)) (uniques tail-subs)) (if (null? head-subs) uniques (filter (cdr head-subs) (if (member (car head-subs) tail-subs) uniques (cons (car head-subs) uniques))))))) (else ()))) ; Notaation yksinkertaistamiseksi laiskojen listojen perusperaatiot: (define stream-null '()) (define-syntax stream-cons (syntax-rules () ((_ a s) (cons a (delay s))))) (define stream-car car) (define (stream-cdr s) (force (cdr s))) (define (stream-null? s) (eq? s stream-null)) ; Muita operaatioita laiskoille listoille: (define (stream-map f s) (let mapper ((t s)) (stream-cons (f (stream-car t)) (mapper (stream-cdr t))))) (define (stream-merge ord stream-1 stream-2) (let merger ((s1 stream-1) (s2 stream-2)) (if (ord (stream-car s1) (stream-car s2)) (stream-cons (stream-car s1) (merger (stream-cdr s1) s2)) (stream-cons (stream-car s2) (merger s1 (stream-cdr s2)))))) (define (stream-dropwhile p s) (let drop ((t s)) (if (p (stream-car t)) (drop (stream-cdr t)) t))) ; Luonnollinen luku n on Ramanujan joss on luonnolliset luvut ; p<q<=r<s siten, etta p^3+s^3=n=q^3+r^3. ; Tuotetaan ne laiskana listana. ; Idea: ; 1. Lista "cubes" on luonnollisten lukujen u kuutiot u^3 jarjestyksessa. ; 2. Lista "cube-sums" on kuutiosummat v^3+w^3 jarjestyksessa missa v<=w. ; Se saadaan yhdistamalla listaa "cubes" itseensa sopivasti. ; 3. Luku n on Ramanujan joss se toistuu listassa "cube-sums". (define (ramanujan) (let clean ((dirty (let cube-sums ((cubes (stream-map (lambda (x) (* x x x)) (letrec ((from (lambda (m) (stream-cons m (from (+ m 1)))))) (from 0))))) (let ((cubes-car (stream-map (let ((add (stream-car cubes))) (lambda (x) (+ add x))) cubes))) (stream-cons (stream-car cubes-car) (stream-merge < (stream-cdr cubes-car) (cube-sums (stream-cdr cubes)))))))) (if (= (stream-car dirty) (stream-car (stream-cdr dirty))) (stream-cons (stream-car dirty) (clean (stream-dropwhile (lambda (x) (= x (stream-car dirty))) dirty))) (clean (stream-cdr dirty))))) |
28.01. | 16-20 | Auditorio | Ensimmäinen erilliskoe. Koealue sama kuin kurssikokeessa. Tässä kokeessa huomioidaan kurssin aikana kerätyt lisäpisteet tehdyistä laskuharjoituksista. |
21.03. | 14-18 | Auditorio | Toinen erilliskoe. Koealue sama kuin kurssikokeessa. Tästä kokeesta alkaen lisäpisteet jäävät huomiotta. |
Kurssimateriaali
-
Matti Nykäsen
luentokalvot
kevätlukukaudelta 2001 ovat myös tämän luentokerran pohjana,
mutta niitä tullaan muokkaamaan ja täydentämään kurssin edetessä.
Jokaisen viikon lopulla (torstaina iltapäivällä tai perjantaina aamupäivällä) ylläolevaan aikatauluun laitetaan seuraavat dokumentit:
- Tehtävät seuraavan viikon laskuharjoituksiin.
- Päättyvän viikon uudistuneet luentokalvot, joiden perusteella nämä tehtävät voi ratkaista.
- Matti Nykäsen ja Lauri Alangon tekemiä laskuharjoitusten ratkaisuja.
-
Abelson,H., Sussman,G.J.:
Structure
and Interpretation of Computer Programs, Second Edition. MIT Press,
1996. ISBN 0-262-51087-1.
Saatavana sähköisesti paitsi kustantajalta myös Ars Digitasta.
Kurssilla käsiteltiin tästä kirjasta luvut 1-2.2.3, 2.3-2.3.2, 3-3.3.1, 3.5 ja 4.2. Suosittelen tätä erinomaista kirja vaikket osallistuisikaan kurssilleni!
Laitoskirjastossa on kirjan ensimmäistä painosta; sitäkin voinee käyttää.
-
Dybvig,R.K.:
The Scheme Programming
Language, Second Edition. Prentice Hall, 1996. ISBN 0-13-454646-6.
Tämä oheislukemisto kuvaa Scheme-kielen yksityiskohtaisemmin. Siitä käsiteltiin luvut 3.3-3.4, 5.6, 5.9 ja 7.3; samat asiat löytää myös seuraavasta raportista.
- Kelsey,R., Clinger,W., Rees,J. (toim.): Revised5 Report on the Algorithmic Language Scheme. Higher-Order and Symbolic Computation 11(1), 1998 tai ACM SIGPLAN Notices 33(9), 1998.
-
Bratko,I.:
Prolog
Programming for Artificial Intelligence, Third Edition. Addison-Wesley,
2001. ISBN 0-201-40375-7.
Tämä oheislukemisto on käytännönläheinen Prolog-kirja. Vaikkei se olekaan kurssin Prolog-osuuden varsinainen kurssikirja - sellaista ei näet ole - sen luvut 1-7 kattavat kurssin asiat.
Laitoskirjastossa on varhaisempi painos jota voinee myös käyttää.
- Sterling,L., Shapiro,E.: The Art of Prolog. MIT Press, 1986. ISBN 0-262-69105-1.
- Lloyd,J.W.: Foundations of Logic Programming, Second Extended Edition. Springer-Verlag, 1987. ISBN 3-540-18199-7.
- Kurssilla on myös uutisryhmä "hy.opiskelu.tktl.symbo".
Tämä on viimeisin raportti Scheme-standardin kehtyksestä. Siitä käsiteltiin luvut 6.4-6.5 ja 6.6.4; samat asiat löytää myös edellisestä kirjasta.
Clocksin,W.F., Mellish,C.S.: Programming in Prolog, Third Revised and Extended Edition. Springer-Verlag, 1987. ISBN 3-540-17539-3.
Laitoskirjastostamme löytyviä vaihtoehtoja Bratkon kirjalle: edellisestä luvut 1-9 ja 11, jälkimmäisestä taas luvut 1-4, 6-6.8 ja 6.11-6.12.
Logiikkaohjelmoinnin teoriaa, jonka alkeisiin saatetaan tutustua jos aikaa jää. Laitoskirjastossamme.
Toteutuksia
Scheme-kielen WWW-kotipaikalta valitsin kurssille toteutuksen DrScheme. Sen Linux-versio löytyy laitoksellamme alihakemistosta "/opt/plt" ja tulkki käynnistyy komennolla "drscheme".
Prolog-kielestä valitsin kurssille toteutuksen SWI-Prolog. Sen Linux-versio löytyy laitoksellamme alihakemistosta "/opt/pl" ja tulkki käynnistyy komennolla "pl".
Kummastakin löytyvät myös Windows-versiot, mutta ne saatte asentaa kotiinne itse...