Ensinnäkin: kolmaskin kotitehtävä on henkilökohtainen, vaikka kurssilaisilla voi olla samoja tehtävänantoja. Eli: kaverin vastausta ei tule kopioida. Tarvittaessa voimme helposti verrata vastauksina palautettujen tiedostojen sisältöjä ja palautusaikoja. Samasta syystä en pidä suotavana, että ratkaisuja esitetään sellaisella foorumilla (kuten tämä uutisryhmä), johon kurssilaisilla on vapaa pääsy. Ja kopioinnistahan on seurauksena osasuorituksen tai koko kurssin suorituksen hylkääminen, teon vakavuudesta riippuen. Tämä muistutuksena opiskelun pelisäännöistä. Ongelmatapauksissa (joissa on siis tarve saada tarkempia ohjeita omaan ratkaisuehdotukseen liittyen) suosittelen vastaanotolla käyntiä tai sähköpostin käyttöä. Järjestän ylimääräisen vastaanoton huomenna torstaina klo 15:15-16:00 (huoneeni TB335) tätä tarkoitusta varten. Yleisesti ottaen minulla on ollut periaatteena "yrittänyttä ei laiteta" näiden kotitehtävien suhteen. Eli ei tämän kurssin suorittaminen yhteen kotitehtävään kaadu, jos on edes yrittänyt. Suorituksia voi vielä paikata jatkossa, tästä ohjeet myöhemmin. Ville Kaksonen kaipasi yleisohjeita, kuinka päästä liikkeelle. Tehtävänannossa sinulle on annettu määriteltäväksi jokin predikaatti P(x_1,...,x_n) (tai useampia) joidenkin muiden avulla. Tuo n antaa siis predikaatin argumenttien lukumäärän joka voi vaihdella. Kuten jo luennolla selitinkin, usein määritelmät voidaan kirjoittaa muotoon (all x1 ... xn y z v (Ehto_1(x_1,...,x_n,y,z,v) & ... & Ehto_m(x_1,...,x_n,y,z,v) -> P(x_1,...,x_n))). missä Ehto_1, ... , Ehto_n ovat muiden predikaattien instansseja, ja kertovat, milloin voimme päätellä P(x_1,...,x_n):n (muuttujien tarve vaihtelee tietenkin tilanteen mukaan). Tarvittaessa tätä muotoa olevia lauseita voi olla useampiakin, mikäli P:hen liittyviä johtopäätöksiä voidaan tehdä useammillakin ehtojen yhdistelmillä. Otetaanpa lopuksi käsittelyyn hupoteettinen tehtävänanto. Meidän tulisi määritellä predikaatti tartuntavaarassa(x) (eli "henkilö x on tartuntavaarassa") predikaattien sairas(x) (eli "henkilö x on sairas) ja tapaa(x,y) (eli "henkilö x tapaa henkilön y"). Eli nytpä pitäisi miettiä millä ehdoilla jonkin henkilö on tartuntavaarassa. Mieleen tulee perustapaus, että henkilö tapaa jonkin sairaan. Siis yllä hahmoteltuun tyyliin. (all x y (sairas(x) & tapaa(x,y) -> tartuntavaarassa(y))). Tartuntavaarassa lienevät myös ne henkilöt, jotka ovat tavanneet jonkin tartuntavaarassa olevan hekilön. Logiikan lauseeksi puettuna: (all x y (tartuntavaarassa(x) & tapaa(x,y) -> tartuntavaarassa(y))). Nämä lienevät riittävät tartuntavaarassa predikaatin suhteen. Lisäksi kirjottaisin tapaa-predikaattiin liittyen lauseen (all x y (tapaa(x,y) -> tapaa(y,x))) tapaamisethan ovat luonteeltaan symmetrisiä. Kotitehtävän vastaukseksi kirjoittaisin seuraavaa (qwe, rty ja uio ovat kuvitteellisia henkilöitä, joilla ei ole mitään yhteyksiä todellisiin henkilöihin). set(auto). formula_list(usable). % Section A: database tapaa(qwe,rty). tapaa(uio,rty). sairas(qwe). % Section B: definitions all x y (tapaa(x,y) -> tapaa(y,x)). all x y (sairas(x) & tapaa(x,y) -> tartuntavaarassa(y)). all x y (tartuntavaarassa(x) & tapaa(x,y) -> tartuntavaarassa(y)). % Section C: query -(tartuntavaarassa(uio)). end_of_list. Ehkäpä tuota esimerkkiä (tietokanta ja kysely) voisi vielä hieman monimutkaistaa. Tehtävänantoakin voisi monimutkaistaa vaihtamalla sairas- ja tartuntavaarassa -predikaatit kaksipaikkaisiksi: toinen argumentti antaisi sairauden (mitä sairastetaan tai mihin ollaan vaarassa sairastua). Tällöin olisi luontevaa tehdä kysely, jossa käytettäisiin muuttujaa tyyliin -(exists s tartuntavaarassa(uio, s)). mikä saisi otterin selvittämään, mihinkä sairauteen henkilö uio on vaarassa sairastua. Tässä sitä rautalankaa -- toivottavasti riittävästi väänneltynä. Tomi Janhunen luennoitsija