u prologu - fer.hr kratil,platon). ucitelj(platon,aristotel). sljedbenik(aristotel,sokrat)...

Download u Prologu - fer.hr kratil,platon). ucitelj(platon,aristotel). sljedbenik(aristotel,sokrat) ucenik(aristotel,sokrat) ucitelj(sokrat,aristotel) ucenik(aristotel,Z) sljedbenik(Z

Post on 26-Feb-2018

242 views

Category:

Documents

12 download

Embed Size (px)

TRANSCRIPT

  • 1

    Prof.dr.sc. Bojana Dalbelo Bai

    Fakultet elektrotehnike i raunarstvaZavod za elektroniku, mikroelektroniku, raunalne i inteligentne sustave

    www.zemris.fer.hr/~bojanabojana.dalbelo@fer.hr

    FER

    travanj 2010.

    Logiko programiranje

    u Prologu

    Bojana Dalbelo Bai

  • LOGIKO PROGRAMIRANJE

    Logiko programiranje (engl. logic programming)

    uporaba matematike logike za programiranje

    Ideja: opisati problem logikim formulama, a rjeavanje prepustiti raunalu

    "Algorithm = Logic + Control

    Razliito od dokazivaa teorema (ATP) jer:

    U program su ugraeni eksplicitni kontrolni mehanizmi

    Nije podrana puna ekspresivnost logike

  • 3

    PROGRAMSKI JEZICI

    deklarativni imperativni

    funkcijski logikilambda raun(Alonzo Church, 1930.)

    Hornove klauzule predikatna logika(Alfred Horn, 1951.)

    Turingov stroj(Alan Turing, 1936.)

    value-driven command-driven

    Lisp, Haskell, SML, Ocaml, Miranda, Erlang, ...

    Prolog

    C, C++, Java, Pascal, Basic, Perl, ...

    ... Python, C#, Mathematica, Matlab, R ?

  • 4

    DEKLARATIVNI PROGRAMSKI JEZICI

    deklarativni jezici opisuju to se izraunava umjesto kako

    se to izraunava

    zadaje se specifikacija skupa uvjeta koji definiraju prostor rjeenja

    pronalaenje rjeenja preputeno je interpreteru

    osnovne karakteristike:

    eksplicitno stanje umjesto implicitnog stanja

    nema popratnih efekata (engl. side-effects)

    programiranje s izrazima

    funkcijski jezici: izraz=fukcija

    logiki jezici: izraz=relacija

  • 5

    POPRATNI EFEKTI

    koja je povratna vrijednost funkcije main ?

    povratna vrijednost ovisi o redoslijedu izrauna pribrojnika!

    deklarativno ne bi smjelo biti razlike:

    A+B = B+A

    function foo(x)beginy = 0return 2*xend

    function main()beginy = 5x = foo(2) + yreturn xend

    popratni efekt!

    prave funkcije ne prtljaju po memoriji ve samo vraaju vrijednost

  • 6

    POPRATNI EFEKTI

    funkcija foo ima popratni efekt stoga nije referencijalno

    prozirna

    ne vrijedi Leibnizovo pravilo: equals for equals

    moramo voditi rauna o tijeku izvoenja (proceduralno) umjesto da se koncentriramo na znaenje programa(deklarativno)

    function foo(x)beginy = 0return 2*xend

    ...y = 5if (foo(y) == foo(y)) then ......

    false???

  • 7

    DEKLARATIVNI JEZICI

    isto deklarativni (engl. purely declarative) jezici ne

    dozvoljavaju popratne efekte

    Haskell, ...

    radi praktinosti veina deklarativnih jezika doputa kontrolirane popratne efekte (declarative in style)

    Lisp, SML, Ocaml, Prolog, ...

    pogodnosti:

    formalno koncizni, visoka razina apstrakcije

    laka formalna verifikacija

    manja mogunost pogreke

    nedostaci:

    neuinkovitost

    neke strukture/funkcije iziskuju popratne efekte (npr.?)

  • 8

    DEKLARATIVNI JEZICI

    deklarativni jezici nemaju varijabli u klasinom smislu

    (variables do not vary)

    nemaju naredbe pridruivanja (x = x + 1) jer bi to iziskivalo popratni efekt

    nemaju programskih petlji

    umjesto toga: rekurzija

    function fact(n)begina = 1for i = 1 to n dobegin

    a = a*iendreturn a

    end

    fact 1 = 1fact n = n*fact(n-1)

    Haskell:

  • 9

    PROLOG

    Prolog = Programming in Logic

    deklarativni logiki programski jezik

    1972.: Alan Colmerauer, Robert Kowalski, Philippe Roussel

    originalno razvijen za NLP

    fundamentalni koncepti:

    rekurzija

    unifikacija

    postupak vraanja (backtracking)

    nije isto deklarativan:

    "Algorithm = Logic + Control

    (A B) C (B A) C

  • 10

    HORNOVE FORMULE

    Programi u Prologu sainjeni su od slijeda pravila

    Svako pravilo je FOPL-formula u Hornovom obliku:

    ~P1 ~P2 ~P3 ... ~Pn Q

    tj. klauzula u kojoj je najvie jedan literal pozitivan

    Ekvivalentno: (P1 P2 P3 ... Pn) Q

    Specijalan sluaj za Pi = true: true Q == Q

    Definitna Hornova klauzula: tono jedan literal je pozitivan

    Naalost, ne moe se svaka formula pretvoriti u (definitni) Hornov oblik .... ~P Q, P (Q R)

    Zakljuivanje nad Hornovim formulama: rezolucija opovrgvanjem (krenuvi od ~Q)

  • 11

    Primjer programa u Prologu

    baza znanja (logiki program):

    varijable velikim, predikatni simboli malim slovima

    implikacija u obliku konzekvens :- antecedens

    svaki redak zavrava tokom

    varijable su implicitno univerzalno kvantificirane

    smrtan(X) :- covjek(X).covjek(sokrat).

    x (COVJEK(x) SMRTAN(x)) COVJEK(Sokrat)

    pravilo

    injenica

  • 12

    Primjer upita (1)

    sada moemo postavljati upite:

    smrtan(X) :- covjek(X).covjek(sokrat).

    ?- covjek(sokrat).Yes?- smrtan(sokrat).Yes?- smrtan(X).X=sokratYes

  • 13

    Konjunkcija atoma

    antecedens moe sadravati vei broj atoma:

    covjek(X) :-sisavac(X), govori(X).

    operator i

    covjek(X) :-sisavac(X),govori(X),placa_porez(X).

  • 14

    Disjunkcija atoma

    jedan predikat moe biti definiran s vie stavaka:

    izmeu stavaka se podrazumijeva konjunkcija

    tomu je ekvivalentno:

    provjerite!

    smrtan(X) :- covjek(X).smrtan(X) :- ziv(X).

    smrtan(X) :-covjek(X); ziv(X).

    operator ili

  • 15

    Viemjesni predikati

    predikati mogu biti n-mjesni:

    kako definirati predikat ucenik pomou ucitelj ?

    kako definirati jednomjesni predikat ucen ?

    ucitelj(sokrat,platon).ucitelj(kratil,platon).ucitelj(platon,aristotel).

    ucenik(X,Y) :- ucitelj(Y,X).

    ucen(X) :- ucitelj(Y,X).

  • 16

    Kvantifikacija varijabli

    kako je kvantificirana varijabla Y?

    sve varijable su implicitno univerzalno kvantificirane u cijelom pravilu, ali Y se javlja samo u antecedensu pa moemo rei da je egzistencijalno kvantificirana

    dokai:

    x y (UCITELJ(y,x) UCEN(x)) x (y UCITELJ(y,x) UCEN(x))

    ucen(X) :- ucitelj(Y,X).

  • 17

    Primjer upita (2)

    primjeri upita:

    ?- ucitelj(X,platon).X=sokratX=kratil Yes?- ucitelj(sokrat,Y),ucitelj(kratil,Y).Y=platonYes?- ucenik(X,_).X=platonX=platonX=aristotelYes?- ucenik(aristotel,sokrat).No

  • 18

    REKURZIJA

    definirajmo tranzitivnu relaciju SLJEDBENIK(x,y)

    x je ucenik od y

    x ucenik od nekog z, a z je sljedbenik od y

    upit:

    sljedbenik(X,Y):-ucenik(X,Y).

    sljedbenik(X,Y):-ucenik(X,Z),sljedbenik(Z,Y).

    trivijalan sluaj

    rekurzivan sluaj

    ?- sljedbenik(aristotel,sokrat).Yes

  • 19

    BACKTRACKING

    Prolog dokazuje unatrag od cilja k premisama, metodom

    pretraivanja u dubinu

    antecedens postaje novi meucilj koji treba dokazati i koji se dodaje na stog

    Kada jedna grana dokaza ne uspije, Prolog se vraa (BACKTRACKS) na zadnju toku odabira

    Ako iscrpi sve mogunosti, vraa No, inae Yes

    No No No Yes

    Cilj

    ->

  • 20

    BACKTRACKING

    sljedbenik(X,Y):-ucenik(X,Y).

    sljedbenik(X,Y):-ucenik(X,Z),sljedbenik(Z,Y).

    ucenik(X,Y):-ucitelj(Y,X).

    ucitelj(sokrat,platon).ucitelj(kratil,platon).ucitelj(platon,aristotel).

    sljedbenik(aristotel,sokrat)

    ucenik(aristotel,sokrat)

    ucitelj(sokrat,aristotel)

    ucenik(aristotel,Z)sljedbenik(Z,sokrat)

    ucitelj(Z,aristotel)sljedbenik(Z,sokrat)

    sljedbenik(platon,sokrat)

    Z=platon

    ucenik(platon,sokrat)

    ucitelj(sokrat,platon)

    No

    Yes

    backtracking

  • 21

    Deklarativno vs. proceduralno

    Naalost, Prolog nije isto deklarativan pa je redoslijed

    stavaka i atoma itekako bitan:

    out of stack

    sljedbenik(X,Y):-ucenik(X,Y).

    sljedbenik(X,Y):-ucenik(X,Z),sljedbenik(Z,Y).

    sljedbenik(X,Y):-ucenik(X,Z),sljedbenik(Z,Y).

    sljedbenik(X,Y):-ucenik(X,Y).

    sljedbenik(X,Y):-ucenik(X,Y).

    sljedbenik(X,Y):-sljedbenik(Z,Y),ucenik(X,Z).

    sljedbenik(X,Y):-sljedbenik(Z,Y),ucenik(X,Z).

    sljedbenik(X,Y):-ucenik(X,Y).

  • 22

    UNIFIKACIJA

    U svakom koraku zakljuivanja Prolog nastoji unificirati

    trenutni cilj sa stoga s konzekvensima pravila ili

    injenicama u bazi znanja

    unificirati moemo i eksplicitno:

    ?- ucitelj(Z,aristotel) = ucitelj(platon,aristotel)Z = platonYes

    ?- ucenik(Z,aristotel) = ucenik(platon,Z)No

    ?- X = f(X).X = f(f(f(...)))

    nema provjere pojavljivanja

    varijable! (occurs check)

    operator

    unifikacije

  • 23

    NEGACIJA

    Hornov oblik ne doputa negaciju u antecedensu, ali

    Prolog doputa operator not

    negacija pomou neuspjeha (NAF)

    ako P(x) ne moe dokazati,

    onda je istinito not(P(x)), inae je lano

    pretpostavljamo zatvorenost svijeta (CWA)

    sve to nije u bazi znanja je lano

    covjek(X) :-govori(X),not(ima(X,perje)).

  • 24

    NEGACIJA

    baza znanja:

    upiti:

    ima(polinezija,perje).govori(polinezija).govori(sokrat).covjek(X) :-

    govori(X),not(ima(X,perje)).

    ?- covjek(sokrat).Yes?- covjek(polinezija).No?- not(covjek(polinezija)).Yes

  • Laboratorijski zadatak

    Zadatak 2.5: Primjena Prologa u porodinoj domeni

    (3 boda)

    U programskom jeziku Prolog definirajte bazu znanja koja opisuje porodine relacije i omoguuje izvoenje novih zakljuaka. U baza znanja definirajte injenice roditelj, musko, zensko i dob, te zatim pravila otac, majka, brat, sestra, djed, baka, ujak, predak i srodan.

    Definirajte upite kojima se iz baze znanja dohvaaju (1) svi roditeljski parovi, (2) sve osobe koje su nekome

Recommended

View more >