Download - Logiikkakielen upottaminen olio-ohjelmaan
![Page 1: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/1.jpg)
Logiikkakielen upottaminen olio-ohjelmaan
Pietu Pohjalainen
![Page 2: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/2.jpg)
Kielten luokittelu paradigmoittain
ProgrammingLanguage Paradigms
Imperative Declarative
Procedural Object-based Parallel
Block-structured Object-oriented
Logic Functional Database
Lähde: Appleby & VandeKopple, 1997
![Page 3: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/3.jpg)
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
![Page 4: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/4.jpg)
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ä
![Page 5: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/5.jpg)
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]); }}
![Page 6: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/6.jpg)
Toteutus funktionaalisella kielellä
filter(c,
lambda(’i),
(#’<, i, (#’avg, c) ),
(#’print, i)
)
![Page 7: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/7.jpg)
Toteutus upotetulla logiikkakielellä
solve(”LESSER(x, ” + average(c) + ”)”)
while(i = nextResult()) {
print(i);
}
![Page 8: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/8.jpg)
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
![Page 9: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/9.jpg)
Yleinen kehitysprosessimalli moniparadigmaympäristöön
![Page 10: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/10.jpg)
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
![Page 11: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/11.jpg)
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ö
![Page 12: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/12.jpg)
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"); } } }
![Page 13: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/13.jpg)
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ä
![Page 14: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/14.jpg)
Järjestelmän rakennekaavio
Asiakasohjelma antaa koneistolle kyselyitä
Jäsentäminen JavaCC:llä
Päättelyprosessi käyttäen nykyistä sidontaa
![Page 15: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/15.jpg)
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)
![Page 16: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/16.jpg)
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
![Page 17: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/17.jpg)
Esimerkki
Jäsennetään Asetetaan kysely
pinon huipuille Päättelyprosessin
valmistuttua saadaan vastaukset avain-arvo -pareina
![Page 18: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/18.jpg)
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)
![Page 19: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/19.jpg)
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
![Page 20: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/20.jpg)
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
![Page 21: Logiikkakielen upottaminen olio-ohjelmaan](https://reader036.vdocuments.pub/reader036/viewer/2022062519/56814cce550346895db9d62a/html5/thumbnails/21.jpg)
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