logiikkakielen upottaminen olio-ohjelmaan

Post on 17-Jan-2016

31 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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ä ? - PowerPoint PPT Presentation

TRANSCRIPT

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

top related