22
Principy logického programování Syntaxe Procedurální sémantika Logické programování Tomáš Kühr 30. ˇ ríjna 2012 Tomáš Kühr Logické programování

Principy logického programování Syntaxe Procedurální ... · PDF filePrincipy logického programování Syntaxe Procedurální sémantika Logické programování Tomáš Kühr

  • Upload
    vanbao

  • View
    217

  • Download
    2

Embed Size (px)

Citation preview

Principy logického programováníSyntaxe

Procedurální sémantika

Logické programování

Tomáš Kühr

30. ríjna 2012

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Osnova

1 Principy logického programování

2 Syntaxe

3 Procedurální sémantika

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

1 Principy logického programování

2 Syntaxe

3 Procedurální sémantika

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Paradigmata programování

Strukturované programování

Procedurální programování

Funkcionální programování

Logické programování

Objektove orientované programování

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Paradigmata programování

Strukturované programování

Procedurální programování

Funkcionální programování

Logické programování

Objektove orientované programování

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Logické programování

Co je logické programování?jedno z paradigmat programovánízaloženo na matematické logiceprogram = konecná množina axiomuvýpocet = konstruktivní dukaz dotazu zadaného uživatelem

Vývoj a využitíprincip logického programování predstavenJ. A. Robinsonem v 1965první implementace v 70. letech 20. století na Univerzitev Marseille (PROLOG)využití pri programování expertních systémujazyky: dialekty LISPu (USA), PROLOG (Evropa)rozšírení PROLOGU: fuzzy PROLOG, DATALOG, . . .

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Znalostní báze

Znalostní báze (popis prirozeným jazykem)Honza, Jirka a Vilík jsou muži. Monika a Jana jsou ženy. Honzaje Jirkovo díte. Vilík je Monicino díte.Synové jsou deti mužského pohlaví.Deti jsou naši potomci, deti našich potomku jsou také našipotomci.

Presnejší formulace znalostní bázeHonza je muž. Jirka je muž. Vilík je muž. Monika je žena. Janaje žena. Honza je Jirkovo díte. Vilík je Monicino díte.Osoba X je synem osoby Y pokud je X dítetem Y a pokud je Xmuž.Osoba X je potomkem osoby Y pokud je X dítetem Y nebopokud je X dítetem nekterého potomka Y.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Znalostní báze

Znalostní báze (popis prirozeným jazykem)Honza, Jirka a Vilík jsou muži. Monika a Jana jsou ženy. Honzaje Jirkovo díte. Vilík je Monicino díte.Synové jsou deti mužského pohlaví.Deti jsou naši potomci, deti našich potomku jsou také našipotomci.

Presnejší formulace znalostní bázeHonza je muž. Jirka je muž. Vilík je muž. Monika je žena. Janaje žena. Honza je Jirkovo díte. Vilík je Monicino díte.Osoba X je synem osoby Y pokud je X dítetem Y a pokud je Xmuž.Osoba X je potomkem osoby Y pokud je X dítetem Y nebopokud je X dítetem nekterého potomka Y.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Ukázka logického programu

Honza je muž. Jirka je muž. Vilík je muž. Monika je žena. Janaje žena. Honza je Jirkovo díte. Vilík je Monicino díte.Osoba X je synem osoby Y pokud je X dítetem Y a pokud je Xmuž. Osoba X je potomkem osoby Y pokud je X dítetem Ynebo pokud je X dítetem nekterého potomka Y.

Logický programmuz(honza). muz(jirka). muz(vilik).zena(monika). zena(jana).jeDite(honza,jirka). jeDite(vilik,monika).jeSyn(X,Y) :- jeDite(X,Y), muz(X).jePotomek(X,Y) :- jeDite(X,Y).jePotomek(X,Y) :- jeDite(X,Z), jePotomek(Z,Y).

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Ukázka logického programu

