210 likes | 326 Views
Logiikkakielen upottaminen olio-ohjelmaan. Pietu Pohjalainen. Kielten luokittelu paradigmoittain. Lähde: Appleby & VandeKopple, 1997. Paradigman tiukkuus. Ovatko tiukasti yhdessä paradigmassa pysyttelevät kielet käytännöllisiä ?
E N D
Logiikkakielen upottaminen olio-ohjelmaan Pietu Pohjalainen
Kielten luokittelu paradigmoittain Lähde: Appleby & VandeKopple, 1997
Paradigman tiukkuus • Ovatko tiukasti yhdessä paradigmassa pysyttelevät kielet käytännöllisiä? • Vai onko niin, että luonteeltaan erilaiset ajattelutavat soveltuvat erilaisten ongelmien ratkaisemiseen ? • Esimerkiksi C++:an sanotaan olevan moniparadigmakieli
Esimerkki ajattelueroista • Ongelma: tulosta kaikki joukossa olevat luvut, jotka ovat pienempiä kuin joukon keskiarvo • Hahmotellaan toteutus imperatiivisella ja funktionaalisella kielellä, sekä • Idean selventämiseksi Javaan upotetulla logiikkakielellä
Toteutus imperatiivisella kielellä Collection c = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int avg = average(c); for(int i=0; i<c.size(); i++) { if(c[i] < avg) { print(c[i]); } }
Toteutus funktionaalisella kielellä filter(c, lambda(’i), (#’<, i, (#’avg, c) ), (#’print, i) )
Toteutus upotetulla logiikkakielellä solve(”LESSER(x, ” + average(c) + ”)”) while(i = nextResult()) { print(i); }
Logiikkakielen upottaminen oliokieleen – Miksi ja mitä ? • Motivaatio: Ymmärtää miten logiikkakielet toimivat • Motivaatio: Mahdollisuus hyödyntää logiikkakielelle ominaisia rakenteita ’oikeissa’ ohjelmistoissa • Käytännössä: Konfiguroitavissa olevan propositiologiikkakoneen toteuttaminen Javalla
Ongelma-alueen mallinnus • Vastaa kysymykseen: mitkä ovat ne asiat, joiden välisistä suhteista haluamme puhua • .. ja joista puhumiseen käytetty koneisto on riittävä • Vaiheen tuloksena sen, minkä voi sanoa, voi sanoa selvästi • ja mistä ei voi puhua, joudutaan toteuttamaan perinteisin keinoin
Predikaattien toteuttaminen • Edellisestä vaiheesta tulee predikaatteja • CLASS(x), EXTENDS(x, y) jne. • Kullekin näistä toteutetaan kaksi metodia: • totuussääntö, palauttaa TRUE tai FALSE • luettelointisääntö
Esimerkkipredikaatti STRING(x) • public class StringProposition implements Proposition { • public Object evaluate(VariableOrLiteral arg) { • if(arg instanceof Literal) { • if("A".equals(lit.value) || "B".equals(lit.value) || "C".equals(lit.value)) { • return Boolean.TRUE; • } • else { • return Boolean.FALSE; • } • } • else if(arg instanceof Variable) { • return new String[]{"A", "B", "C"}; • } • else { • System.out.println("arg: " + arg); • throw new RuntimeException("LOGIC ERR in engine"); • } • } • }
Sitominen päättelykoneistoon • Tarkoittaa predikaattien määrittelyn ja toteutuksen välistä sidontaa • Esim. ’predikaatin CLASS(x) toteutus löytyy luokasta fi.helsinki.cs.emoole.classhierarchy.Class’ • Tärkeää, jotta yleistä koneistoa voidaan uudelleenkäyttää muissakin yhteyksissä
Järjestelmän rakennekaavio • Asiakasohjelma antaa koneistolle kyselyitä • Jäsentäminen JavaCC:llä • Päättelyprosessi käyttäen nykyistä sidontaa
Yksinkertainen syntaksi CONSTRAINT ::= {'NOT'? PREDICATE}* PREDICATE ::= IDENTIFIER (VAR_OR_LITERAL {, VAR_OR_LITERAL}?) VAR_OR_LITERAL ::= IDENTIFIER | '.*' IDENTIFIER ::= [A-Z][A-Z0-9]* Esimerkkikysely class(x) and equals(x, ’Object’) and class(y) and extends(y, x) and not interface(y) Kyselykieli
Kyselyn ratkaiseminen • Aloitetaan lukemalla pinon päältä kysely • Korvataan ensimmäinen muuttuja luettelointisäännön mukaisilla arvoilla (unifikaatio) • Korvattu kysely voi siis tuottaa 0-n uutta kyselyä • Jos kyselyssä ei ole muuttujia, ja kaikki predikaatit saavat arvon tosi, niin kyselyyn löydettiin ratkaisu
Esimerkki • Jäsennetään • Asetetaan kysely pinon huipuille • Päättelyprosessin valmistuttua saadaan vastaukset avain-arvo -pareina
Hyötynäkökulmia • Kuvattavissa olevat asiat määriteltävissä (mielestäni) helposti • Toiminnan ymmärtäminen helppoa (toistaiseksi) • Predikaattien toteutuksen vaihtamisen ansiosta eri toteutusten vertailtavuus helppoa • Vähentynyt kirjoittamisen vaiva (esim. 4 riviä logiikkakieltä vrs. 100 riviä Javaa)
Haittoja / puutteita • Eri konseptien sekoittaminen lisää kognitiivista kuormaa • Ei vielä integroidu olio-ohjelmointiin tarpeeksi hyvin • Varsin rajoittunut ilmaisun mahdollisuus • Tehokkuudesta ei vielä havaintoja – todennäköisesti paljon parannettavaa
Jatkokehitys • Kyselyiden kääntäminen Javan tavukoodiksi • Oliomaisuuden kehittäminen (kyselyiden käsittely olioina, integroituminen tyyppijärjestelmään jne.) • Soveltaminen laajemmassa kuin lelu-luokan ongelmissa
Yhteenveto ja kysymykset? • Idea logiikkaohjelmoinnin ja olio-ohjelmoinnin yhteensovittamiseksi • Tämä oli järjestelmän ensimmäinen julkinen esittely – kommentteja ? • Parannusehdotuksia ja vaihtoehtoisia ratkaisutapoja otetaan mielihyvin vastaan