1 / 21

Logiikkakielen upottaminen olio-ohjelmaan

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ä ?

liseli
Download Presentation

Logiikkakielen upottaminen olio-ohjelmaan

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Logiikkakielen upottaminen olio-ohjelmaan Pietu Pohjalainen

  2. Kielten luokittelu paradigmoittain Lähde: Appleby & VandeKopple, 1997

  3. 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

  4. 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ä

  5. 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]); } }

  6. Toteutus funktionaalisella kielellä filter(c, lambda(’i), (#’<, i, (#’avg, c) ), (#’print, i) )

  7. Toteutus upotetulla logiikkakielellä solve(”LESSER(x, ” + average(c) + ”)”) while(i = nextResult()) { print(i); }

  8. 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

  9. Yleinen kehitysprosessimalli moniparadigmaympäristöön

  10. 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

  11. 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ö

  12. 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"); • } • } • }

  13. 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ä

  14. Järjestelmän rakennekaavio • Asiakasohjelma antaa koneistolle kyselyitä • Jäsentäminen JavaCC:llä • Päättelyprosessi käyttäen nykyistä sidontaa

  15. 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

  16. 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

  17. Esimerkki • Jäsennetään • Asetetaan kysely pinon huipuille • Päättelyprosessin valmistuttua saadaan vastaukset avain-arvo -pareina

  18. 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)

  19. 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

  20. 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

  21. 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

More Related