% prirozene cislonatural(0).natural(s(X)) :- natural(X).% scitani prirozenych ciseladd(X,0,X).add(X,s(Y),s(Z)) :- add(X,Y,Z).% je sude?even(0).even(s(s(X))) :- even(X).% je liche?odd(s(0)).odd(s(s(X))) :- odd(X).% prirozené usporadani X,Yleq(X,X).leq(X,s(Y)) :- leq(X,Y).

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

1 Principy logického programování

2 Syntaxe

3 Procedurální sémantika

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Jazyk logického programu

DefiniceJazyk logického programu L obsahuje

konecnou množinu atomu (konstant) A(napr. honza, jirka, monika, 0),spocetnou množinu promenných V(napr. X, Y, Z, Cislo),konecnou neprázdnou množinu predikátu P(napr. muz/1, zena/1, jePotomek/2, natural/1, leq/2)a konecnou množinu funktoru F(napr. s/1).

U každého predikátu a funktoru se obvykle uvádí i jeho arita.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Termy a formule

DefiniceTerm jazyka L definujeme následovne:

Každá promenná v ∈ V je term.Každý atom a ∈ A je term.Jsou-li t1, . . . , tn termy, pak pro libovolný funktor f ∈ F jef (t1, . . . , tn) term.

Príklady: X, honza, 0, s(s(0)), s(s(s(s(Cislo))))

DefiniceJsou-li t1, . . . , tn termy jazyka L, pak pro libovolný predikátp ∈ P je p(t1, . . . , tn) atomická formule.

Príklady: muz(honza), zena(jirka), leq(s(0),0)

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Logický program

DefiniceFaktem nazýváme libovolnou atomickou formuli A0.

Príklady: muz(jirka), jeDite(vilik,monika)

DefinicePravidlem rozumíme libovolný výraz ve tvaruA0 ← A1,A2, . . . ,An, kde A0, . . . ,An jsou atomické formule.

Príklad: jePotomek(X,Y) :- jeDite(X,Y).

DefiniceCíl je libovolný výraz ve tvaru A1,A2, . . . ,An, kde A1, . . . ,Anjsou atomické formule.

Príklad: jeDite(X,monika), muz(X)Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Príklad výpoctu

Program:muz(honza). muz(jirka). muz(vilik).zena(monika). zena(jana).jeDite(honza,jirka). jeDite(jana,monika).jeDite(vilik,monika).jeSyn(X,Y) :- jeDite(X,Y), muz(X).

Zadán cíl: jeSyn(X, monika).

Intuitivní rešení:K tomu, abychom stanovili odpoved’ na jeSyn(X, monika).stací stanovit odpoved’ na jeDite(X,monika), muz(X),což pro X = vilik dostáváme ihned z databáze faktu. Pro žádnoudalší hodnotu X to již neplyne.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

1 Principy logického programování

2 Syntaxe

3 Procedurální sémantika

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Substituce

DefiniceNecht’ X1, . . . ,Xn jsou promenné a t1, . . . , tn jsou takové termy,že platí

1 Xi 6= ti (i = 1, . . . ,n),2 Xi 6= Xj (i 6= j).

Pak množinu Θ = {X1/t1, . . . ,Xn/tn} nazveme substituce.

Použití substituce Θ na term (formuli, fakt, pravidlo, cíl) A jeterm (formule, fakt, pravidlo, cíl) AΘ, který vznikne z A náhradouvšech výskytu promenných Xi v A odpovídajícími termy ti .

Príklad:Θ = {X/vilik ,Y/Z ,Z/jana},A = jeDite(X ,Y ),muz(Z ),muz(vilik),AΘ = jeDite(vilik ,Z ),muz(jana),muz(vilik).

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Skládání substitucí

DefiniceNecht’ Θ a σ jsou substituce ve tvaru Θ = {X1/s1, . . . ,Xm/sm}a σ = {Y1/t1, . . . ,Yn/tn}. Pak složená substituce Θσ je ve tvaru{X1/(s1σ), . . . ,Xn/(smσ),Y1/t1, . . . ,Yn/tn}, ve které navícvynecháme všechny:

1 prvky Xi/(siσ), pro které Xi = siσ,2 prvky Yj/tj , pro které Yj ∈ {X1, . . . ,Xn}.

