Post on 17-Jan-2016
description
Logiikkakielen upottaminen olio-ohjelmaan
Pietu Pohjalainen
Kielten luokittelu paradigmoittain
ProgrammingLanguage Paradigms
Imperative Declarative
Procedural Object-based Parallel
Block-structured Object-oriented
Logic Functional Database
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
Yleinen kehitysprosessimalli moniparadigmaympäristöön
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:
1. totuussääntö, palauttaa TRUE tai FALSE
2. 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
Kyselykieli
Yksinkertainen syntaksiCONSTRAINT ::=
{'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’) andclass(y) andextends(y, x) andnot interface(y)
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