30. října 2012
Osnova Principy logického programování 1 Principy logického programování 2 3
1 Principy logického programování 2 3
Paradigmata programování Strukturované programování Procedurální programování Funkcionální programování Objektově orientované programování
Paradigmata programování Strukturované programování Procedurální programování Funkcionální programování Objektově orientované programování
Co je logické programování? jedno z paradigmat programování založeno na matematické logice program = konečná množina axiomů výpočet = konstruktivní důkaz dotazu zadaného uživatelem Vývoj a využití princip logického programování představen J. A. Robinsonem v 1965 první implementace v 70. letech 20. století na Univerzitě v Marseille (PROLOG) využití při programování expertních systémů jazyky: dialekty LISPu (USA), PROLOG (Evropa) rozšíření PROLOGU: fuzzy PROLOG, DATALOG,...
Znalostní báze Znalostní báze (popis přirozeným jazykem) Honza, Jirka a Vilík jsou muži. Monika a Jana jsou ženy. Honza je Jirkovo dítě. Vilík je Moničino dítě. Synové jsou děti mužského pohlaví. Děti jsou naši potomci, děti našich potomků jsou také naši potomci. Přesnější formulace znalostní báze Honza je muž. Jirka je muž. Vilík je muž. Monika je žena. Jana je žena. Honza je Jirkovo dítě. Vilík je Moničino dítě. Osoba X je synem osoby Y pokud je X dítětem Y a pokud je X muž. Osoba X je potomkem osoby Y pokud je X dítětem Y nebo pokud je X dítětem některého potomka Y.
Znalostní báze Znalostní báze (popis přirozeným jazykem) Honza, Jirka a Vilík jsou muži. Monika a Jana jsou ženy. Honza je Jirkovo dítě. Vilík je Moničino dítě. Synové jsou děti mužského pohlaví. Děti jsou naši potomci, děti našich potomků jsou také naši potomci. Přesnější formulace znalostní báze Honza je muž. Jirka je muž. Vilík je muž. Monika je žena. Jana je žena. Honza je Jirkovo dítě. Vilík je Moničino dítě. Osoba X je synem osoby Y pokud je X dítětem Y a pokud je X muž. Osoba X je potomkem osoby Y pokud je X dítětem Y nebo pokud je X dítětem některého potomka Y.
Ukázka logického programu Honza je muž. Jirka je muž. Vilík je muž. Monika je žena. Jana je žena. Honza je Jirkovo dítě. Vilík je Moničino dítě. Osoba X je synem osoby Y pokud je X dítětem Y a pokud je X muž. Osoba X je potomkem osoby Y pokud je X dítětem Y nebo pokud je X dítětem některého potomka Y. Logický program muz(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).
Ukázka logického programu % prirozene cislo natural(0). natural(s(x)) :- natural(x). % scitani prirozenych cisel add(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,Y leq(x,x). leq(x,s(y)) :- leq(x,y).
1 Principy logického programování 2 3
Jazyk logického programu Definice Jazyk logického programu L obsahuje konečnou množinu atomů (konstant) A (např. honza, jirka, monika, 0), spočetnou množinu proměnných V (např. X, Y, Z, Cislo), konečnou neprázdnou množinu predikátů P (např. muz/1, zena/1, jepotomek/2, natural/1, leq/2) a konečnou množinu funktorů F (např. s/1). U každého predikátu a funktoru se obvykle uvádí i jeho arita.
Termy a formule Definice Term jazyka L definujeme následovně: Každá proměnná v V je term. Každý atom a A je term. Jsou-li t 1,..., t n termy, pak pro libovolný funktor f F je f (t 1,..., t n ) term. Příklady: X, honza, 0, s(s(0)), s(s(s(s(cislo)))) Definice Jsou-li t 1,..., t n termy jazyka L, pak pro libovolný predikát p P je p(t 1,..., t n ) atomická formule. Příklady: muz(honza), zena(jirka), leq(s(0),0)
Logický program Definice Faktem nazýváme libovolnou atomickou formuli A 0. Příklady: muz(jirka), jedite(vilik,monika) Definice Pravidlem rozumíme libovolný výraz ve tvaru A 0 A 1, A 2,..., A n, kde A 0,..., A n jsou atomické formule. Příklad: jepotomek(x,y) :- jedite(x,y). Definice Cíl je libovolný výraz ve tvaru A 1, A 2,..., A n, kde A 1,..., A n jsou atomické formule. Příklad: jedite(x,monika), muz(x)
Příklad výpočtu 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í řešení: K tomu, abychom stanovili odpověd na jesyn(x, monika). stačí stanovit odpověd na jedite(x,monika), muz(x), což pro X = vilik dostáváme ihned z databáze faktů. Pro žádnou další hodnotu X to již neplyne.
1 Principy logického programování 2 3
Substituce Principy logického programování Definice Necht X 1,..., X n jsou proměnné a t 1,..., t n jsou takové termy, že platí 1 X i t i (i = 1,..., n), 2 X i X j (i j). Pak množinu Θ = {X 1 /t 1,..., X n /t n } nazveme substituce. Použití substituce Θ na term (formuli, fakt, pravidlo, cíl) A je term (formule, fakt, pravidlo, cíl) AΘ, který vznikne z A náhradou všech výskytů proměnných X i v A odpovídajícími termy t i. Příklad: Θ = {X/vilik, Y /Z, Z /jana}, A = jedite(x, Y ), muz(z ), muz(vilik), AΘ = jedite(vilik, Z ), muz(jana), muz(vilik).
Skládání substitucí Definice Necht Θ a σ jsou substituce ve tvaru Θ = {X 1 /s 1,..., X m /s m } a σ = {Y 1 /t 1,..., Y n /t n }. Pak složená substituce Θσ je ve tvaru {X 1 /(s 1 σ),..., X n /(s m σ), Y 1 /t 1,..., Y n /t n }, ve které navíc vynecháme všechny: 1 prvky X i /(s i σ), pro které X i = s i σ, 2 prvky Y j /t j, pro které Y j {X 1,..., X n }. Příklad: Θ = {X/s(Z ), Y /W } a σ = {X/0, Z /0, W /Y } Vytvoříme {X/s(0), Y /Y, X/0, Z /0, W /Y }, ze které následně odebereme Y /Y a X/0. Θσ = {X/s(0), Z /0, W /Y }.
Nejobecnější unifikátor algoritmus Vstup: atomické formule φ a ψ Výstup: substituce Θ, pro kterou φθ = ψθ a Θ je nejobecnější (nejjednodušší) možná, nebo odpověd nelze unifikovat 1 Položme E = { φ, ψ }. 2 Vyber libovolný prvek s, t E. Pokud s = f (s 1,..., s n ) a t = f (t 1,..., t n ), nahrad s, t v E dvojicemi s 1, t 1,..., s n, t n a opakuj bod 2. Pokud s = f (s 1,..., s m ) a t = g(t 1,..., t n ), kde f g, pak ukonči výpočet s výstupem nelze unifikovat. Pokud s = t, vyjmi s, t z E a opakuj bod 2. Pokud t = X a s není proměnná, nahrad s, X v E dvojicí X, s a opakuj bod 2. Pokud s = X, t X a proměnná X má v E více výskytů, pak pokud se X vyskytuje v t, odpověz 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}.
Nejobecnější unifikátor příklad Příklad Nalezněte nejobecnější 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 )}
Deterministický algoritmus Vstup: logický program a cíl Výstup: odpověd No nebo odpověd Yes spolu se substitucí 1 Vyber první podcíl v aktuálním cíli. Pokud je aktuální cíl prázdný pokračuj bodem 3. 2 Procházej od začátku program. Pokud je první podcíl unifikovatelný pomocí Θ s hlavou některého pravidla, přepiš jej v aktuálním cíli tělem tohoto pravidla a na celý aktuální cíl použij Θ. Pokračuj bodem 1. Pokud je první podcíl unifikovatelný pomocí Θ s faktem, odstraň jej z cíle a použij Θ na cíl. Pokračuj bodem 1. Pokud první podcíl není s ničím unifikovatelný, vrátíme se k předchozímu cíli a zkusíme použít jiné pravidlo/fakt. Pokud první podcíl není s ničím unifikovatelný a již se nelze vrátit k předchozímu cíli, končí výpočet odpovědí No. 3 Odpověz Yes a substitucí vzniklou složením použitých substitucí, ze které odstraníme X j /t j, pokud X j není v cíli.
Literatura Principy logického programování J. W. Lloyd: Foundations of logic programming. Springer, 1987. J. Hynek, P. Mikulecký: a Prolog, Gaudeamus, 2003. V. Vychodil: Prezentace k předmětu Paradigmata programování IV, 2005. SWI-Prolog, dostupné na adrese http://www.swi-prolog.org/. Tato prezentace a implementace did-prolog je dostupná na adrese http://www.inf.upol.cz/ v části Přednášky pro střední školy.