Logičko programiranje u Prologu

Preview:

Citation preview

1

Prof.dr.sc. Bojana Dalbelo Bašić

Fakultet elektrotehnike i računarstvaZavod za elektroniku, mikroelektroniku, računalne i inteligentne sustave

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

FER

travanj 2010.

Logičko programiranje

u Prologu

© Bojana Dalbelo Bašić

LOGIČKO PROGRAMIRANJE

Logičko programiranje (engl. logic programming)

uporaba matematičke logike za programiranje

Ideja: opisati problem logičkim formulama, a rješavanje prepustiti računalu

"Algorithm = Logic + Control”

Različito od dokazivača teorema (ATP) jer:

U program su ugrađeni eksplicitni kontrolni mehanizmi

Nije podržana puna ekspresivnost logike

3

PROGRAMSKI JEZICI

deklarativni imperativni

funkcijski logičkilambda račun(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 izračunava umjesto kako

se to izračunava

zadaje se specifikacija skupa uvjeta koji definiraju prostor rješenja

pronalaženje rješenja prepušteno je interpreteru

osnovne karakteristike:

eksplicitno stanje umjesto implicitnog stanja

• nema popratnih efekata (engl. side-effects)

programiranje s izrazima

• funkcijski jezici: izraz=fukcija

• logički jezici: izraz=relacija

5

POPRATNI EFEKTI

koja je povratna vrijednost funkcije main ?

povratna vrijednost ovisi o redoslijedu izračuna 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 vraćaju vrijednost

6

POPRATNI EFEKTI

funkcija foo ima popratni efekt stoga nije referencijalno

prozirna

ne vrijedi Leibnizovo pravilo: “equals for equals”

moramo voditi računa o tijeku izvođenja (proceduralno) umjesto da se koncentriramo na značenje 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 praktičnosti većina deklarativnih jezika dopušta kontrolirane popratne efekte (“declarative in style”)

Lisp, SML, Ocaml, Prolog, ...

pogodnosti:

formalno koncizni, visoka razina apstrakcije

lakša formalna verifikacija

manja mogućnost pogreške

nedostaci:

neučinkovitost

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

8

DEKLARATIVNI JEZICI

deklarativni jezici nemaju varijabli u klasičnom smislu

(“variables do not vary”)

nemaju naredbe pridruživanja (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 logički programski jezik

1972.: Alan Colmerauer, Robert Kowalski, Philippe Roussel

originalno razvijen za NLP

fundamentalni koncepti:

rekurzija

unifikacija

postupak vraćanja (backtracking)

nije čisto deklarativan:

"Algorithm = Logic + Control”

(A B) C ≠ (B A) C

10

HORNOVE FORMULE

Programi u Prologu sačinjeni su od slijeda pravila

Svako pravilo je FOPL-formula u Hornovom obliku:

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

tj. klauzula u kojoj je najviše jedan literal pozitivan

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

Specijalan slučaj za Pi = true: true Q == Q

Definitna Hornova klauzula: točno jedan literal je pozitivan

Nažalost, ne može se svaka formula pretvoriti u (definitni) Hornov oblik .... ~P Q, P (Q R)

Zaključivanje nad Hornovim formulama: rezolucija opovrgvanjem (krenuvši od ~Q)

11

Primjer programa u Prologu

baza znanja (logički program):

varijable velikim, predikatni simboli malim slovima

implikacija u obliku konzekvens :- antecedens

svaki redak završava točkom

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 možemo postavljati upite:

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

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

13

Konjunkcija atoma

antecedens može sadržavati veći broj atoma:

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

operator “i”

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

14

Disjunkcija atoma

jedan predikat može biti definiran s više stavaka:

između 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

Višemjesni predikati

predikati mogu biti n-mjesni:

kako definirati predikat ucenik pomoću 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 možemo reći da je egzistencijalno kvantificirana

dokaži:

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 slučaj

rekurzivan slučaj

?- sljedbenik(aristotel,sokrat).Yes

19

BACKTRACKING

Prolog dokazuje unatrag od cilja k premisama, metodom

pretraživanja u dubinu

antecedens postaje novi međucilj koji treba dokazati i koji se dodaje na stog

Kada jedna grana dokaza ne uspije, Prolog se vraća (BACKTRACKS) na zadnju točku odabira

Ako iscrpi sve mogućnosti, vraća No, inače Yes

No No No Yes

Cilj

<- stog prazan, cilj dokazan

točke odabira ->

->

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

Nažalost, 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 zaključivanja Prolog nastoji unificirati

trenutni cilj sa stoga s konzekvensima pravila ili

činjenicama u bazi znanja

unificirati možemo 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 dopušta negaciju u antecedensu, ali

Prolog dopušta operator not

negacija pomoću neuspjeha (NAF)

ako P(x) ne možeš dokazati,

onda je istinito not(P(x)), inače je lažno

pretpostavljamo zatvorenost svijeta (CWA)

sve što nije u bazi znanja je lažno

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 porodičnoj domeni

(3 boda)

U programskom jeziku Prolog definirajte bazu znanja koja opisuje porodične relacije i omogućuje izvođenje novih zaključaka. 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 dohvaćaju (1) svi roditeljski parovi, (2) sve osobe koje su nekome ujak, (3) sva djeca koja imaju stariju braću, (4) sve prabake koje su to već deset godina, (5) svi potomci neke zadane osobe, (6) sve punoljetne osobe bez djece, (7) svi parovi osoba koje nisu u srodstvu, (8) sve majke s troje ili više djece, (9) sve majke s točno troje djece te (10) sve majke s troje ili manje djece.

Laboratorijski zadatak

roditelj(zeus,atena).roditelj(zeus,apolo).roditelj(hera,ares)....musko(zeus).zensko(hera)....otac(X,Y):- ...

Recommended