From jpiitula@ling.helsinki.fi Wed Jan 12 14:29:43 2000 Received: from tuuri.ling.helsinki.fi (tuuri.ling.helsinki.fi [128.214.78.4]) by walrus.megabaud.fi (8.8.8/8.8.7) with ESMTP id OAA15944 for ; Wed, 12 Jan 2000 14:29:43 +0200 (EET) Received: (from jpiitula@localhost) by tuuri.ling.helsinki.fi (8.8.8/8.8.0) id OAA13890; Wed, 12 Jan 2000 14:29:53 +0200 (EET) Sender: jpiitula@ling.helsinki.fi To: Antti Karttunen CC: jpiitula@tuuri.ling.helsinki.fi Subject: Prolog-harjoitus Re: Tunnus Prolog-harjoit[] References: <37F27E87.C7D@walrus.megabaud.fi> <3873B14C.5234@walrus.megabaud.fi> From: Jussi Piitulainen Date: 12 Jan 2000 14:29:53 +0200 In-Reply-To: Antti Karttunen's message of "Wed, 05 Jan 2000 23:02:04 +0200" Message-ID: Lines: 73 X-Mailer: Gnus v5.7/Emacs 20.4 Status: ROr Hei, tämä löytyikin helpommin kuin odotin. Kirjoitin keväällä yhdelle opiskelijalle tällaisen speksintapaisen: Mitä sen sijaan sanoisit sellaisesta vaihtoehdosta että tekisit vähän isomman harjoitustyön? Aikaa on esimerkiksi elokuun loppuun, lähteitä saa tietenkin käyttää, ohjelman pitää toimia Sicstusissa ja olla itse tehty. Tiukemmasta aikataulusta tulisi varmaan sotkua kun on kesä. Ajattelin seuraavaa tehtävää: count_words(InStream,OutStream) lukee syöttövirrasta InStream tekstiä ja kirjoittaa tulosvirtaan OutStream taulukon "sanojen" esiintymisten määristä. "Sana" on maksimaalinen epätyhjä kirjainjono; muut merkit erottavat sanoja. Taulukko tulostetaan lukumäärän mukaan laskevaan järjestykseen, yhtä usein esiintyneet aakkosjärjestyksessä. Tämä on siis suurin piirtein tr -cs 'A-Öa-ö' '\n' | gawk NF | sort | uniq -c | sort -xyzåäö mutta Prologilla. Tehokkuus ei ole tärkeä seikka eli listoja voi huoletta käyttää vaikka ne johtavatkin väärään vaativuusluokkaan. (Sicstusin kirjastossa on parempiakin tietorakenteita.) Testiohjelma olisi noin count_file(File) :- open(File,read,In), current_output(Out), count_words(In,Out), close(In). ja sen kutsu esimerkiksi | ?- count_file('/tmp/corpus.txt'). Lukeminen tapahtuisi merkki kerrallaan - katso malliksi read_line/1 kurssimateriaalitekeleestäni - ja voit itse päättää miten koodien listoja käsittelet. (Sictusin get0/1 on standardissa get_code/1.) Erillistä dokumenttia ei tarvitse, jos koodi on siistiä ja sopivasti kommentoitua. Olen ajatellut jatkossa tarjota tällaista suoritusmahdollisuutta. Joutuisit koehenkilön asemaan - mitä sanot? Olet nyt kuitenkin ensimmäinen, joka todella suorittaisi kurssin näin. (1) Sopiiko tehtävä? Kuten sanoin, voit ehdottaa muutakin. (2) Tarvitsetko tarkempia ohjeita heti nyt? (Sicstus, tiedostot, kirja, itse tehtävä...) Miten kirjan kanssa on sujunut? (3) Sopiiko, että katsomme edistymistäsi a. helmikuun alussa, b. helmikuun puolessa välissä, c. milloin, eli jostain aikataulusta haluaisin sopia. (4) Yritän heti kohta asentaa Sicstusin uuden version, 3.8, josta huhutaan, että se noudattaisi ISO-standardia. Jokin saattaa siis muuttua, ja eroja on ollut nimenomaan merkkikoodien käsittelyssä. (5) Älä jää jumiin. Jos homma takkuaa niin ota yhteyttä. Homeentorjuntajoukot lienevät poistuneet ja laitos on jossain määrin elinkelpoinen paikka taas. Minut tavoittaa kuitenkin parhaiten iimeilitse. -- Jussi