Príklad:Θ = {X/s(Z ),Y/W} a σ = {X/0,Z/0,W/Y}Vytvoríme {X/s(0),Y/Y ,X/0,Z/0,W/Y}, ze které následneodebereme Y/Y a X/0.Θσ = {X/s(0),Z/0,W/Y}.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Nejobecnejší unifikátor – algoritmusVstup: atomické formule φ a ψVýstup: substituce Θ, pro kterou φΘ = ψΘ a Θ je nejobecnejší(nejjednodušší) možná, nebo odpoved’ “nelze unifikovat”

1 Položme E = {〈φ, ψ〉}.2 Vyber libovolný prvek 〈s, t〉 ∈ E .

Pokud s = f (s1, . . . , sn) a t = f (t1, . . . , tn), nahrad’ 〈s, t〉 v Edvojicemi 〈s1, t1〉, . . . , 〈sn, tn〉 a opakuj bod 2.Pokud s = f (s1, . . . , sm) a t = g(t1, . . . , tn), kde f 6= g, pakukonci výpocet s výstupem “nelze unifikovat”.Pokud s = t , vyjmi 〈s, t〉 z E a opakuj bod 2.Pokud t = X a s není promenná, nahrad’ 〈s,X 〉 v E dvojicí〈X , s〉 a opakuj bod 2.Pokud s = X , t 6= X a promenná X má v E více výskytu,

pak pokud se X vyskytuje v t , odpovez “nelze unifikovat”,jinak nahrad’ ostatní výskyty X v E termem t a opakuj bod 2.

Pokud pro žádný 〈s, t〉 ∈ E nelze nic provést, pak vrat’Θ = {X/t | 〈X , t〉 ∈ E}.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Nejobecnejší unifikátor – príklad

PríkladNaleznete nejobecnejší unifikátor f (X ,g(Y )) a f (g(Z ),Z ).

E = {〈f (X ,g(Y )), f (g(Z ),Z )〉}E = {〈X ,g(Z )〉, 〈g(Y ),Z 〉}E = {〈X ,g(Z )〉, 〈Z ,g(Y )〉}E = {〈X ,g(g(Y ))〉, 〈Z ,g(Y )〉}Θ = {X/g(g(Y )),Z/g(Y )}

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Deterministický algoritmusVstup: logický program a cílVýstup: odpoved’ “No” nebo odpoved’ “Yes” spolu se substitucí

1 Vyber první podcíl v aktuálním cíli. Pokud je aktuální cílprázdný pokracuj bodem 3.

2 Procházej od zacátku program.Pokud je první podcíl unifikovatelný pomocí Θ s hlavounekterého pravidla, prepiš jej v aktuálním cíli telem tohotopravidla a na celý aktuální cíl použij Θ. Pokracuj bodem 1.Pokud je první podcíl unifikovatelný pomocí Θ s faktem,odstran jej z cíle a použij Θ na cíl. Pokracuj bodem 1.Pokud první podcíl není s nicím unifikovatelný, vrátíme sek predchozímu cíli a zkusíme použít jiné pravidlo/fakt.Pokud první podcíl není s nicím unifikovatelný a již se nelzevrátit k predchozímu cíli, koncí výpocet odpovedí “No”.

3 Odpovez “Yes” a substitucí vzniklou složením použitýchsubstitucí, ze které odstraníme Xj/tj , pokud Xj není v cíli.

Tomáš Kühr Logické programování

Principy logického programováníSyntaxe

Procedurální sémantika

Literatura

J. W. Lloyd: Foundations of logic programming. Springer, 1987.

J. Hynek, P. Mikulecký: Logické programování a Prolog,Gaudeamus, 2003.

V. Vychodil: Prezentace k predmetu Paradigmataprogramování IV, 2005.

SWI-Prolog, dostupné na adresehttp://www.swi-prolog.org/.

Tato prezentace a implementace did-prolog je dostupnána adrese http://www.inf.upol.cz/ v cásti Prednáškypro strední školy.

Tomáš Kühr Logické programování