IB013 Logické programování I Hana Rudová jaro 2011 Hodnocení předmětu JS> ZápoCtový projekt: celkem až 40 bodů JS> Průběžná písemná přáce: až 30 bodů (základy programování v Prologů) S> pro každého jediný termín: 22.března -i- alternativní termín poůze v prípadech závažných důvodů pro neúCast -fc vzor písemky na webů predmetů JS> ZáveřeCná písemná přáce: až 150 bodů a vzor písemky na webů predmetů opravný termín možný jako ústní zkoůška JS> Hodnocení: soůCet bodů za projekt a za obe písemky známka A za cca 175 bodů, známka F za cca 110 bodů -i- známka bůde zapsána poůze tem, kterí dostanoů zápocet za projekt Hana Růdová, Logické programování I, 13. kvetna 2011 2 Organizace predmetů Základní informace & Prednáška: úcast není povinná nicméně ... -í* CviCení: úCast povinná, zápoCet udělen za zápoCtový projekt individuální dopinující príklady za zmeškaná cviCení Web predmetu: interaktivní osnova v ISu J* prUsvitky dostupné postupne v průbehu semestru harmonogram výuky, predbežný obsah výuky pro jednotlivé prednášky behem semestru J* elektronicky dostupné materiály -i- informace o zápoctových projektech JS> Obsah prednášky ± základy programování v jazyce Prolog a teorie logického programováni & logické programování s omezujícími podmínkami a implementace logického programováni Hana Rudová, Logické programování I, 13. kvetna 2011 3 Organizace predmetu Literatura ü> Bratko, I. Prolog Programming for Artificial Intelligence. Addison-Wesley, 2001. it prezenčne v knihovne ü> Clocksin, W. F. - Mellish, Ch. S. Programming in Prolog. Springer, 1994. JS> Sterling, L. - Shapiro, E. Y. The art of Prolog : advanced programming techniques. MIT Press, 1987. ü> Merode, A. - Shore, R. A. Logic for applications. Springer-Verlag, 1993. it prezencne v knihovne JS> Dechter, R. Constraint Processing. Morgan Kaufmann Publishers, 2003. -i. prezencne v knihovne + Elektronicky dostupné materiály (viz web predmetu) Hana Rudová, Logické programování I, 13. kvetna 2011 4 Organizace predmetu Software: SICStus Prolog C Doporučovaná implementace Prologu & Dokumentace: http://www.fi.muni.cz/~hanka/sicstus/doc/html JS> Komerční produkt Zakoupena licence pro instalace na domácí počítače studentů C Nové IDE pro SICStus Prolog SPIDER & dostupné až s poslední verzí SICStus 4.1.3 http://www.sics.se/sicstus/spider a používá Eclipse SDK $ Podrobné informace dostupné pres web predmetu a stažení SICStus Prologu (sw + licencní klíce) a pokyny k instalaci (SICStus Prolog, Eclipse, Spider) Hana Rudová, Logické programování I, 13. kvetna 2011 5 Organizace predmetu SICStus IDE SPIDER Hana Rudová, Logické programování I, 13. května 2011 převzato z http://www.sics.se/sicstus/spider Organizace predmetu 6 Cvičení Zaměřeno na praktické aspekty, u počítačů Skupiny: * skupina 01, sudý pátek, první cvičení 25.února s skupina 02, lichý pátek, první cvičení 4.brezna & zápis do skupin: dnes od 17:00 Zápoctové projekty: Adriana Strejčkova -fc zápoctové projekty dostupné pres web predmetu &> zahájení registrace rešitelů projektu: 9. brezna, 19:00 a predbežná analýza rešeného problému: 13. dubna J* termín pro odevzdání projektu: 20. kvetna &> predvádení projektu (po registraci): 25.kvetna - 17.června Hana Rudová, Logické programování I, 13. kvetna 2011 7 Organizace predmetu Zápočtové projekty Projekty JS> týmová práce na projektech, až 3 řešitelé Ip a clp projekty podrobné pokyny k zápoCtovým projektům na webu predmetu & bodování, obsah predbežné zprávy a projektu Predbežná zpráva C- podrobné zadání & v jakém rozsahu chcete úlohu rešit -i* které vstupní informace bude program používat a co bude výstupem programu & scénáre použití programu (tj. ukázky dvojic konkrétních vstupu a výstupů) Hana Rudová, Logické programování I, 13. kvetna 2011 8 Organizace predmetu Průběžná písemná práce M Pro každého jediný termín 22.brezna ii> Alternativní termín pouze v závažných důvodech pro neúčast JS> Celkem až 30 bodů (150 záverečná písemka, 40 projekt) Hana Rudová, Logické programování I, 13. kvetna 2011 9 Organizace predmetu Průběžná písemná práce Pro každého jediný termín 22.brezna Alternativní termín pouze v závažných důvodech pro neúčast Celkem až 30 bodů (150 záverečná písemka, 40 projekt) 3 príklady, 40 minut Napsat zadaný predikát, porovnat chování programů Obsah: první čtyri prednášky a první dve cvičení Oblasti, kterých se budou príklady zejména týkat s* unifikace seznamy backtracking & optimalizace posledního volání & rez aritmetika iS> Ukázka průbežné písemné práce na webů Hana Růdová, Logické programování I, 13. kvetna 2011 9 Organizace predmetů Úvod do Prologu Prolog -í* PROgramming in LOGic a cást predikátové logiky prvního rádu -í* Deklarativní programování -i- specifikacní jazyk, jasná sémantika, nevhodné pro procedurální postupy -fc Co delat namísto Jak delat -i* Základní mechanismy J* unifikace, stromové datové struktury, automatický backtracking Hana Rudová, Logické programování I, 13. kvetna 2011 11 Úvod do Prologu Logické programování Historie C- Rozvoj začíná po roce 1970 & Robert Kowalski - teoretické základy & Alain Colmerauer, David Warren (Warren Abstract Machine) - implementace & SICStus Prolog vyvíjen od roku 1985 -í* Logické programování s omezujícími podmínkami - od poloviny 80. let Aplikace & rozpoznávání reci, telekomunikace, biotechnologie, logistika, plánování, data mining, business rules, ... SICStus Prolog —the first 25 years, Mats Carlsson, Per Mildner. To appear in Theory and Practice of Logic Programming, 2010. http://arxiv.org/abs/1011.5640. Hana Rudová, Logické programování I, 13. kvetna 2011 12 Úvod do Prologu Program = fakta + pravidla (Prologovský) program je seznam programových klauzulí i> programové klauzule: fakt, pravidlo Fakt: deklaruje vždy pravdivé veci -fc clovek( novak, 18, student ). Pravidlo: deklaruje veci, jejichž pravdivost závisí na daných podmínkách J* studuje( X ) :- clovek( X, _Vek, student ). A alternativní (obousměrný) význam pravidel pro každé X, pro každé X, X studuje, jestliže X je student, potom X je student X studuje -4» pracuje( X ) :- clovek( X, _Vek, CoDela ), prace( CoDela ). Hana Rudová, Logické programování I, 13. kvetna 2011 13 Úvod do Prologu Program = fakta + pravidla JS> (Prologovský) program je seznam programových klauzulí i> programové klauzule: fakt, pravidlo & Fakt: deklaruje vždy pravdivé veci -fc clovek( novak, 18, student ). & Pravidlo: deklaruje veci, jejichž pravdivost závisí na daných podmínkách J* studuje( X ) clovek( X, _Vek, student ). A alternativní (obousmerný) význam pravidel pro každé X, pro každé X, X studuje, jestliže Xje student, potom X je student X studuje -4» pracuje( X ) clovek( X, _Vek, CoDela ), prace( CoDela ). JS> Predikát: seznam pravidel a faktu se stejným funktorem a aritou S> znacíme: clovek/3, student/1; analogie procedury v procedurálních jazycích, Hana Rudová, Logické programování I, 13. kvetna 2011 13 Úvod do Prologu Komentáře k syntaxi C Klauzule ukončeny tečkou & Základní příklady argumentu -i- konstanty: (tomas, anna) ... začínají malým písmenem i* přomenné X, Y ... začínají velkým písmenem _, _A, _B ... začínají podtržítkem (nezajímá nás vracená hodnota) £ Psaní komentářů clovek( novak, 18, student ). % komentář na konči řádku clovek( novotny, 30, ucitel ). /* komentář */ Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 14 Úvod do Přologu Dotaz Dotaz: uživatel se ptá programu, zda jsou veci pravdivé ?- studuje( novak ). % yes splnitelný dotaz ?- studuje( novotny ). % no nesplnitelný dotaz Odpoveď na dotaz a positivní - dotaz je splnitelný a uspel ± negativní - dotaz je nesplnitelný a neuspel Hana Rudová, Logické programování I, 13. kvetna 2011 15 Úvod do Prologu Dotaz Dotaz: uživatel se ptá programu, zda jsou veci pravdivé ?- studuje( novak ). ?- studuje( novotny ). Odpoveď na dotaz % yes % no positivní - dotaz je splnitelný a uspel negativní - dotaz je nesplnitelný a neuspel splnitelný dotaz nesplnitelný dotaz Promenné jsou behem výpoctu instanciovány (= nahrazeny objekty) ?- clovek( novak, 18, Prace ). Prace = student -í* výsledkem dotazu je instanciace promenných v dotazu A dosud nenainstanciovaná promenná: volná promenná Hana Rudová, Logické programování I, 13. kvetna 2011 15 Úvod do Prologu Dotaz Dotaz: uživatel se ptá programu, zda jsou veci pravdivé ?- studuje( novak ). % yes splnitelný dotaz ?- studuje( novotny ). % no nesplnitelný dotaz Odpoveď na dotaz A positivní - dotaz je splnitelný a uspel ± negativní - dotaz je nesplnitelný a neuspel Promenné jsou behem výpoctu instanciovány (= nahrazeny objekty) ?- clovek( novak, 18, Prace ). Prace = student -k výsledkem dotazu je instanciace promenných v dotazu A dosud nenainstanciovaná promenná: volná promenná Prolog umí generovat více odpovedí pokud existují ?- clovek( novak, Vek, Prace ). % všechna rešení pres ";" Hana Rudová, Logické programování I, 13. kvetna 2011 15 Úvod do Prologu Klauzule = fakt, pravidlo, dotaz Klauzule se skláda z hlavy a tela & Telo je seznam čílů oddelených cárkami, cárka = konjunkce & Fakt: pouze hlava, prázdné telo Jť rodic( pavla, robert ). -í* Pravidlo: hlava i telo upracovany_clovek( X ) clovek( X, _Vek, Prace ), prace( Prace, tezka ). & Dotaz: prázdná hlava, pouze telo J* ?- clovek( novak, Vek, Prace ). ?- rodic( pavla, Dite ), rodic( Dite, Vnuk ). Hana Rudová, Logické programování I, 13. kvetna 2011 16 Úvod do Prologu Rekurzivní pravidla predek( X, Z ) :- rodic( X, Z). % (1) predek( X, Z ) :- rodic( X, Y ), % (2) rodic( Y, Z). Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 17 Úvod do Přologu Rekurzivní pravidla predek( X, Z ) :- rodic( X, Z). % (1) predek( X, Z ) :- rodic( X, Y ), % (2) rodic( Y, Z). predek( X, Z ) :- rodic( X, Y ), % (2') predek( Y, Z). Hana Růdová, Logické programování I, 13. kvetna 2011 17 Úvod do Prologů Príklad: rodokmen rodic( pavla, robert ). rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, anna ). rodic( robert, petr ). rodic( petr, jirka ). pavla \ tomas Rodice \ / robert / \ \ eliska / anna \ petr / jirka Deti predek( X, Z ) rodic( X, Z). % (1) predek( X, Z ) rodic( X, Y ), % (2') predek( Y, Z ). Hana Rudová, Logické programování I, 13. kvetna 2011 18 Úvod do Prologu Výpočet odpovedi na dotaz ?- predek(tomas,robert) rodic( pavla, robert ). rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, anna ). rodic( robert, petr ). rodic( petr, jirka ). predek(tomas,robert) dle (1) yes rodic(tomas,robert) predek( X, Z ) :- rodic( X, Z ). % (1) predek( X, Z ) :- rodic( X, Y ), % (2') predek( Y, Z ). Hana Rudová, Logické programování I, 13. kvetna 2011 19 Úvod do Prologu VýpoCet odpovědi na dotaz ?- predek(tomas, petr) predek(tomas, petr) dle (1) t dle (2') no rodic( tomas, petr) rodic(tomas, Y) predek( Y, petr) rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, petr ). Y=robert dle rodic(tomas, robert) predek( robert, petr) predek( X, Z ) :- rodic( X, Z ). % (1) predek( X, Z ) :- rodic( X, Y ), % (2') predek( Y, Z ). t dle (1) rodic(robert, petr) yes Hana Rudová, Logické programování I, 13. kvetna 2011 20 Úvod do Prologu Odpoved' na dotaz ?- predek(robert, Potomek) rodic( pavla, robert ). rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, anna ). rodic( robert, petr ). rodic( petr, jirka ). pavla \ tomas Rodice \/ robert / \ \ eliska / anna \ petr / / jirka Deti predek( X, Z ) :- rodic( X, Z ). % (1) predek( X, Z ) :- rodic( X, Y ), % (2') predek( Y, Z ). predek(robert,Potomek) --> ??? Hana Růdová, Logické programování I, 13. kvetna 2011 21 Úvod do Prologů Syntaxe a význam Prologovských programů Syntaxe Prologovských programů Typy objektů jsou rozpoznávány podle syntaxe Atom 3 retezce písmen, císel, „_" zacínající malým písmenem: pavel, pavel_novak, x25 a r etezce speciálních znaků: <-->, ====> -i- r etezce v apostrofech: 'Pavel', 'Pavel Novák' JS> Celá a reálná císla: 0, -1056, 0.35 & Promenná -k r etezce písmen, císel, „_" zacínající velkým písmenem nebo „_" 3 anonymní promenná: ma_dite(X) :- rodic( X, _ ). 3 hodnotu anonymní promenné Prolog na dotaz nevrací: ?- rodic( X, _ ) š» lexikální rozsah promenné je pouze jedna klauzule: prvni(X,X,X). prvni(X,X,_). Hana Rudová, Logické programování I, 13. kvetna 2011 23 Syntaxe a význam Prologovských programu Termy M Term - datové objekty v Prologu: datum( 1, kveten, 2003 ) a funktor: datum a argumenty: 1, kveten, 2003 a- arita - pocet argumentů: 3 M Všechny strukturované objekty v Prologu jsou stromy trojuhelnik( bod(4,2), bod(6,4), bod(7,1) ) -í* Hlavní funktor termu - funktor v korenu stromu odpovídající termu -i- trojuhelnikje hlavní funktor v trojuhelnik( bod(4,2), bod(6,4), bod(7,1) ) Hana Rudová, Logické programování I, 13. května 2011 24 Syntaxe a význam Prologovských programu Unifikace Teřmyjsou unifikovatelné, jestliže jsou identičké nebo Jť přomenné v obou teřmečh mohou být instančiovány tak, že teřmyjsou po substituči identičké a datum( D1, M1, 2003 ) = datum( 1, M2, Y2) opeřátoř = D1 =1, M1 = M2, Y2 = 2003 Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 25 Syntaxe a význam Přologovskýčh přogřamu Unifikace Termy jsou unifikovatelné, jestliže jsou identické nebo Jť promenné v obou termech mohou být instanciovány tak, že termyjsou po substituci identické a datum( D1, M1, 2003 ) = datum( 1, M2, Y2) operátor = D1 =1, M1 = M2, Y2 = 2003 & Hledáme nejobecnejší unifikátor (most generál unifier (MGU) jiné instanciace? ... D1 = 1, M1 = 5, Y2 = 2003 ... není MGU ?- datum( D1, M1, 2003 ) = datum( 1, M2, Y2), D1 = M1. Hana Rudová, Logické programování I, 13. kvetna 2011 25 Syntaxe a význam Prologovských programu Unifikace Termy jsou unifikovatelné, jestliže jsou identické nebo promenné v obou termech mohou být instanciovány tak, že termyjsou po substituci identické A datum( D1, M1, ZOOS ) = datum( 1, MZ, YZ) operátor = D1 =1, M1 = MZ, YZ = ZOOS & Hledáme nejobecnejší unifikátor (most general unifier (MGU) A jiné instanciace? ... D1 = 1, M1 = 5, YZ = ZOOS ... není MGU ?- datum( D1, M1, ZOOS ) = datum( 1, MZ, YZ), D1 = M1. -í* Test výskytu (occurs check) ?- X=f(X). x = f(f(f(f(f(f(f(f(f(f(...)))))))))) Hana Rudová, Logické programování I, 13. kvetna 2011 25 Syntaxe a význam Prologovských programu Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JÍ* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JS* výsledná substituce je urcena unifikací argumentů Příklady: k = k ... yes, kl = k2 ... no, Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 26 Syntaxe a význam Přologovskýčh přogřamu Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JS* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JÍ* výsledná substituce je urcena unifikací argumentu Príklady: k = k ... yes, kl = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes Hana Rudová, Logické programování I, 13. kvetna 2011 26 Syntaxe a význam Prologovských programu Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JS* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JÍ* výsledná substituce je urcena unifikací argumentu Príklady: k = k ... yes, kl = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes s(sss(2),B,ss(2)) = s(sss(2),4,ss(2),s(1))... Hana Rudová, Logické programování I, 13. kvetna 2011 26 Syntaxe a význam Prologovských programu Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JÍ* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JS* výsledná substituce je urcena unifikací argumentů Příklady: k = k ... yes, kl = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes s(sss(2),B,ss(2)) = s(sss(2),4,ss(2),s(1))... no Hana Rudová, Logické programování I, 13. kvetna 2011 26 Syntaxe a význam Prologovských programu Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JÍ* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JS* výsledná substituce je urcena unifikací argumentu Příklady: k = k ... yes, kl = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes s(sss(2),B,ss(2)) = s(sss(2),4,ss(2),s(1))... no s(sss(A),4,ss(3)) = s(sss(2),4,ss(A))... Hana Rudová, Logické programování I, 13. kvetna 2011 26 Syntaxe a význam Prologovských programu Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JS* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JÍ* výsledná substituce je urcena unifikací argumentů Príklady: k = k ... yes, k1 = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes s(sss(2),B,ss(2)) = s(sss(2),4,ss(2),s(1))... no s(sss(A),4,ss(3)) = s(sss(2),4,ss(A))... no Hana Rudová, Logické programování I, 13. kvetna 2011 26 Syntaxe a význam Prologovských programu Unifikace Termy S a T jsoů ůnifikovatelné, jestliže 1. S a T jsoů konstanty a tyto konstanty jsoů identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsoů termy JS* S a T mají stejný fůnktor a aritů a M všechny jejich odpovídající argůmenty jsoů ůnifikovatelné JÍ* výsledná sůbstitůce je ůrcena ůnifikací argůmentů Príklady: k = k ... yes, kl = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes s(sss(2),B,ss(2)) = s(sss(2),4,ss(2),s(1))... no s(sss(A),4,ss(3)) = s(sss(2),4,ss(A))... no s(sss(A),4,ss(C)) = s(sss(t(B)),4,ss(A))... Hana Růdová, Logické programování I, 13. kvetna 2011 26 Syntaxe a význam Prologovských programů Unifikace Termy S a T jsou unifikovatelné, jestliže 1. S a T jsou konstanty a tyto konstanty jsou identické; 2. S je promenná a T cokoliv jiného - S je instanciována na T; Tje promenná a S cokoliv jiného - T je instanciována na S 3. S a T jsou termy JÍ* S a T mají stejný funktor a aritu a M všechny jejich odpovídající argumenty jsou unifikovatelné JÍ* výsledná substituce je urcena unifikací argumentů Príklady: k = k ... yes, kl = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes s(sss(2),B,ss(2)) = s(sss(2),4,ss(2),s(1))... no s(sss(A),4,ss(3)) = s(sss(2),4,ss(A))... no s(sss(A),4,ss(C)) = s(sss(t(B)),4,ss(A))... A=t(B),C=t(B)... yes Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 26 Syntaxe a význam Přologovskýčh přogřamu Deklarativní a procedurální význam přogřamu p :- q, r. -í* Deklařativní: Co je výstupem přogřamu? a p je přavdivé, jestliže q a r jsou přavdivé s Z q a r plyne p => význam mají logičké řelače Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 27 Syntaxe a význam Přologovskýčh přogřamu Deklarativní a procedurální význam programů p :- q, r. Deklarativní: Co je výstupem programu? a p je pravdivé, jestliže q a r jsou pravdivé s Z q a r plyne p => význam mají logické relace Procedurální: Jak vypocítáme výstup programu? -fc p vyřešíme tak, že nejprve vyřešíme q a pak r => krome logických relací je významné i poradí cílů a výstup indikátor yes/no urcující, zda byly cíle splneny instanciace promenných v prípade splnení cílů Hana Rudová, Logické programování I, 13. kvetna 2011 27 Syntaxe a význam Prologovských programu Deklarativní význam přogřamu Instance klauzule: přomenné v klauzuli jsou substituovány teřmem ma_dite(X) :- rodic( X, Y ). % klauzule ma_dite(petr) :- rodic( petr, Z ). % instanče klauzule Máme-li přogřam a číl G, pak deklařativní význam říká: číl G je splnitelný přáve tehdy, když číl ?- ma_dite(petr). existuje klauzule C v přogřamu taková, že existuje instanče I klauzule C taková, že hlava I je identičká s G a všečhny číle v tele I jsou přavdivé. Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 28 Syntaxe a význam Přologovskýčh přogřamu Konjunče "," vs. disjunkce ";" čílů Konjunče = nutné splnení všečh čílů p :- q, r. Disjunkče = stací splnení libovolného číle ap:-q;r. p:-q. p r. a priorita stredníku je vyšší: p q, r; s, t, u. p (q, r) ; (s, t, u). p q, r. p s, t, u. Hana Rudová, Logické programování I, 13. kvetna 2011 29 Syntaxe a význam Prologovských programu Poradí klauzulí a čílů (a) a(1). ?- a(1). a(X) :- b(X,Y), a(Y). b(1,1). Hana Rudová, Logické programování I, 13. kvetna 2011 30 Syntaxe a význam Prologovských programu Poradí klauzulí a cílů (a) a(1). ?- a(1). a(X) :- b(X,Y), a(Y). b(1,1). (b) a(X) :- b(X,Y), a(Y). % zmenené poradí klauzulí v programu vzhledem k (a) a(1). b(1,1). Hana Rudová, Logické programování I, 13. kvetna 2011 30 Syntaxe a význam Prologovských programu Poradí klauzulí a cílů (a) a(1). ?- a(1). a(X) :- b(X,Y), a(Y). b(1,1). (b) a(X) :- b(X,Y), a(Y). % zmenené poradí klauzulí v programu vzhledem k (a) a(1). b(1,1). % nenalezení odpovedi: nekonecný cyklus Hana Rudová, Logické programování I, 13. kvetna 2011 30 Syntaxe a význam Prologovských programu Poradí klauzulí a cílu (a) a(1). ?- ad). a(X) :- b(X,Y), a(Y). b(1,1). (b) a(X) :- b(X,Y), a(Y). % zmenené poradí klauzulí v programu vzhledem k (a) a(1). b(1,1). % nenalezení odpovedi: nekonecný cyklus (c) a(X) :- b(X,Y), c(Y). ?- a(X). b(1,1). c(2). c(1). Hana Rudová, Logické programování I, 13. kvetna 2011 30 Syntaxe a význam Prologovských programu Poradí klauzulí a čílů (a) a(1). a(X) :- b(X,Y), a(Y). b(1,1). ?- a(1). (b) a(X) :- b(X,Y), a(Y). % zmenené poradí klauzulí v programu vzhledem k (a) a(1). b(1,1). % nenalezení odpovedi: nekonecný cyklus (c) a(X) :- b(X,Y), c(Y). b(1,1). c(2). c(1). (d) a(X) :- c(Y), b(X,Y). b(1,1). c(2). c(1). ?- a(X). % zmenené poradí cílu v tele klauzule vzhledem k (c) Hana Rudová, Logické programování I, 13. kvetna 2011 30 Syntaxe a význam Prologovských programu Poradí klauzulí a cílů (a) a(1). ?- a(1). a(X) :- b(X,Y), a(Y). b(1,1). (b) a(X) :- b(X,Y), a(Y). % zmenené poradí klauzulí v programu vzhledem k (a) a(1). b(1,1). % nenalezení odpovedi: nekonecný cyklus (c) a(X) :- b(X,Y), c(Y). ?- a(X). b(1,1). c(2). c(1). (d) a(X) :- c(Y), b(X,Y). % zmenené poradí cílu v tele klauzule vzhledem k (c) b(1,1). c(2). c(1). % nárocnejší nalezení první odpovedi než u (c) V obou případech stejný deklarativní ale odlišný procedurální význam Hana Rudová, Logické programování I, 13. kvetna 2011 30 Syntaxe a význam Prologovských programu Pořadí klauzulí a cílů II. (1) a(X) :- c(Y), b(X,Y). (2) b(1,1). (3) c(2). (4) c(1). ?- a(X). a(X) dle (1) c(Y), b(X,Y) dle (3)/^Y=2 dle (4\ Y=1 b(X,2) no b(X,1) dle (2) X=1 yes Hana Růdová, Logické programování I, 13. kvetna 2011 31 Syntaxe a význam Prologovských programů Poradí klauzulí a cílů II. (1) a(X) :- c(Y), b(X,Y). (2) b(1,1). (3) c(2). (4) c(1). Vyzkoušejte si: (1) a(X) :- b(X,X), c(X). (3) a(X) :- b(Y,X), c(X). (4) b(2,2). (5) b(2,1). (6) c(1). ?- a(X). a(X) dle (1) c(Y), b(X,Y) dle (3)/^Y=2 dle (4\ Y=1 b(X,2) no b(X,1) dle (2) X=1 yes Hana Rudová, Logické programování I, 13. kvetna 2011 31 Syntaxe a význam Prologovských programu Operátory, aritmetika Operátory -í* Infixová notace: 2*a + b*c & Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor Hana Rudová, Logické programování I, 13. kvetna 2011 33 Operátory, aritmetika Operátory -í* Infixová notace: 2*a + b*c & Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 M Priorita operátorU: operátor s nejvyšší prioritou je hlavní funktor & Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). -í* Definice operátoru: :- op( 600, xfx, zna ). priorita: 1..1200 Hana Rudová, Logické programování I, 13. kvetna 2011 33 Operátory, aritmetika Operátory JS* Infixová notace: 2*a + b*c -í* Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor & Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). & Definice operátoru: op( 600, xfx, zna ). priorita: 1..1200 J> op( 1100, xfy, ; ). nestrukturované objekty: 0 op( 1000, xfy, , ). p q,r; s,t. p (q,r) ; (s,t). ; má vyšší prioritu než , & op( 1200, xfx, ). má nejvyšší prioritu Hana Rudová, Logické programování I, 13. kvetna 2011 33 Operátory, aritmetika Opeřátořy -í* Infixová notace: 2*a + b*c JS> Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 M Přiořita opeřátořů: operátor s nejvyšší prioritoů je hlavní fůnktor & Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). -í* Definice operátorů: :- op( 600, xfx, zna ). priorita: 1..1200 J> :- op( 1100, xfy, ; ). nestrůktůrované objekty: 0 :- op( 1000, xfy, , ). p :- q,r; s,t. p :- (q,r) ; (s,t). ; má vyšší prioritů než , & :- op( 1200, xfx, :- ). :- má nejvyšší prioritů JS> Definice operátorů není spojena s datovými manipůlacemi (krome speciálních případů) Hana Růdová, Logické programování I, 13. kvetna 2011 33 Operátory, aritmetika Typy operátorů Typy operátoru J* infixové operátory: xfx, xfy, yfx -i- prefixové operátory: fx, fy &> postfixové operátory: xf, yf pr. xfx = yfx pr. fx ?- fy x a y urcují prioritu argumentu J* x reprezentuje argument, jehož priorita musí být striktne menší než u operátoru -i- y reprezentuje argument, jehož priorita je menší nebo rovna operátoru -fc a-b-c odpovídá (a-b)-c a ne a-(b-c): „-" odpovídá yfx správně priorita: 0 priorita: 0 chybně priorita: 500 priorita: 500 Hana Rudová, Logické programování I, 13. kvetna 2011 34 Operátory, aritmetika Aritmetika -i* Preddefinované operátory + , -i *i A ** mocnina, // celoCíselné dělení, mod zbytek po delení J* ?- X = 1 + 2. X = 1 + 2 = odpovídá unifikaci M ?- X is 1 + 2. X = 3 „is" je speciální preddefinovaný operátor, který vynutí evaluaci Hana Rudová, Logické programování I, 13. kvetna 2011 35 Operátory, aritmetika Aritmetika JS* Preddefinované operátory + , -i *i A ** mocnina, // celocíselné dělení, mod zbytek po delení J* ?- X = 1 + 2. X = 1 + 2 = odpovídá unifikaci M ?- X is 1 + 2. X = 3 „is" je speciální preddefinovaný operátor, který vynutí evaluaci porovnej: N = (1+1+1+1+1) N is (1+1+1+1+1) Hana Rudová, Logické programování I, 13. kvetna 2011 35 Operátory, aritmetika Aritmetika & Preddefinované operátory + , -i *i A ** mocnina, // celocíselné dělení, mod zbytek po delení J* ?- X = 1 + 2. X = 1 + 2 = odpovídá unifikaci M ?- X is 1 + 2. X = 3 „is" je speciální preddefinovaný operátor, který vynutí evaluaci porovnej: N = (1+1+1+1+1) N is (1+1+1+1+1) a pravá strana musí být vyhodnotitelný výraz (bez promenné) volání ?- X is Y + 1. způsobí chybu Hana Rudová, Logické programování I, 13. kvetna 2011 35 Operátory, aritmetika Aritmetika -i* Preddefinované operátory + , -i *i A ** mocnina, // celočíselné delení, mod zbytek po delení J* ?- X = 1 + 2. X = 1 + 2 = odpovídá unifikaci M ?- X is 1 + 2. X = 3 „is" je speciální preddefinovaný operátor, který vynutí evaluaci porovnej: N = (1+1+1+1+1) N is (1+1+1+1+1) a pravá strana musí být vyhodnotitelný výraz (bez promenné) volání ?- X is Y + 1. zpusobí chybu JS> Další speciální preddefinované operátory >, <, >=, =<, =:= aritmetická rovnost, =\= aritmetická nerovnost -i- porovnej: 1+2 =:= 2+1 1+2 = 2+1 Hana Rudová, Logické programování I, 13. kvetna 2011 35 Operátory, aritmetika Ařitmetika JS* Předdefinované opeřátořy + , -i *i A ** močnina, // celocíselné dělení, mod zbytek po delení J* ?- X = 1 + 2. X = 1 + 2 = odpovídá unifikači M ?- X is 1 + 2. X = 3 „is" je speciální předdefinovaný opeřátoř, kteřý vynutí evaluači Jt pořovnej: N = (1+1+1+1+1) N is (1+1+1+1+1) Jt přavá střana musí být vyhodnotitelný výřaz (bez přomenné) volání ?- X is Y + 1. zpusobí čhybu -i* Další spečiální předdefinované opeřátořy >, <, >=, =<, =:= ařitmetická řovnost, =\= ařitmetická neřovnost -i- pořovnej: 1+2 =:= 2+1 1+2 = 2+1 Jt obe střany musí být vyhodnotitelný výřaz: volání ?- 1 < A + 2. zpusobí čhybu Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 35 Opeřátořy, ařitmetika Různé typy rovností a porovnání X = Y Xa Y jsou unifikovatelné X \= Y Xa Y nejsou unifikovatelné, (také \+ X = Y) Hana Rudová, Logické programování I, 13. kvetna 2011 36 Operátory, aritmetika Různé typy rovností a porovnání X = Y Xa Y jsou unifikovatelné X \= Y Xa Y nejsou unifikovatelné, (také \+ X = Y) X == Y Xa Y jsou identické porovnej: ?-A == B. ... no ?-A=B, A==B. Hana Rudová, Logické programování I, 13. kvetna 2011 36 Operátory, aritmetika Různé typy rovností a porovnání X = Y X \= Y X == Y X \== Y X a Y jsou unifikovatelné X a Y nejsou unifikovatelné, (také \+ X = Y) X a Y jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X a Y nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no Hana Rudová, Logické programování I, 13. kvetna 2011 36 Operátory, aritmetika Různé typy rovností a porovnání X=Y X \= Y X == Y X \== Y X is Y X =:= Y X =\= Y X < Y X a Y jsou unifikovatelné X a Y nejsou unifikovatelné, (také \+ X = Y) X a Y jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X a Y nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no Y je aritmeticky vyhodnoceno a výsledek je prirazen X X a Y jsou si aritmeticky rovny X a Y si aritmeticky nejsou rovny aritmetická hodnota X je menší než Y (=<, >, >=) Hana Rudová, Logické programování I, 13. kvetna 2011 36 Operátory, aritmetika X = Y X \= Y X == Y X \== Y X is Y X =:= Y X =\ = Y X < Y X @< Y Různé typy rovností a porovnání X a Y jsou unifikovatelné X a Y nejsou unifikovatelné, (také \+ X = Y) X a Y jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X a Y nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no X a Y jsou si aritmeticky rovny X a Y si aritmeticky nejsou rovny aritmetická hodnota X je menší než Y (=<, >, >=) term X predchází term Y (@=<, @>, @>=) 1. porovnání termu: podle alfabetického n. aritmetického usporádání 2. porovnání struktur: podle arity, pak hlavního funktoru a pak zleva podle argumentu Hana Rudová, Logické programování I, 13. kvetna 2011 36 Operátory, aritmetika Různé typy řovností a porovnání X = Y X \= Y X == Y X \ == Y X is Y X =:= Y X =\ = Y X < Y X @< Y X a Y jsoů ůnifikovatelné X a Y nejsoů ůnifikovatelné, (také \+ X = Y) X a Y jsoů identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X a Y nejsoů identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no Y je aritmeticky vyhodnoceno a výsledek je prirazen X X a Y jsoů si aritmeticky rovny X a Y si aritmeticky nejsoů rovny aritmetická hodnota X je menší než Y (=<, >, >=) term X predchází term Y (@=<, @>, @>=) 1. porovnání termů: podle alfabetického n. aritmetického ůsporádání 2. porovnání strůktůr: podle arity, pak hlavního fůnktorů a pak zleva podle argůmentů ?- f( pavel, g(b)) @< f( pavel, h(a)). ... yes Hana Růdová, Logické programování I, 13. kvetna 2011 36 Operátory, aritmetika Prolog: príklady Příklad: průběh výpočtu a :- b,c,d. b :- e,c,f,g. b :- g,h. c. d. e :- i. e :- h. gh. i. Jak vypadá průběh výpočtu pro dotaz ?- a. Hana Rudová, Logické programování I, 13. května 2011 38 Prolog: p ríklad Príklad: vež z kostek Príklad: postavte vež zadané velikosti ze trí různe velkých kostek tak, že kostka smí ležet pouze na vetší kostce. Hana Rudová, Logické programování I, 13. kvetna 2011 39 Prolog: příklad Príklad: vež z kostek Príklad: postavte vež zadané velikosti ze trí různe velkých kostek tak, že kostka smí ležet pouze na vetší kostce. kostka(mala). kostka(stredni). kostka(velka). vetsi(zeme,velka). vetsi(zeme,stredni). vetsi(zeme,mala). vetsi(velka,stredni). vetsi(velka,mala). vetsi(stredni,mala). % ?- postav_vez(vez(zeme,0), vez(Kostka,0)). % ?- postav_vez(vez(zeme,0), vez(Kostka,3)). Hana Rudová, Logické programování I, 13. kvetna 2011 39 Prolog: p ríklad Príklad: vež z kostek Príklad: postavte vež zadané velikosti ze trí různe velkých kostek tak, že kostka smí ležet pouze na vetší kostce. kostka(mala). kostka(stredni). kostka(velka). vetsi(zeme,velka). vetsi(zeme,stredni). vetsi(zeme,mala). vetsi(velka,stredni). vetsi(velka,mala). vetsi(stredni,mala). % ?- postav_vez(vez(zeme,0), vez(Kostka,0)). % ?- postav_vez(vez(zeme,0), vez(Kostka,3)). postav_vez( Vez, Vez ). postav_vez( Vstup, Vystup ) :- pridej_kostku( Vstup, Pridani ), postav_vez( Pridani, Vystup ). pridej_kostku( Vstup, Pridani ) :- Vstup = vez( Vrchol, Vyska ), kostka( Kostka ), vetsi( Vrchol, Kostka ), NovaVyska is Vyska + 1, Pridani = vez( Kostka, NovaVyska ). Hana Rudová, Logické programování I, 13. kvetna 2011 39 Prolog: příklad Řez, negace Řez a upnutí f(X,0) :- X < 3 . f(X,2) :- 3 =< X, X < 6 . f(X,4) :- 6 =< X. pndání opeřátořu řezu ,,!'' y 4 2 ?- f(1,Y), Y>2. j— J_L -© J_L 3 6 x Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 41 Řez, negače Rez a upnutí f(X,0) :- X < 3, I. f(X,2) :- 3 =< X, X < 6, I. f(X,4) :- 6 =< X. přidání operátoru rezu ,,!'' y 4 2 J- J_L -© J_L 3 6 x ?- f(1,Y), Y>2. & Upnutí: po splnení podcílu pred rezem se už další klauzule neuvažují Hana Rudová, Logické programování I, 13. kvetna 2011 41 Rez, negace Rez a upnutí f(X,0) :- X < 3, I. f(X,2) :- 3 =< X, X < 6, I. f(X,4) :- 6 =< X. přidání operátoru rezu ,,!'' y 4 2 J- J_L -© ?- f(1,Y), Y>2. f(X,0) :- X < 3, I. f(X,2) :- X < 6, I. %(2) f(X,4). J_L 3 6 x & Upnutí: po splnení podcílu pred rezem se už další klauzule neuvažují Hana Rudová, Logické programování I, 13. kvetna 2011 41 Rez, negace Rez a upnutí f(X,0) :- X < 3, I. f(X,2) :- 3 =< X, X < 6, I. f(X,4) :- 6 =< X. přidání operátoru rezu ,,!'' y 4 2 J- J_L -© J_L 3 6 x ?- f(1,Y), Y>2. f(X,0) :- X < 3, I. f(X,2) :- X < 6, I. %(2) f(X,4). ?- f(1,Y). Smazání rezu v (1) a (2) zmení chování programu & Upnutí: po splnení podcílu pred rezem se už další klauzule neuvažují Hana Rudová, Logické programování I, 13. kvetna 2011 41 Rez, negace Řez a ořezání f(X,Y) :- s(X,Y). s(X,Y) :- Y is X + 1. s(X,Y) :- Y is X + 2. ?- f(1,Z). Hana Rudová, Logické programování I, 13. kvetna 2011 42 Rez, negace Rez a orezání f(X,Y) :- s(X,Y). s(X,Y) :- Y is X + 1. s(X,Y) :- Y is X + 2. ?- f(1,Z). Z = 2 ? ; Z = 3 ? ; no Hana Rudová, Logické programování I, 13. kvetna 2011 42 Rez, negace Řez a orezání f(X,Y) :- s(X,Y). s(X,Y) :- Y is X + 1. s(X,Y) :- Y is X + 2. f(X,Y) :- s(X,Y), I. s(X,Y) :- Y is X + 1. s(X,Y) :- Y is X + 2. ?- f(1,Z). ?- f(1,Z). Z = 2 ? ; Z = 3 ? ; no Orezání: po splnení podcílu pred rezem se už neuvažuje další možné splnení techto podcílu Hana Rudová, Logické programování I, 13. kvetna 2011 42 Rez, negace Rez a ořezání f(X,Y) :- s(X,Y). s(X,Y) :- Y is X + 1. s(X,Y) :- Y is X + 2. f(X,Y) :- s(X,Y), I. s(X,Y) :- Y is X + 1. s(X,Y) :- Y is X + 2. ?- f(1,Z). Z = 2 ? ; Z = 3 ? ; no ?- f(1,Z). Z=2?; no Ořezání: po splnení podcílů pred rezem se ůž neůvažůje další možné splnení techto podcílů Smazání rezů zmení chování programů Hana Růdová, Logické programování I, 13. kvetna 2011 42 Rez, negace Chování operátoru řezu Předpokládejme, že klauzule H :- T1, T2, Tm, I, ...Tn. je aktivována voláním cíle G, který je unifikovatelný s H. G=h(X,Y) V momente, kdy je nalezen řez, existuje řešení cílU T1, ..., Tm X=1,Y=1 Ořezání: při provádení řezu se už další možné splnení cílU T1, ..., Tm nehledá a všechny ostatní alternativy jsou odstřaneny Upnutí: dále už nevyvolávám další klauzule, jejichž hlava je také unifikovatelná s G Y=2 X=2 ?- h(X,Y). h(1,Y) :- t1(Y), I. h(2,Y) :- a. t1(1) :- b. t1(2) :- c. h(X,Y) X=1 / \ X=2 t1(Y) a (vynechej: upnutí) Y=1 / \ Y=2 b c (vynechej: o řezání) / Hana Rudová, Logické přogřamování I, 13. kvetna 2011 43 Rez, negace Řez: návřat na řodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), !, e(X). (4) h(2,Y) :- a. (5) t1(1) :- b. (6) t1(2) :- c. (7) b :- c. (8) b :- d. (9) d. (10) e(1) . (11) e(2). -í* Po zpřačování klauzule s řezem se vřačím až na řodiče této klauzule, tj. a(X) Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 44 Rez, negače Řez: príklad c(X) :- p(X). c(X) :- v(X). p(1). p(2). v(2). ?- c(2). Hana Rudová, Logické programování I, 13. kvetna 2011 45 Rez, negace c(X) :- p(X). cCX) :- v(X). Řez: príklad p(1). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c(X). Hana Rudová, Logické programování I, 13. května 2011 45 Rez, negace Řez: příklad c(X) :- p(X). c(X) :- v(X). p(1). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c(X). X = 1 ? ; %p(1) X = 2 ? ; %p(2) X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 13. května 2011 45 Řez, negace Řez: příklad c(X) :- p(X). c1(X) :- p(X), I. c(X) :- v(X). c1(X) :- v(X). p(1). p(2). v(2). ?- c(2). ?- c1(2). true ? ; %p(2) true ? ; %v(2) no ?- c(X). X = 1 ? ; %p(1) X = 2 ? ; %p(2) X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 13. května 2011 45 Řez, negace Řez: příklad c(X) :- p(X). c1(X) :- p(X), I. c(X) :- v(X). c1(X) :- v(X). p(1). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c1(2). true ? ; %p(2) no ?- c(X). ?- c1(X). X = 1 ? ; %p(1) X = 2 ? ; %p(2) X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 13. května 2011 45 Řez, negace Řez: příklad c(X) :- p(X). c1(X) :- p(X), I. c(X) :- v(X). c1(X) :- v(X). p(1). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c1(2). true ? ; %p(2) no ?- c(X). X = 1 ? ; %p(1) X = 2 ? ; %p(2) X = 2 ? ; %v(2) no ?- c1(X). X = 1 ? ; %p(1) no Hana Rudová, Logické programování I, 13. května 2011 45 Rez, negace Řez: cvicení 1. Porovnejte chování uvedených programu pro zadané dotazy. a(X,X) :- b(X). a(X,Y) :- Y is X+1. b(X) :- X > 10. ?- a(X,Y). ?- a(1,Y). ?- a(11,Y). a(X,X) :- b(X),I. a(X,Y) :- Y is X+1. b(X) :- X > 10. a(X,X) :- b(X),c. a(X,Y) :- Y is X+1. b(X) :- X > 10. c ■- I 2. Napište predikát pro výpocet maxima max( X, Y, Max ) Hana Rudová, Logické programování I, 13. kvetna 2011 46 Řez, negace Typy rezu Zlepšení efektivity programu: urcíme, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X ocekávám císlo Zelený rez: odstraní pouze neúspešná odvození f(X,1) :- X >= 0, !. f(X,-1) :- X < 0. Hana Rudová, Logické programování I, 13. kvetna 2011 47 Rez, negace Typy rezu Zlepšení efektivity programu: urcíme, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X ocekávám císlo Zelený rez: odstraní pouze neúspešná odvození f(X,1) :- X >= 0, !. f(X,-1) :- X < 0. bez rezu zkouším pro nezáporná císla 2. klauzuli Hana Rudová, Logické programování I, 13. kvetna 2011 47 Rez, negace Typy řezu Zlepšení efektivity přogřamu: uřame, kteřé alternativy nemá smysl zkoušet Poznámka: na vstupu přo X ocekávám císlo Zelený řez: odstřaní pouze neúspešná odvození f(X,1) :- X >= 0, I. f(X,-1) :- X < 0. bez řezu zkouším přo nezápořná císla 2. klauzuli Modrý řez: odstřaní ředundantní ř ešení f(X,1) :- X >= 0, I. f(0,1). f(X,-1) :- X < 0. Hana Rudová, Logické přogřamování I, 13. kvetna 2011 47 Rez, negace Typy rezu Zlepšení efektivity programu: urame, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X ocekávám císlo Zelený rez: odstraní pouze neúspešná odvození f(X,1) :- X >= 0, I. f(X,-1) :- X < 0. bez rezu zkouším pro nezáporná císla 2. klauzuli Modrý rez: odstraní redundantní r ešení f(X,1) :- X >= 0, I. f(0,1). f(X,-1) :- X < 0. bez rezu vrací f(0,1) 2x Hana Rudová, Logické programování I, 13. kvetna 2011 47 Rez, negace Typy rezu Zlepšení efektivity programu: urcíme, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X ocekávám císlo Zelený rez: odstraní pouze neúspešná odvození f(X,1) :- X >= 0, I. f(X,-1) :- X < 0. bez rezu zkouším pro nezáporná císla 2. klauzuli Modrý rez: odstraní redundantní r ešení f(X,1) :- X >= 0, I. f(0,1). f(X,-1) :- X < 0. bez rezu vrací f(0,1) 2x Červený rez: odstraní úspešná rešení f(X,1) :- X >= 0, I. f(_X,-1). Hana Rudová, Logické programování I, 1S. kvetna 2011 47 Rez, negace Typy rezu Zlepšení efektivity programu: urcíme, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X ocekávám císlo Zelený rez: odstraní pouze neúspešná odvození f(X,1) :- X >= 0, I. f(X,-1) :- X < 0. bez rezu zkouším pro nezáporná císla 2. klauzuli Modrý rez: odstraní redundantní r ešení f(X,1) :- X >= 0, I. f(0,1). f(X,-1) :- X < 0. bez rezu vrací f(0,1) 2x Červený rez: odstraní úspešná rešení f(X,1) :- X >= 0, I. f(_X,-1). bez r ezu uspeje 2. klauzule pro nezáporná císla Hana Rudová, Logické programování I, 1S. kvetna 2O11 47 Rez, negace Negace jako neúspech Speciální cíl pro nepravdu (neúspěch) fail a pravdu true JS> X a Y nejsou unifikovatelné: different(X, Y) C different( X, Y ) :- X = Y, I, fail. different( _X, _Y ). JS* Xje muž: muz(X) muz( X ) :- zena( X ), I, fail. muz( _X ). Hana Rudová, Logické programování I, 13. kvetna 2011 48 Řez, negace Negace jako neúspech: opeřátoř \+ different(X,Y) :-X=Y, I, fail. muz(X) :-zena(X), I, fail. different(_X,_Y). muz(_X). Unární operátor \+ P & jestliže P uspeje, potom \+ P neuspeje \+(P) :- P, I, fail. it v opaCném prípade \+ P uspeje \+(_). Hana Rudová, Logické programování I, 13. kvetna 2011 49 Rez, negace Negace jako neúspech: operátor \+ M different(X,Y) :- X = Y, !, fail. muz(X) :- zena(X), !, fail. different(_X,_Y). muz(_X). JS> Unární operátor \+ P J* jestliže P uspeje, potom \+ P neuspeje \+(P) :- P, !, fail. a v opacném prípade \+ P uspeje \+(_). Ji* different( X, Y ) :- \+ X=Y. JS> muz( X ) :- \+ zena( X ). & Pozor: takto definovaná negace \+P vyžaduje koneCné odvození P Hana Rudová, Logické programování I, 13. kvetna 2011 49 Rez, negace Negace a promenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobře( bmw ). % (2) dřahe( bmw ). % (3) řozumne( Auto ) :- % (4) \+ dřahe( Auto ). Hana Rudová, Logické programování I, 13. kvetna 2011 50 Rez, negace Negace a promenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- dobre( X ), rozumne( X ). Hana Rudová, Logické programování I, 13. kvetna 2011 50 Rez, negace Negace a přomenne \+(P) :- P' !' fai1- % (I) dobre(X),rozumne(X) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- dobre( X ), rozumne( X ). Hana Rudová, Logické přogřamování I, 13. kvetna 2011 50 Rez, negace Negace a promenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % O) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ľ- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle (1), X/citroen rozumne(citroen) Hana Rudová, Logické programování I, 1S. kvetna 2011 50 Rez, negace Negace a promenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle (1), X/citroen rozumne(citroen) dle (4) \+ drahe(citroen) Hana Rudová, Logické programování I, 13. kvetna 2011 50 Rez, negace Negace a přomenné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle (1), X/citroen rozumne(citroen) dle (4) \+ drahe(citroen) dle (I) drahe(citroen),!, fail Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 50 Rez, negače Negace a přomenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle (1), X/citroen rozumne(citroen) dle (4) \+ drahe(citroen) dle (I) drahe(citroen),!, fail Hana Růdová, Logické programování I, 13. kvetna 2011 50 no Rez, negace Negace a přomenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). dobre( bmw ). drahe( bmw ). rozumne( Auto ) :-\+ drahe( Auto ). % (1) % (2) % (3) % (4) ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle (1), X/citroen rozumne(citroen) dle (4) \+ drahe(citroen) dle (I) drahe(citroen),!, fail dle (II) yes Hana Rudová, Logické programování I, 13. kvetna 2011 50 no Rez, negace Negace a promenné \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). Hana Rudová, Logické programování I, 13. kvetna 2011 51 Rez, negace Negace a přomenne \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). Hana Rudová, Logické přogřamování I, 13. kvetna 2011 51 Rez, negace Negace a promenné rozumne(X), dobre(X) \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). Hana Rudová, Logické programování I, 13. kvetna 2011 51 Rez, negace Negace \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). přomenné rozumne(X), dobre(X) dle (4) \+ drahe(X), dobre(X) Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 51 Rez, negače \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ) dobre( bmw ) Negace a promenné rozumne(X), dobre(X) drahe( bmw ) rozumne( Auto ) :-\ + drahe( Auto ) % (1) % (2) % (3) % (4) dle (4) \+ drahe(X), dobre(X) dle (I) drahe(X),!,fail,dobre(X) ?- rozumne( X ), dobre( X ). Hana Rudová, Logické programování I, 13. kvetna 2011 51 Rez, negace Negace a \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). promenné rozumne(X), dobre(X) dle (4) \+ drahe(X), dobre(X) dle (I) drahe(X),!,fail,dobre(X) dle (3), X/bmw !, fail, dobre(bmw) Hana Rudová, Logické programování I, 13. kvetna 2011 51 Rez, negace Negace \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). Hana Rudová, Logické programování I, 13. května 2011 51 proměnné rozumne(X), dobre(X) dle (4) \+ drahe(X), dobre(X) dle (I) drahe(X),!,fail,dobre(X) dle (3), X/bmw !, fail, dobre(bmw) fail,dobre(bmw) Rez, negace Negace a \+(P) :- P, I, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). Hana Rudová, Logické přogřamování I, 13. kvetna 2011 přomenne rozumne(X), dobre(X) dle (4) \+ drahe(X), dobre(X) dle (I) drahe(X),!,fail,dobre(X) dle (3), X/bmw !, fail, dobre(bmw) fail,dobre(bmw) no 1 Rez, negace BezpeCný cíl C ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no JS> ?- rozumne( citroen ). yes ?- rozumne( X ). no JS> \+ P je bezpeCný: promenné P jsou v okamžiku volání P instanciovány negaci používáme pouze pro bezpečný cíl P Hana Rudová, Logické programování I, 1S. kvetna 2011 52 Řez, negace Chování negace J& ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no & Negace jako neúspech používá p redpoklad uzav reného sveta pravdivé je pouze to, co je dokazatelné ?- \+ drahe( X ). \+ drahe( X) :- drahe(X),!,fail. \+ drahe(X). z definice \+ plyne: není dokazatelné, že existuje X takové, že drahe( X ) platí tj. pro všechna X platí \+ drahe( X ) Hana Rudová, Logické programování I, 13. kvetna 2011 53 Rez, negace Chování negace -í* ?- \+ dřahe( citroen ). yes ?- \+ drahe( X ). no & Negace jako neúspech používá p redpoklad uzav reného sveta pravdivé je pouze to, co je dokazatelné ?- \+ dřahe( X ). \+ drahe( X) :- drahe(X),!,fail. \+ drahe(X). z definice \+ plyne: není dokazatelné, že existuje X takové, že drahe( X ) platí tj. pro všechna X platí \+ drahe( X ) M ?- drahe( X ). PTÁME SE: existuje X takové, že drahe( X ) platí JS> ALE: pro cíle s negací neplatí existuje X takové, že \+ drahe( X ) Hana Rudová, Logické programování I, 13. kvetna 2011 53 Rez, negace Chování negace J& ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no & Negace jako neúspech používá p redpoklad uzav reného sveta pravdivé je pouze to, co je dokazatelné ?- \+ drahe( X ). \+ drahe(X) :-drahe(X),!,fail. \+ drahe(X). z definice \+ plyne: není dokazatelné, že existuje X takové, že drahe( X ) platí tj. pro všechna X platí \+ drahe( X ) M ?- drahe( X ). PTÁME SE: existuje X takové, že drahe( X ) platí JS> ALE: pro cíle s negací neplatí existuje X takové, že \+ drahe( X ) => negace jako neúspech není ekvivalentní negaci v matematické logice Hana Rudová, Logické programování I, 13. kvetna 2011 53 Rez, negace Predikáty na řízení behu přogřamu I. řez „!" fail: cíl, který vždy neuspěje true: cíl, který vždy uspěje \+ P: negace jako neúspech \+ P :- P, I, fail; true. Hana Rudová, Logické programování I, 13. kvetna 2011 54 Rez, negace Předikáty na řízení behu přogřamu I. řez „!" fail: číl, kteřý vždy neuspeje true: číl, kteřý vždy uspeje \+ P: negače jako neúspečh \+ P :- P, !, fail; true. once(P): vřátí pouze jedno řešení číle P once(P) :- P, !. Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 54 Rez, negače Predikáty na r ízení behu programu I. rez „!" fail: cíl, který vždy neuspeje true: cíl, který vždy uspeje \+ P: negace jako neúspech \+ P :- P, I, fail; true. once(P): vrátí pouze jedno rešení cíle P once(P) :- P, I. Vyjád rení podmínky: P -> Q ; R J* jestliže platí P tak Q (P -> Q ; R) :- P, I, Q. v opacném p r ípade R (P -> Q ; R) :- R. príklad: min(X,Y,Z) :- X =< Y -> Z = X ; Z = Y. Hana Rudová, Logické programování I, 13. kvetna 2011 54 Rez, negace Predikáty na rízení behu programu I. rez „!" fail: cíl, který vždy neuspeje true: cíl, který vždy uspeje \+ P: negace jako neúspech \+ P :- P, I, fail; true. once(P): vrátí pouze jedno rešení cíle P once(P) :- P, I. Vyjadrení podmínky: P -> Q ; R J* jestliže platí P tak Q (P -> Q ; R) :- P, I, Q. v opacném prípade R (P -> Q ; R) :- R. príklad: min(X,Y,Z) :- X =< Y -> Z = X ; Z = Y. P -> Q Hana Rudová, Logické programování I, 13. kvetna 2011 54 Rez, negace Predikáty na řízení behu programu I. M řez „!" & fail: cíl, který vždy neuspeje true: cíl, který vždy uspeje -í* \+ P: negace jako neúspech \+ P :- P, I, fail; true. & once(P): vrátí pouze jedno rešení cíle P once(P) :- P, I. Vyjadrení podmínky: P -> Q ; R J* jestliže platí P tak Q (P -> Q ; R) :- P, I, Q. v opacném prípade R (P -> Q ; R) :- R. príklad: min(X,Y,Z) :- X =< Y -> Z = X ; Z = Y. M P -> Q -i- odpovídá: (P -> Q; fail) S> príklad: zaporne(X) :- number(X) -> X < 0. Hana Rudová, Logické programování I, 13. kvetna 2011 54 Rez, negace Predikáty na ŕízení běhu programu II. call(P): zavolá cíl P a uspeje, pokud uspeje P nekonečná posloupnost backtrackovacích voleb: repeat repeat. repeat :- repeat. Hana Rudová, Logické programování I, 13. kvetna 2011 55 Rez, negace Predikáty na ŕízení běhu programu II. call(P): zavolá cíl P a uspeje, pokud uspeje P nekonečná posloupnost backtrackovacích voleb: repeat repeat. repeat :- repeat. klasické použití: geneřuj akci X, přoved'ji a otestuj, zda neskonCit Hlava :- ... uloz_stav( StaryStav ), repeat, generuj( X ), % deterministické: generuj, provadej, testuj provadej( X ), testuj( X ), I ■ > obnov_stav( StaryStav ), Hana Rudová, Logické programování I, 13. kvetna 2011 55 Rez, negace Seznamy Řepřezentace seznamu -i* Seznam: [a, b, c], přázdný seznam [] Hlava (libovolný objekt), telo (seznam): .(Hlava, Telo) a všečhny střuktuřované objekty střomy - i seznamy ± funktořdva ařgumenty .(a, .(b, .(c, []))) = [a, b, c] i> notače: [ Hlava | Telo ] = [a|Telo] Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 57 Seznamy Reprezentace seznamu -i* Seznam: [a, b, c], prázdný seznam [] & Hlava (libovolný objekt), telo (seznam): .(Hlava, Telo) a všechny strukturované objekty stromy - i seznamy ± funktordva argumenty .(a, .(b, .(c, []))) = [a, b, c] i> notace: [ Hlava | Telo ] = [a|Te1o] Telo je v [a|Te1o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] Hana Rudová, Logické programování I, 13. kvetna 2011 57 Seznamy Reprezentace seznamu -i* Seznam: [a, b, c], prázdný seznam [] & Hlava (libovolný objekt), telo (seznam): .(Hlava, Telo) a všechny strukturované objekty stromy - i seznamy ± funktordva argumenty .(a, .(b, .(c, []))) = [a, b, c] i> notace: [ Hlava | Telo ] = [a|Te1o] Telo je v [a|Te1o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] & Lze psát i: [a,b|Te1o] p r ed T'je libovolný pocet prvků seznamu , za "|"je seznam zbývajících prvků [a,b,c] = [a|[b,c]] = [a,b|[c]] = [a,b,c|[]] Hana Rudová, Logické programování I, 13. kvetna 2011 57 Seznamy Reprezentace seznamu -i* Seznam: [a, b, c], prázdný seznam [] -i* Hlava (libovolný objekt), telo (seznam): .(Hlava, Telo) a všechny strukturované objekty stromy - i seznamy ± funktordva argumenty .(a, .(b, .(c, []))) = [a, b, c] i> notace: [ Hlava | Telo ] = [a|Te1o] Telo je v [a|Te1o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] & Lze psát i: [a,b|Te1o] p r ed T'je libovolný pocet prvků seznamu , za "|"je seznam zbývajících prvků [a,b,c] = [a|[b,c]] = [a,b|[c]] = [a,b,c|[]] pozor: [ [a,b] | [c] ] = [ a,b | [c] ] Hana Rudová, Logické programování I, 13. kvetna 2011 57 Seznamy Řepřezentace seznamu -i* Seznam: [a, b, c], přázdný seznam [] Hlava (libovolný objekt), telo (seznam): .(Hlava, Telo) a všečhny střuktuřované objekty střomy - i seznamy ± funktořdva ařgumenty .(a, .(b, .(c, []))) = [a, b, c] i> notače: [ Hlava | Telo ] = [a|Telo] Telo je v [a|Telo] seznam, tedy píšeme [ a, b, č ] = [ a | [ b, č ] ] & Lze psát i: [a,b|Telo] před "|"je libovolný počet přvků seznamu , za "|"je seznam zbývajíčíčh přvků [a,b,c] = [a|[b,c]] = [a,b|[c]] = [a,b,c|[]] pozoř: [ [a,b] | [c] ] = [ a,b | [c] ] & Seznam jako neúplná datová střuktuřa: [a,b,c|T] Jt Seznam = [a,b,c|T], T = [d,e|S], Seznam = [a,b,c,d,e|S] Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 57 Seznamy Prvek seznamu -í* member( X, S ) C platí: member( b, [a,b,c] ). & neplatí: member( b, [[a,b]|[c]] ). JS> X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Prvek seznamu member(1,[2,1,3,1,4]) -í* member( X, S ) C platí: member( b, [a,b,c] ). & neplatí: member( b, [[a,b]|[c]] ). JS> X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Prvek seznamu member(1,[2,1,3,1,4]) -í* member( X, S ) dle (2) C platí: member( b, [a,b,c] ). & neplatí: member( b, [[a,b]|[c]] ). JS> X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ Telo ] ) :- member(1,[1,3,1,4]) member( X, Telo %(2) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Přvek seznamu member( X S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b]|[c]] ). X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) dle (1) 4 □ yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,1,4]) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Prvek seznamu member( X, S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b]|[c]] ). X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) dle (1) 4 □ yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,1,4]) dle (2) member(1,[1,4]) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Prvek seznamu member( X, S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b]|[c]] ). X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) dle (1) 4 □ yes dle (1) 4 □ yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,1,4]) dle (2) member(1,[1,4]) dle (2) member(1,[4]) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Prvek seznamu member( X, S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b]|[c]] ). X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) dle (1) 4 □ yes dle (1) 4 □ yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,1,4]) dle (2) member(1,[1,4]) dle (2) member(1,[4]) dle (2) member(1,[ ]) Hana Rudová, Logické programování I, 13. kvetna 2011 58 Seznamy Prvek seznamu member( X, S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b]|[c]] ). X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) dle (1) 4 □ yes dle (1) 4 □ yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,1,4]) dle (2) member(1,[1,4]) dle (2) member(1,[4]) dle (2) member(1,[ ]) dle (2) Hana Rudová, Logické programování I, 13. kvetna 2011 58 no Seznamy Prvek seznamu member( X, S ) platí: member( b, [a,b,c] ). neplatí: member( b, [[a,b]|[c]] ). X je prvek seznamu S, když & X je hlava seznamu S nebo member( X, [ X | _ ] ). a X je prvek tela seznamu S member( X, [ _ | Telo ] ) :- member( X, Telo ). %(2) Príklady použití: ± member(1,[2,1,3]). J* member(X,[1,2,3]). dle (1) 4 □ yes dle (1) 4 □ yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,1,4]) dle (2) member(1,[1,4]) dle (2) member(1,[4]) dle (2) member(1,[ ]) dle (2) Hana Rudová, Logické programování I, 13. kvetna 2011 58 no Seznamy Spojení seznamů C append( L1, L2, L3 ) & Platí: append( [a,b], [c,d], [a,b,c,d] ) JS> Neplatí: append( [b,a], [c,d], [a,b,c,d] ), append( [a,[b]], [c,d], [a,b,c,d] ) Hana Rudová, Logické programování I, 13. kvetna 2011 59 Seznamy Spojení seznamů C append( LI, L2, L3 ) & Platí: append( [a,b], [c,d], [a,b,c,d] ) JS> Neplatí: append( [b,a], [c,d], [a,b,c,d] ), append( [a,[b]], [c,d], [a,b,c,d] ) -í* Definice: -i- pokud je 1. argument prázdný seznam, pak 2. a 3. argument jsou stejné seznamy: append( [], S, S ). Hana Rudová, Logické programování I, 13. kvetna 2011 59 Seznamy Spojení seznamů append( L1, L2, L3 ) Platí: append( [a,b], [c,d], [a,b,c,d] ) Neplatí: append( [b,a], [c,d], [a,b,c,d] ), append( [a,[b]], [c,d], [a,b,c,d] ) Definiče: -i- pokud je 1. ařgument přázdný seznam, pak 2. a 3. ařgument jsou stejné seznamy: append( [], S, S ). & pokud je 1. ařgument nepřázdný seznam, pak má 3. ařgument stejnou hlavu jako 1.: append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). X S1 S2 S3 Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 59 Seznamy Príklady použití append append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). Spojení seznamů: append( [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] append( [a, [b,c], d], [a, [], b], S ). S = [a, [b,c], d, a, [], b] ] Hana Rudová, Logické programování I, 13. kvetna 2011 60 Seznamy P ř íklady použití append append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). & Spojení seznamů: append( [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] append( [a, [b,c], d], [a, [], b], S ). S = [a, [b,c], d, a, [], b] ] & Dekompozice seznamu na dva seznamy: append( S1, S2, [a, b ]). S1 = [], S2 = [a,b] ; S1 = [a], S2 = [b] ? ; S1 = [a,b], S2 = [] Hana Rudová, Logické programování I, 13. kvetna 2011 60 Seznamy P r íklady použití append append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). & Spojení seznamů: append( [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] append( [a, [b,c], d], [a, [], b], S ). S = [a, [b,c], d, a, [], b] ] & Dekompozice seznamu na dva seznamy: append( S1, S2, [a, b ]). S1 = [], S2 = [a,b] ; S1 = [a], S2 = [b] ? ; S1 = [a,b], S2 = [] & Vyhledávání v seznamu: append( Pred, [c | Za ], [a,b,c,d,e] ). Pred = [a,b], Za = [d,e] Hana Rudová, Logické programování I, 13. kvetna 2011 60 Seznamy P ř íklady použití append append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). & Spojení seznamů: append( [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] append( [a, [b,c], d], [a, [], b], S ). S = [a, [b,c], d, a, [], b] ] & Dekompozice seznamu na dva seznamy: append( S1, S2, [a, b ]). S1 = [], S2 = [a,b] ; S1 = [a], S2 = [b] ? ; S1 = [a,b], S2 = [] & Vyhledávání v seznamu: append( Pred, [c | Za ], [a,b,c,d,e] ). Pred = [a,b], Za = [d,e] & Předchůdce a následník: append( _, [Pred,c,Za|_], [a,b,c,d,e] ). Pred = b, Za = d Hana Rudová, Logické programování I, 13. kvetna 2011 60 Seznamy Smazání prvku seznamu de1ete( X, S, S1 ) & Seznam S1 odpovídá seznamu S, ve kterém je smazán prvek X a jestliže X je hlava seznamu S, pak výsledkem je telo S de1ete( X, [X|Te1o], Telo). & jestliže X je v tele seznamu, pak X je smazán až v tele de1ete( X, [Y|Te1o], [Y|Te1o1] ) :- de1ete( X, Telo, Te1o1 ). Hana Rudová, Logické programování I, 13. kvetna 2011 61 Seznamy Smazání prvku seznamu delete( X, S, S1 ) & Seznam S1 odpovídá seznamu S, ve kterém je smazán prvek X a jestliže X je hlava seznamu S, pak výsledkem je telo S delete( X, [X|Telo], Telo). & jestliže X je v tele seznamu, pak X je smazán až v tele delete( X, [Y|Telo], [Y|Telo1] ) :- delete( X, Telo, Telo1 ). -í* delete smaže libovolný výskyt prvku pomocí backtrackingu ?- delete(a, [a,b,a,a], S). S = [b,a,a]; S = [a,b,a]; S = [a,b,a] Hana Rudová, Logické programování I, 13. kvetna 2011 61 Seznamy Smazání prvku seznamu delete( X, S, S1 ) & Seznam S1 odpovídá seznamu S, ve kterém je smazán prvek X a jestliže X je hlava seznamu S, pak výsledkem je telo S delete( X, [X|Telo], Telo). & jestliže X je v tele seznamu, pak X je smazán až v tele delete( X, [Y|Telo], [Y|Telo1] ) :- delete( X, Telo, Telo1 ). -í* delete smaže libovolný výskyt prvku pomocí backtrackingu ?- delete(a, [a,b,a,a], S). S = [b,a,a]; S = [a,b,a]; S = [a,b,a] & delete, který smaže pouze první výskyt prvku X ^ delete( X, [X|Telo], Telo) :- I. delete( X, [Y|Telo], [Y|Telo1] ) :- delete( X, Telo, Telo1). Hana Rudová, Logické programování I, 13. kvetna 2011 61 Seznamy Cvicení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). % (2) :- append([1,2],[3,4],A). Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 62 Seznamy Cvicení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). % (2) :- append([1,2],[3,4],A). | (2) | A=[1|B] Hana Rudová, Logické programování I, 13. kvetna 2011 62 Seznamy Cvičení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). % (2) :- append([1,2],[3,4],A). | (2) | A=[1|B] | :- append([2],[3,4],B). Hana Rudová, Logické programování I, 13. kvetna 2011 62 Seznamy Cvičení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). % (2) :- append([1,2],[3,4],A). | (2) | A=[1|B] | :- append([2],[3,4],B). | (2) | B=[2|C] => A=[1,2|C] Hana Rudová, Logické programování I, 13. kvetna 2011 62 Seznamy Cvicení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). % (2) :- append([1,2],[3,4],A). | (2) | A=[1|B] | :- append([2],[3,4],B). | (2) | B=[2|C] => A=[1,2|C] | :- append([],[3,4],C). Hana Rudová, Logické programování I, 13. kvetna 2011 62 Seznamy Cvičení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). % (2) :- append([1,2],[3,4],A). | (2) | A=[1|B] | :- append([2],[3,4],B). | (2) | B=[2|C] => A=[1,2|C] | :- append([],[3,4],C). | (1) | C=[3,4] => A=[1,2,3,4], | yes Hana Rudová, Logické programování I, 13. kvetna 2011 62 Seznamy Optimalizace posledního volání Last Call Optimization (LCO) Implementacní technika snižující nároky na pamet' Mnoho vno rených rekurzivních volání je nárocné na pamet' Použití LCO umožnuje vno r enou rekurzi s konstantními pametovými nároky Typický p r íklad, kdy je možné použití LCO: A procedura musí mít pouze jedno rekurzivní volání: v posledním cíli poslední klauzule A cíle p r edcházející tomuto rekurzivnímu volání musí být deterministické -i> p( ... ) :- ... % žádné rekurzivní volání v tele klauzule p( ...):- ... % žádné rekurzivní volání v tele klauzule p(...) :- !, p( ... ). % rez zajišťuje determinismus & Tento typ rekurze lze p revést na iteraci Hana Rudová, Logické programování I, 13. kvetna 2011 63 Seznamy LCO a akumulátor -í* Reformulace rekurzivní procedury, aby umožnila LCO VýpoCet délky seznamu 1ength( Seznam, Delka ) 1ength( [], 0 ). 1ength( [ H | T ], Delka ) :- 1ength( T, DelkaO ), Delka is 1 + DelkaO. Hana Rudová, Logické programování I, 13. kvetna 2011 64 Seznamy LCO a akumulátor J& Reformulace rekurzivní procedury, aby umožnila LCO & Výpocet délky seznamu 1ength( Seznam, Delka ) 1ength( [], 0 ). 1ength( [ H | T ], Delka ) :- 1ength( T, DelkaO ), Delka is 1 + DelkaO. & Upravená procedura, tak aby umožnila LCO: % 1ength( Seznam, ZapocitanaDe1ka, Ce1kovaDe1ka ): % Ce1kovaDe1ka = ZapocitanaDe1ka + ,,pocet prvků v Seznam'' Hana Rudová, Logické programování I, 13. kvetna 2011 64 Seznamy LCO a akumulátor -í* Reformulace rekurzivní procedury, aby umožnila LCO & Výpocet délky seznamu length( Seznam, Delka ) length( [], 0 ). length( [ H | T ], Delka ) :- length( T, DelkaO ), Delka is 1 + DelkaO. -í* Upravená procedura, tak aby umožnila LCO: % length( Seznam, ZapocitanaDelka, CelkovaDelka ): % CelkovaDelka = ZapocitanaDelka + ,,poCet prvků v Seznam'' length( Seznam, Delka ) :- length( Seznam, 0, Delka ). % pomocný predikát length( [], Delka, Delka ). % celková délka = zapocítaná délka length( [ H | T ], A, Delka ) :- A0 is A + 1, length( T, A0, Delka ). & Prídavný argument se nazývá akumulátor Hana Rudová, Logické programování I, 13. kvetna 2011 64 Seznamy max_list s akumulátorem Výpočet nejvetšího prvku v seznamu max_list(Seznam, Max) max_list([X], X). max_list([X|T], Max) :-max_list(T,MaxT), ( MaxT >= X, !, Max = MaxT Max = X ). Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 65 Seznamy max_1ist s akumulátorem Výpocet nejvetšího prvku v seznamu max_1ist(Seznam, Max) max_1ist([X], X). max_1ist([X|T], Max) :-max_1ist(T,MaxT), ( MaxT >= X, !, Max = MaxT Max = X ). max_1ist([H|T],Max) :- max_1ist(T,H,Max). max_1ist([], Max, Max). max_1ist([H|T], CastecnyMax, Max) :-( H > CastecnyMax, !, max_1ist(T, H, Max ) max_1ist(T, CastecnyMax, Max) ). Hana Rudová, Logické programování I, 13. kvetna 2011 65 Seznamy Akumulátor jako seznam Nalezení seznamu, ve kterém jsou prvky v opacném poradí reverse( Seznam, OpacnySeznam ) -i- reverse( [], [] ). reverse( [ H | T ], Opacny ) :- Hana Rudová, Logické programování I, 13. kvetna 2011 66 Seznamy Akumulátor jako seznam Nalezení seznamu, ve kterém jsou prvky v opacném poradí reverse( Seznam, OpacnySeznam ) -i- reverse( [], [] ). reverse( [ H | T ], Opacny ) :-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). & naivní reverse s kvadratickou složitosti Hana Rudová, Logické programování I, 13. kvetna 2011 66 Seznamy Akumulátoř jako seznam Nalezení seznamu, ve kteřém jsou přvky v opačném pořadí reverse( Seznam, OpacnySeznam ) -i- reverse( [], [] ). reverse( [ H | T ], Opacny ) :-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). & naivní reverse s kvadřatičkou složitosti reverse pomočí akumulátořu s lineářní složitostí -i- % reverse( Seznam, Akumulator, Opacny ): % Opacny obdřžíme přídáním přvků ze Seznam do Akumulator v opačnem pořadi Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 66 Seznamy Akumulátoř jako seznam Nalezení seznamu, ve kterém jsou prvky v opacném poradí reverse( Seznam, OpacnySeznam ) -i- reverse( [], [] ). reverse( [ H | T ], Opacny ) :-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). & naivní reverse s kvadratickou složitosti reverse pomocí akumulátoru s lineární složitostí -i- % reverse( Seznam, Akumulator, Opacny ): % Opacny obdržíme prídáním prvků ze Seznam do Akumulator v opacnem poradi reverse( Seznam, OpacnySeznam ) :- reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). reverse( [ H | T ], A, Opacny ) :- reverse( T, [ H | A ], Opacny ). % pridání H do akumulátoru Hana Rudová, Logické programování I, 13. kvetna 2011 66 Seznamy Akumulátor jako seznam JS> Nalezení seznamu, ve kterém jsou prvky v opacném poradí reverse( Seznam, OpacnySeznam ) -i- reverse( [], [] ). reverse( [ H | T ], Opacny ) :-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). & naivní reverse s kvadratickou složitosti -i* reverse pomocí akumulátoru s lineární složitostí -i- % reverse( Seznam, Akumulator, Opacny ): % Opacny obdržíme prídáním prvků ze Seznam do Akumulator v opacnem poradi reverse( Seznam, OpacnySeznam ) :- reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). reverse( [ H | T ], A, Opacny ) :- reverse( T, [ H | A ], Opacny ). % pridání H do akumulátoru zpetná konstrukce seznamu (srovnej s predchozí doprednou konstrukcí, napr. append) Hana Rudová, Logické programování I, 13. kvetna 2011 66 Seznamy Neefektivita p r i spojování seznamů Sjednocení dvou seznamů append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3 ). Hana Rudová, Logické programování I, 13. kvetna 2011 67 Seznamy Neefektivita pri spojování seznamů Sjednocení dvou seznamů append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3 ). ?- append( [2,3], [1], S ). Hana Rudová, Logické programování I, 13. kvetna 2011 67 Seznamy Neefektivita při spojování seznamů Sjednocení dvou seznamů append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3 ). ?- append( [2,3], [1], S ). postupné volání cílU: append( [2,3], [1], S ) - append( [3], [1], S') - append( [], [1], S'' ) Hana Rudová, Logické programování I, 13. kvetna 2011 67 Seznamy pri spojování seznamů C Sjednocení dvou seznamů & append( [], S, S ). append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3 ). -i* ?- append( [2,3], [1], S ). postupné volání cílu: append( [2,3], [1], S ) - append( [3], [1], S') - append( [], [1], S'' ) C Vždy je nutné projít celý první seznam Hana Rudová, Logické programování I, 13. kvetna 2011 67 Seznamy Rozdílové seznamy Zapamatování konce a připojení na konec: rozdílové seznamy Hana Rudová, Logické programování I, 13. kvetna 2011 68 Seznamy Rozdílové seznamy Zapamatování konče a připojení na koneč: rozdílové seznamy [a,b] = L1-L2 = [a,b|T]-T = [a,b,c|S]-[c|S] = [a,b,c]-[c] Reprezentace prázdného seznamu: L-L Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 68 Seznamy Rozdílové seznamy Zapamatování konce a p r ipojení na konec: rozdílové seznamy [a,b] = L1-L2 = [a,b|T]-T = [a,b,c|S]-[c|S] = [a,b,c]-[c] Reprezentace prázdného seznamu: L-L A1 Z1 A2 Z2 L1 1 \ 1 L2 \ append( A1-Z1, Z1-Z2, A1-Z2 ). L1 L2 L3 L3 Hana Rudová, Logické programování I, 13. kvetna 2011 68 Seznamy Rozdílové seznamy Zapamatování konce a připojení na konec: rozdílové seznamy [a,b] = L1-L2 = [a,b|T]-T = [a,b,c|S]-[c|S] = [a,b,c]-[c] Reprezentace prázdného seznamu: L-L A1 Z1 A2 Z2 L1 1 \ 1 L2 \ append( A1-Z1, Z1-Z2, A1-Z2 ). L1 L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 L3 Hana Rudová, Logické programování I, 13. kvetna 2011 68 Seznamy Rozdílové seznamy Zapamatování konče a připojení na koneč: rozdílové seznamy [a,b] = L1-L2 = [a,b|T]-T = [a,b,c|S]-[c|S] = [a,b,c]-[c] Reprezentače prázdného seznamu: L-L A1 Z1 A2 Z2 L1 1 \ 1 L2 \ L3 append( A1-Z1, Z1-Z2, A1-Z2 ). L1 L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 [2,3|Z1]-Z2 Hana Rudová, Logičké přogřamování I, 13. kvetna 2011 68 Seznamy Rozdílové seznamy Zapamatování konce a připojení na konec: rozdílové seznamy [a,b] = L1-L2 = [a,b|T]-T = [a,b,c|S]-[c|S] = [a,b,c]-[c] Reprezentace prázdného seznamu: L-L A1 Z1 A2 Z2 L1 1 \ 1 L2 \ L3 append( A1-Z1, Z1-Z2, A1-Z2 ). L1 L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 [2,3|Z1]-Z2 [2,3,1|Z2]-Z2 Hana Rudová, Logické programování I, 13. kvetna 2011 68 Seznamy Rozdílové seznamy Zapamatování konce a připojení na konec: rozdílové seznamy [a,b] = L1-L2 = [a,b|T]-T = [a,b,c|S]-[c|S] = [a,b,c]-[c] Reprezentace prázdného seznamu: L-L A1 Z1 A2 Z2 L1 1 \ 1 L2 \ L3 append( A1-Z1, Z1-Z2, A1-Z2 ). L1 L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 [2,3|Z1]-Z2 [2,3,1|Z2]-Z2 ?- append( [2,3|Z1]-Z1, [1|Z2]-Z2, S ). S = A1 - Z2 = [2,3|Z1] - Z2 = [2,3| [1|Z2] ] Z1 = [1|Z2] S = [2,3,1|Z2]-Z2 Z2 & Jednotková složitost, oblíbená technika ale není tak flexibilní Hana Rudová, Logické programování I, 13. kvetna 2011 68 Seznamy Akumulátor vs. rozdílové seznamy: reverse reverse( [], [] ). reverse( [ H I T ], Opacny ) i-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). kvadratická složitost reverse( Seznam, Opacny ) i- reverse0( Seznam, [], Opacny ). reverse0( [], S, S ). reverse0( [ H I T ], A, Opacny ) i- reverse0( T, [ H I A ], Opacny ). akumulátor (lineární) Hana Rudová, Logické programování I, 1S. kvetna 2011 69 Seznamy Akumulátor vs. rozdílové seznamy: reverse reverse( [], [] ). reverse( [ H | T ], Opacny ) :-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). kvadratická složitost reverse( Seznam, Opacny ) :- reverse0( Seznam, [], Opacny ). reverse0( [], S, S ). reverse0( [ H | T ], A, Opacny ) :- reverse0( T, [ H I A ], Opacny ). akumulátor (lineární) reverse( Seznam, Opacny ) :- reverse0( Seznam, Opacny-[]). reverse0( [], S-S ). reverse0( [ H | T ], Opacny-OpacnyKonec ) :- rozdílové seznamy reverse0( T, Opacny-[ H | OpacnyKonec] ). (lineární) Hana Rudová, Logické programování I, 13. kvetna 2011 69 Seznamy Akumulátor vs. rozdílové seznamy: reverse reverse( [], [] ). reverse( [ H | T ], Opacny ) :-reverse( T, OpacnyT ), append( OpacnyT, [ H ], Opacny ). kvadratická složitost reverse( Seznam, Opacny ) :- reverse0( Seznam, [], Opacny ). reverse0( [], S, S ). reverse0( [ H | T ], A, Opacny ) :- reverse0( T, [ H | A ], Opacny ). akumulátor (lineární) reverse( Seznam, Opacny ) :- reverse0( Seznam, Opacny-[]). reverse0( [], S-S ). reverse0( [ H | T ], Opacny-OpacnyKonec ) :- rozdílové seznamy reverse0( T, Opacny-[ H | OpacnyKonec] ). (lineární) Príklad: operace pro manipulaci s frontou J5> test na prázdnost, p r idání na konec, odebrání ze zacátku Hana Rudová, Logické programování I, 13. kvetna 2011 69 Seznamy Vestavené předikáty Vestavené predikáty -í* Predikáty pro rízení behu programu a fai1, true, ... Ruzné typy rovností a unifikace, aritmetická rovnost, ... Databázové operace & zmena programu (programové databáze) za jeho behu -í* Vstup a výstup -i* Všechna r ešení programu JS> Testování typu termu promenná?, konstanta?, struktura?, ... & Konstrukce a dekompozice termu -i- argumenty?, funktor?, ... Hana Rudová, Logické programování I, 13. kvetna 2011 71 Vestavené predikáty Databázové operace Databáze: specifikace množiny relací Prologovský program: programová databáze, kde jsou relace specifikovány explicitne (fakty) i implicitne (pravidly) Vestavené predikáty pro zmenu databáze behem provádení programu: assert( Klauzule ) pridání Klauzule do programu asserta( Klauzule ) pridání na zacátek assertz( Klauzule ) přidání na konec retract( Klauzule ) smazání klauzule unifikovatelné s Klauzule Pozor: nadmerné použití techto operací snižuje srozumitelnost programu Hana Rudová, Logické programování I, 13. kvetna 2011 72 Vestavené predikáty Příklad: databázové operace -í* Caching: odpovedi na dotazy jsou přidány do programové databáze Hana Rudová, Logické programování I, 13. kvetna 2011 73 Vestavené predikáty Příklad: databázové operace Caching: odpovědi na dotazy jsou přidány do programové databáze & ?- so1ve( problem, Solution), asserta( so1ve( problem, Solution) ). J* :- dynamic solve/2. % nezbytné při použití v SICStus Prologu Hana Rudová, Logické programování I, 13. května 2011 73 Vestavěné predikáty Příklad: databázové operace Caching: odpovědi na dotazy jsou přidány do programové databáze a ?- so1ve( problem, Solution), asserta( so1ve( problem, Solution) ). M Příklad: u1oz_trojice( Seznaml, Seznam2 ) :- member( Xl, Seznaml ), member( X2, Seznam2 ), spocitej_treti( Xl, X2, X3 ), assertz( trojice( Xl, X2, X3 ) ), fail. J* :- dynamic solve/2. při použití v Hana Rudová, Logické programování I, 13. května 2011 73 Vestavěné predikáty Příklad: databázové operace Caching: odpovědi na dotazy jsou přidány do programové databáze a ?- so1ve( problem, Solution), asserta( so1ve( problem, Solution) ). M Příklad: u1oz_trojice( Seznaml, Seznam2 ) :- member( Xl, Seznaml ), member( X2, Seznam2 ), spocitej_treti( Xl, X2, X3 ), assertz( trojice( Xl, X2, X3 ) ), fail. J* :- dynamic solve/2. při použití v u1oz_trojice( Hana Rudová, Logické programování I, 13. května 2011 73 Vestavěné predikáty Vstup a výstup program muže císt data ze vstupního proudu (input stream) program muže zapisovat data do výstupního proudu (output stream) dva aktivní proudy it aktivní vstupní proud it aktivní výstupní proud uživatelský terminál - user Jt datový vstup z terminálu user čhápán jako jeden ze vstupníčh proudu datový výstup na terminál čhápán jako jeden zvýstupníčh proudu soubor 1 soubor 2 user vstupni proudy soubor 3 soubor 4 vystupni proudy Hana Rudová, Logické programování I, 13. kvetna 2011 74 Vestavené predikáty Vstupní a výstupní přoudy: vestavené předikáty změna (otevření) aktivního vstupního/výstupního proudu: see(S)/tell(S) cteni( Soubor ) :- see( Soubor ), cteni_ze_souboru( Informace ), see( user ). JS> uzavření aktivního vstupního/výstupního proudu: seen/told Hana Rudová, Logické programování I, 13. kvetna 2011 75 Vestavené predikáty Vstupní a výstupní proudy: vestavené predikáty zmena (otevření) aktivního vstupního/výstupního proudu: see(S)/te11(S) cteni( Soubor ) :- see( Soubor ), cteni_ze_souboru( Informace ), see( user ). JS> uzavrení aktivního vstupního/výstupního proudu: seen/told & zjištení aktivního vstupního/výstupního proudu: seeing(S)/te11ing(S) cteni( Soubor ) :- seeing( StarySoubor ), see( Soubor ), cteni_ze_souboru( Informace ), seen, see( StarySoubor ). Hana Rudová, Logické programování I, 13. kvetna 2011 75 Vestavené predikáty Sekvenční p r ístup k textovým souborům čtení dalšího termu: read(Term) & pri ctení jsou termy oddeleny teckou | ?- read(A), read( ahoj(B) ), read( [C,D] ). Hana Rudová, Logické programování I, 13. kvetna 2011 76 Vestavené predikáty Sekvenční p ř ístup k textovým souborům čtení dalšího termu: read(Term) iť p ri čtení jsou termy odděleny tečkou | ?- read(A), read( ahoj(B) ), read( [C,D] ). |: ahoj. ahoj( petre ). [ ahoj( 'Petre!' ), jdeme ]. A = ahoj, B = petre, C = ahojC'Petre!'), D = jdeme Hana Rudová, Logické programování I, 13. května 2011 76 Vestavěné predikáty Sekvenční p r ístup k textovým souborům čtení dalšího termu: read(Term) & pri ctení jsou termy oddeleny teckou | ?- read(A), read( ahoj(B) ), read( [C,D] ). |: ahoj. ahoj( petre ). [ ahoj( 'Petre!' ), jdeme ]. A = ahoj, B = petre, C = ahoj('Petre!'), D = jdeme a po dosažení konce souboru je vrácen atom end_of_file & zápis dalšího termu: write(Term) ?- write( ahoj ). ?- write( 'Ahoj Petre!' ). nový rádek na výstup: nl N mezer na výstup: tab(N) Hana Rudová, Logické programování I, 13. kvetna 2011 76 Vestavené predikáty Sekvenční prístup k textovým souborům čtení dalšího termu: read(Term) J* p r i ctení jsou termy oddeieny teckou | ?- read(A), read( ahoj(B) ), read( [C,D] ). |: ahoj. ahoj( petre ). [ ahoj( 'Petre!' ), jdeme ]. A = ahoj, B = petre, C = ahoj('Petre!'), D = jdeme a po dosažení konce souboru je vrácen atom end_of_fi1e & zápis dalšího termu: write(Term) ?- write( ahoj ). ?- write( 'Ahoj Petre!' ). nový rádek na výstup: n1 N mezer na výstup: tab(N) & čtení/zápis dalšího znaku: getO(Znak), get(NeprazdnyZnak)/put(Znak) po dosažení konce souboru je vrácena -1 Hana Rudová, Logické programování I, 13. kvetna 2011 76 Vestavené predikáty Příklad ctení ze soubořu process_file( Soubor ) :- seeing( StarySoubor ), see( Soubor ), repeat, read( Term ), process_term( Term ), Term == end_of_file, i ■ j seen see( StarySoubor ). % zjištení aktivního proudu % otevrení souboru Soubor % Čtení termu Term % manipulace s termem % je konec souboru? % uzavrení souboru % aktivace puvodního proudu repeat. % opakování repeat :- repeat. Hana Rudová, Logické programování I, 13. kvetna 2011 77 Vestavené predikáty Ctení programu ze souboru JS> Interpretování kódu programu a ?- consult(program). a ?- consult('program.pl'). a ?- consu1t( [programl, 'program2.pl'] ). -i* Kompilace kódu programu a ?- compile( [programl, 'program2.pl'] ). & ?- [program]. ?- [user]. zadávání kódu ze vstupu ukonCené CTRL+D a další varianty podobne jako u interpretování & typické zrychlení: 5 až 10 krát Hana Rudová, Logické programování I, 13. května 2011 78 Vestavené predikáty Všechna rešení Backtracking vrací pouze jedno rešení po druhém Všechna r ešení dostupná najednou: bagof/3, setof/3, findall/3 bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splneno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Dite, vek( Dite, 5 ), Seznam ). Hana Rudová, Logické programování I, 13. kvetna 2011 79 Vestavené predikáty Všechna řešení Backtracking vrací pouze jedno řešení po druhém Všechna řešení dostupná najednou: bagof/3, setof/3, findall/3 bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splneno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Dite, vek( Dite, 5 ), Seznam ). Seznam = [ anna, tomas ] Hana Rudová, Logické programování I, 13. května 2011 79 Vestavěné predikáty Všechna řešení Backtracking vrací pouze jedno řešení po druhém Všechna řešení dostupná najednou: bagof/3, setof/3, findall/3 bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splneno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Dite, vek( Dite, 5 ), Seznam ). Seznam = [ anna, tomas ] Volné promenné v cíli P jsou všeobecne kvantifikovány ?- bagof( Dite, vek( Dite, Vek ), Seznam ). Hana Rudová, Logické programování I, 13. kvetna 2011 79 Vestavené predikáty Všechna rešení Backtracking vrací pouze jedno rešení po druhém Všechna r ešení dostupná najednou: bagof/3, setof/3, findall/3 bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splneno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Dite, vek( Dite, 5 ), Seznam ). Seznam = [ anna, tomas ] Volné promenné v cíli P jsou všeobecne kvantifikovány ?- bagof( Dite, vek( Dite, Vek ), Seznam ). Vek = 7, Seznam = [ petr ]; Vek = 5, Seznam = [ anna, tomas ] Hana Rudová, Logické programování I, 13. kvetna 2011 79 Vestavené predikáty Všechna řešení II. Pokud neexistuje r ešení bagof(X,P,S) neuspěje bagof: pokud nejaké r ešení existuje nekolikrát, pak S obsahuje duplicity bagof, setof, findall: P je libovolný cíl vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Dite, ( vek( Dite, 5 ), Dite \= anna ), Seznam ). Seznam = [ tomas ] Hana Rudová, Logické programování I, 13. kvetna 2011 80 Vestavené predikáty vr vr 'II rešeni II. C Pokud neexistuje rešení bagof(X,P,S) neuspeje & bagof: pokud nejaké r ešení existuje nekolikrát, pak S obsahuje duplicity JS> bagof, setof, findall: P je libovolný cíl vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Dite, ( vek( Dite, 5 ), Dite \= anna ), Seznam ). Seznam = [ tomas ] JS> bagof, setof, findall: na objekty shromažďované v X nejsou žádná omezení ?- bagof( Dite-Vek, vek( Dite, Vek ), Seznam ). Seznam = [petr-7,anna-5,tomas-5] Hana Rudová, Logické programování I, 13. kvetna 2011 80 Vestavené predikáty Existenční kvantifikátoř „" " Přidání existenčního kvantifikátořu „Ä " => hodnota promenné nemá význam ?- bagof( Dite, Vek~vek( Dite, Vek ), Seznam ). Hana Rudová, Logické programování I, 13. kvetna 2011 81 Vestavené predikáty Existenční kvantifikátor „" " Přidání existenčního kvantifikátoru „~ " ^ hodnota proměnné nemá význam ?- bagof( Dite, Vek~vek( Dite, Vek ), Seznam ). Seznam = [petr,anna,tomas] Hana Rudová, Logické programování I, 13. května 2011 81 Vestavěné predikáty ExistenCní kvantifikátor „" " Přidání existenCního kvantifikátoru „~ " ^ hodnota promenné nemá význam ?- bagof( Dite, Vek~vek( Dite, Vek ), Seznam ). Seznam = [petr,anna,tomas] Anonymní promenné jsou všeobecne kvantifikovány, i když jejich hodnota není (jako vždy) vracena na výstup ?- bagof( Dite, vek( Dite, _Vek ), Seznam ). Seznam = [petr] ; Seznam = [anna,tomas] Hana Rudová, Logické programování I, 13. kvetna 2011 81 Vestavené predikáty Existenční kvantifikátor „" " Pr idání existenčního kvantifikátoru „Ä " ^ hodnota promenné nemá význam ?- bagof( Dite, Vek~vek( Dite, Vek ), Seznam ). Seznam = [petr,anna,tomas] Anonymní promenné jsou všeobecne kvantifikovány, i když jejich hodnota není (jako vždy) vracena na výstup ?- bagof( Dite, vek( Dite, _Vek ), Seznam ). Seznam = [petr] ; Seznam = [anna,tomas] Pr ed operátorem „~ " může být i seznam ?- bagof( Vek ,[Jmeno,Prijmeni]~vek( Jmeno, Prijmeni, Vek ), Seznam ). Seznam = [7,5,5] Hana Rudová, Logické programování I, 13. kvetna 2011 81 Vestavené predikáty řešení III. setof( X, P, S ): rozdíly od bagof J* S je usporádaný podle @< Jť prípadné duplicity v S jsou eliminovány Hana Rudová, Logické programování I, 13. kvetna 2011 82 Vestavené predikáty řešení III. setof( X, P, S ): rozdíly od bagof J* S je usporádaný podle @< Jt prípadné duplicity v S jsou eliminovány JS> finda11( X, P, S ): rozdíly od bagof it všechny promenné jsou existenCne kvantifikovány ?- findall( Dite, vek( Dite, Vek ), Seznam ). Hana Rudová, Logické programování I, 13. kvetna 2011 82 Vestavené predikáty řešení III. setof( X, P, S ): rozdíly od bagof J* S je uspo řádaný podle @< Jť p r ípadné duplicity v S jsou eliminovány & finda11( X, P, S ): rozdíly od bagof všechny promenné jsou existencne kvantifikovány ?- findall( Dite, vek( Dite, Vek ), Seznam ). == v S jsou shromažďovány všechny možnosti i pro různá r ešení == findall uspeje p r esne jednou Hana Rudová, Logické programování I, 13. kvetna 2011 82 Vestavené predikáty Všechna řešení III. setof( X, P, S ): rozdíly od bagof J* S je uspořádaný podle @< Jť prípadné duplicity v S jsou eliminovány finda11( X, P, S ): rozdíly od bagof všechny proměnné jsou existenCne kvantifikovány ?- findall( Dite, vek( Dite, Vek ), Seznam ). == v S jsou shromažďovány všechny možnosti i pro různá rešení == findall uspeje presne jednou -i- výsledný seznam může být prázdný == pokud neexistuje rešení, uspeje a vrátí S = [] Hana Rudová, Logické programování I, 13. kvetna 2011 82 Vestavené predikáty Všechna řešení III. setof( X, P, S ): rozdíly od bagof J* S je uspořádaný podle @< Jť prípadné duplicity v S jsou eliminovány finda11( X, P, S ): rozdíly od bagof všechny proměnné jsou existenCne kvantifikovány ?- findall( Dite, vek( Dite, Vek ), Seznam ). == v S jsou shromažďovány všechny možnosti i pro různá rešení == findall uspeje presne jednou -i- výsledný seznam muže být prázdný == pokud neexistuje rešení, uspeje a vrátí S = [] -fc ?- bagof( Dite, vek( Dite, Vek ), Seznam ). Vek = 7, Seznam = [ petr ]; Vek = 5, Seznam = [ anna, tomas ] ?- finda11( Dite, vek( Dite, Vek ), Seznam ). Hana Rudová, Logické programování I, 13. kvetna 2011 82 Vestavené predikáty řešení III. setof( X, P, S ): rozdíly od bagof J* S je uspo rádaný podle @< Jť p r ípadné duplicity v S jsou eliminovány & finda11( X, P, S ): rozdíly od bagof všechny promenné jsou existencne kvantifikovány ?- findall( Dite, vek( Dite, Vek ), Seznam ). == v S jsou shromažďovány všechny možnosti i pro různá r ešení == findall uspeje p r esne jednou -i- výsledný seznam může být prázdný == pokud neexistuje r ešení, uspeje a vrátí S = [] -fc ?- bagof( Dite, vek( Dite, Vek ), Seznam ). Vek = 7, Seznam = [ petr ]; Vek = 5, Seznam = [ anna, tomas ] ?- finda11( Dite, vek( Dite, Vek ), Seznam ). Seznam = [petr,anna,tomas] Hana Rudová, Logické programování I, 13. kvetna 2011 82 Vestavené predikáty Testování typu teřmu var(X) X je volná promenná nonvar(X) X není promenná Hana Rudová, Logické programování I, 13. kvetna 2011 83 Vestavené predikáty Testování typu termu var(X) nonvar(X) X je volná proměnná X není proměnná atom(X) integer(X) float(X) atomic(X) X je atom (pavel, 'Pavel Novák', <-->) X je integer X je float X je atom nebo Číslo Hana Rudová, Logické programování I, 13. kvetna 2011 83 Vestavené predikáty Testování typu termu var(X) nonvar(X) X je volná proměnná X není proměnná atom(X) integer(X) float(X) atomic(X) X je atom (pavel, 'Pavel Novák', <-->) X je integer X je float X je atom nebo Číslo compound(X) X je struktura Hana Rudová, Logické programování I, 13. kvetna 2011 83 Vestavené predikáty UřCení poCtu výskytů prvku v seznamu count( X, S, N ) Hana Rudová, Logické programování I, 13. kvetna 2011 84 Vestavené predikáty UrCení poCtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). Hana Rudová, Logické programování I, 13. kvetna 2011 84 Vestavené predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). Hana Rudová, Logické programování I, 13. kvetna 2011 84 Vestavené predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [XjS], N0, N) :- I, N1 is N0 + 1, count( X, S, N1, N). Hana Rudová, Logické programování I, 13. května 2011 84 Vestavěné predikáty UřCení poCtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], N0, N) :- I, N1 is N0 + 1, count( X, S, N1, N). count( X, [_|S], N0, N) :- count( X, S, N0, N). Hana Rudová, Logické programování I, 13. kvetna 2011 84 Vestavené predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], N0, N) :- I, N1 is N0 + 1, count( X, S, N1, N). count( X, [_|S], N0, N) :- count( X, S, N0, N). :-? count( a, [a,b,a,a], N ) N=3 Hana Rudová, Logické programování I, 13. května 2011 84 Vestavěné predikáty UřCení poCtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], N0, N) :- I, N1 is N0 + 1, count( X, S, N1, N). count( X, [_|S], N0, N) :- count( X, S, N0, N). :-? count( a, [a,b,a,a], N ) :-? count( a, [a,b,X,Y], N). N=3 Hana Rudová, Logické programování I, 13. kvetna 2011 84 Vestavené predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [XjS], N0, N) :- I, N1 is N0 + 1, count( X, S, N1, N). count( X, [_jS], N0, N) :- count( X, S, N0, N). :-? count( a, [a,b,a,a], N ) :-? count( a, [a,b,X,Y], N). N=3 N=3 Hana Rudová, Logické programování I, 13. května 2011 84 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], N0, N) :- I, N1 is N0 + 1, count( X, S, N1, N). count( X, [_|S], N0, N) :- count( X, S, N0, N). :-? count( a, [a,b,a,a], N ) :-? count( a, [a,b,X,Y], N). N=3 N=3 count( _, [], N, N ). count( X, [Y|S], N0, N ) :- nonvar(Y), X = Y, I, N1 is N0 + 1, count( X, S, N1, N ). count( X, [_|S], N0, N ) :- count( X, S, N0, N ). Hana Rudová, Logické programování I, 13. května 2011 84 Vestavěné predikáty Konstrukce a dekompozice atomu JS> Atom (opakování) M retezce písmen, císel, „_" zacínající malým písmenem: pavel, pave1_novak, x2, x4_34 A retezce speciálních znaků: +, <->, ===> A r etezce v apostrofech: 'Pavel', 'Pavel Novák', 'prší', 'ano' ?- 'ano'=A. A = ano Hana Rudová, Logické programování I, 13. kvetna 2011 85 Vestavené predikáty Konstrukce a dekompozice atomu Atom (opakování) M retezce písmen, Čísel, „_" zaCínající malým písmenem: pavel, pave1_novak, x2, x4_34 a retezce speciálních znaků: +, <->, ===> -fc r etezce v apostrofech: 'Pavel', 'Pavel Novák', 'prší', 'ano' ?- 'ano'=A. A = ano Řetezec znakU v uvozovkách p r . "ano", "Pavel" ?- A="Pave1". ?- A="ano". A = [80,97,118,101,108] A=[97,110,111] a p r . použití: konstrukce a dekompozice atomu na znaky, vstup a výstup do souboru Hana Rudová, Logické programování I, 13. kvetna 2011 85 Vestavené predikáty Konstrukce a dekompozice atomu JS> Atom (opakování) M řetězce písmen, císel, „_" začínající malým písmenem: pavel, pavel_novak, x2, x4_34 a řetezce speciálních znaků: +, <->, ===> -fc ř etezce v apostrofech: 'Pavel', 'Pavel Novák', 'prší', 'ano' ?- 'ano'=A. A = ano Řetězec znakU v uvozovkách p ř . "ano", "Pavel" ?- A="Pavel". ?- A="ano". A = [80,97,118,101,108] A=[97,110,111] a p ř . použití: konstrukce a dekompozice atomu na znaky, vstup a výstup do souboru * Konstrukce atomu ze znaků, rozložení atomu na znaky name( Atom, SeznamASCIIKodu ) name( ano, [97,110,111] ) name( ano, "ano" ) Hana Rudová, Logické programování I, 13. kvetna 2011 85 Vestavené předikáty Konstrukce a dekompozice termu -í* Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Hana Rudová, Logické programování I, 13. kvetna 2011 86 Vestavené predikáty Konstrukce a dekompozice teřmu -í* Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor | SeznamArgumentu ], ca11( Cil ) Hana Rudová, Logické programování I, 13. kvetna 2011 86 Vestavené predikáty Konstrukce a dekompozice termu -í* Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor | SeznamArgumentu ], call( Cil ) atom =.. X Hana Rudová, Logické programování I, 13. května 2011 86 Vestavěné predikáty Konstrukce a dekompozice termu -í* Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor | SeznamArgumentu ], call( Cil ) atom =.. X => X = [atom] Hana Rudová, Logické programování I, 13. kvetna 2011 86 Vestavené predikáty Konstrukce a dekompozice teřmu ü> Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu j a(9,e) =.. [a,9,ej Cil =.. [ Funktor | SeznamArgumentu j, ca11( Cil ) atom =.. X => X = [atomj & Pokud chci znát pouze funktor nebo nekteré argumenty, pak je efektivnejší: functor( Term, Funktor, Arita ) functor( a(9,e), a, 2 ) Hana Rudová, Logické programování I, 13. kvetna 2011 B6 Vestavené predikáty Konstrukce a dekompozice termu ü> Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor | SeznamArgumentu ], call( Cil ) atom =.. X => X = [atom] & Pokud chci znát pouze funktor nebo nekteré argumenty, pak je efektivnejší: functor( Term, Funktor, Arita ) functor( a(9,e), a, 2 ) functor(atom,atom,0) functor(1,1,0) Hana Rudová, Logické programování I, 13. kvetna 2011 86 Vestavené predikáty Konstrukce a dekompozice termu ü> Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor | SeznamArgumentu ], call( Cil ) atom =.. X => X = [atom] & Pokud chci znát pouze funktor nebo nekteré argumenty, pak je efektivnejší: functor( Term, Funktor, Arita ) functor( a(9,e), a, 2 ) functor(atom,atom,0) i functor(1,1,0) arg( 2, a(9,e), e) arg( N, Term, Argument ) Hana Rudová, Logické programování I, 13. kvetna 2011 86 Vestavené predikáty Rekurzivní rozklad termu Term je promenná (var/1), atom nebo Číslo (atomic/1) => konec rozkladu Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu Term je promenná (var/1), atom nebo císlo (atomic/1) => konec rozkladu Term je složený (=../2, functor/3) ^ procházení seznamu argumentu a rozklad každého argumentu Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu Term je promenná (var/1), atom nebo Číslo (atomic/1) => konec rozkladu Term je seznam ([_|_]) ^ [] ... rešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu Term je složený (=../2, functor/3) => procházení seznamu argumentu a rozklad každého argumentu Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu ii> Term je promenná (var/1), atom nebo císlo (atomic/1) => konec rozkladu Term je seznam => []... řešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu £ Term je složený (=../2, functor/3) => procházení seznamu argumentů a rozklad každého argumentu ii> Príklad: ground/1 uspeje, pokud v termu nejsou promenné; jinak neuspeje Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu ii> Term je promenná (var/1), atom nebo císlo (atomic/1) => konec rozkladu Term je seznam ([_|_]) => [] ... rešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu £ Term je složený (=../2, functor/3) => procházení seznamu argumentu a rozklad každého argumentu ii> Príklad: ground/1 uspeje, pokud v termu nejsou promenné; jinak neuspeje ground(Term) :- atomic(Term), !. Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekuřzivní řozklad teřmu & Term je promenná (var/1), atom nebo císlo (atomic/1) == konec rozkladu Term je seznam ([_|_]) == []... řešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu £ Term je složený (=../2, functor/3) == procházení seznamu argumentu a rozklad každého argumentu ii> Príklad: ground/1 uspeje, pokud v termu nejsou promenné; jinak neuspeje ground(Term) :- atomic(Term), !. ground(Term) :- var(Term), !, fail. Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu ii> Term jě proměnná (var/1), atom nebo Číslo (atomic/1) => konec rozkladu Term je seznam ([_|_]) => []... řešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu £ Term je složený (=../2, functor/3) => procházení seznamu argumentu a rozklad každého argumentu ii> Príklad: ground/1 uspeje, pokud v termu nejsou promenné; jinak neuspeje ground(Term) :- atomic(Term), I. ground(Term) :- var(Term), I, fail. ground([H|T]) :- I, ground(H), ground(T). Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu ii> Term je promenná (var/1), atom nebo císlo (atomic/1) => konec rozkladu Term je seznam ([_|_]) => []... řešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu £ Term je složený (=../2, functor/3) => procházení seznamu argumentu a rozklad každého argumentu ii> Príklad: ground/1 uspeje, pokud v termu nejsou promenné; jinak neuspeje ground(Term) :- atomic(Term), I. ground(Term) :- var(Term), I, fail. ground([H|T]) :- I, ground(H), ground(T). ground(Term) :- Term =.. [ _Funktor | Argumenty ], ground( Argumenty ). Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Rekurzivní rozklad termu & Term je seznam ([_|_]) => [] ... rešen výše jako atomic procházení seznamu a rozklad každého prvku seznamu £ Term je složený (=../2, functor/3) => procházení seznamu argumentu a rozklad každého argumentu ii> Príklad: ground/1 uspeje, pokud v termu nejsou promenné; jinak neuspeje ground(Term) :- atomic(Term), !. ground(Term) :- var(Term), !, fail. ground([HjT]) :- !, ground(H), ground(T). ground(Term) :- Term =.. [ _Funktor j Argumenty ], ground( Argumenty ). ?- ground(s(2,[a(1,3),b,c],X)). ?- ground(s(2,[a(1,3),b,c])). no yes Hana Rudová, Logické programování I, 13. kvetna 2011 87 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 Jt count_term( X, T, N ) :- count_term( X, T, 0, N). Hana Rudová, Logické programování I, 13. května 2011 88 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urCí poCet výskytU celého Čísla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, 1, N is N0 + 1. Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, 1, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), 1. Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, 1, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), 1. count_term( _, T, N, N ) :- var(T), 1. Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. M count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu ?- count_term( 1, a(1,2,bCx,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, I, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), I. count_term( _, T, N, N ) :- var(T), I. count_term( X, T, N0, N ) :- T =.. [ _ | Argumenty L Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty P ríklad: dekompozice termu I. count_term( Integer, Term, N ) ura pocet výskytu celého císla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, !, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), !. count_term( _, T, N, N ) :- var(T), !. count_term( X, T, N0, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, N0, N ). Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Príklad: dekompoziče termu I. count_term( Integer, Term, N ) urcí pocet výskytu celého císla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, NO, N ) :- integer(T), X = T, !, N is NO + 1. count_term( _, T, N, N ) :- atomic(T), !. count_term( _, T, N, N ) :- var(T), !. count_term( X, T, NO, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Príklad: dekompozice termu I. count_term( Integer, Term, N ) urcí pocet výskytu celého císla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, I, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), I. count_term( _, T, N, N ) :- var(T), I. count_term( X, T, N0, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, N0, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], N0, N ) :- count_term( X, H, 0, N1), Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urcí pocet výskytů celého císla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, !, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), !. count_term( _, T, N, N ) :- var(T), !. count_term( X, T, N0, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, N0, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], N0, N ) :- count_term( X, H, 0, N1), N2 is N0 + N1, Hana Rudová, Logické programování I, 13. května 2011 88 Vestavěné predikáty Príklad: dekompozke termu I. count_term( Integer, Term, N ) urCí poCet výskytů celého Čísla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, 1, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), 1. count_term( _, T, N, N ) :- var(T), 1. count_term( X, T, N0, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, N0, N ). count_arg( _, [], N, N ). count_arg( X, [H | T], N0, N) :- count_term( X, H, 0, N1), N2 is N0 + N1, count_arg( X, T, N2, N ). Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) urcí pocet výskytů celého císla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, 1, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), 1. count_term( _, T, N, N ) :- var(T), 1. count_term( X, T, N0, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, N0, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], N0, N ) :- count_term( X, H, 0, N1), N2 is N0 + N1, count_arg( X, T, N2, N ). ?- count_term( 1, [a,2,[b,c],[d,[e,f],Y]], N ). Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty P ríklad: dekompozice termu I. count_term( Integer, Term, N ) urcí pocet výskytů celého císla v termu ?- count_term( 1, a(1,2,b(x,z(a,b,1)),Y), N ). N=2 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, N0, N ) :- integer(T), X = T, !, N is N0 + 1. count_term( _, T, N, N ) :- atomic(T), !. count_term( _, T, N, N ) :- var(T), !. count_term( X, T, N0, N ) :- T =.. [ _ j Argumenty ], count_arg( X, Argumenty, N0, N ). count_arg( _, [], N, N ). count_arg( X, [H j T], N0, N) :- count_term( X, H, 0, N1), N2 is N0 + N1, count_arg( X, T, N2, N ). ?- count_term( 1, [a,2,[b,c],[d,[e,f],Y]], N ). count_term( X, T, N0, N ) :- T = !, count_arg( X, T, N0, N ). klauzuli p r idáme p red poslední klauzuli count_term/4 Hana Rudová, Logické programování I, 13. kvetna 2011 88 Vestavené predikáty CviCení: dekompozke termu Napište predikát substitute( Podterm, Term, Podterm1, Term1), který nahradí všechny výskyty Podterm v Term termem Podterm1 a výsledek vrátí v Term1 & Předpokládejte, že Term a Podterm jsou termy bez promenných JS> ?- substitute( sin(x), 2*sin(x)*f(sin(x)), t, F ). F=2*t*f(t) Hana Rudová, Logické programování I, 13. kvetna 2011 89 Vestavené predikáty Technika a styl programování v Prologu Technika a styl programování v Prologu ü> Styl programování v Prologu s některá pravidla správného stylu & správný vs. špatný styl a komentáre ü> Ladění JS> Efektivita Hana Rudová, Logické programování I, 13. kvetna 2011 91 Technika a styl programování v Prologu Styl přogřamování v Přologu I. ií> Cílem stylistických konvencí je ± redukce nebezpecí programovacích chyb a psaní citelných a srozumitelných programů, které se dob r e ladí a modifikují Hana Rudová, Logické programování I, 13. kvetna 2011 92 Technika a styl programování v Prologu Styl programování v Prologu I. ií> Cílem stylistických konvencí je ± redukce nebezpecí programovacích chyb a psaní citelných a srozumitelných programů, které se dob r e ladí a modifikují ii> Nekterá pravidla správného stylu -i* krátké klauzule -fc krátké procedury; dlouhé procedury pouze s uniformní strukturou (tabulka) Hana Rudová, Logické programování I, 13. kvetna 2011 92 Technika a styl programování v Prologu Styl programování v Prologu I. ií> Cílem stylistických konvencí je ± redukce nebezpecí programovacích chyb a psaní citelných a srozumitelných programu, které se dob r e ladí a modifikují ii> Nekterá pravidla správného stylu -i* krátké klauzule -fc krátké procedury; dlouhé procedury pouze s uniformní strukturou (tabulka) -i- klauzule se základními (hranicními) p r ípady psát p r ed rekurzivními klauzulemi vhodná jmena procedur a promenných nepoužívat seznamy ([...]) nebo závorky ({...}, (...)) pro termy pevné arity a vstupní argumenty psát p r ed výstupními Hana Rudová, Logické programování I, 13. kvetna 2011 92 Technika a styl programování v Prologu Styl programování v Prologu I. ií> Cílem stylistických konvencí je ± redukce nebezpecí programovacích chyb a psaní citelných a srozumitelných programů, které se dob r e ladí a modifikují ii> Nekterá pravidla správného stylu -i* krátké klauzule -fc krátké procedury; dlouhé procedury pouze s uniformní strukturou (tabulka) -i- klauzule se základními (hranicními) p r ípady psát p r ed rekurzivními klauzulemi vhodná jmena procedur a promenných nepoužívat seznamy ([...]) nebo závorky ({...}, (...)) pro termy pevné arity a vstupní argumenty psát p r ed výstupními ± struktura programu - jednotné konvence v rámci celého programu, nap r . mezery, prázdné rádky, odsazení klauzule stejné procedury na jednom míste; prázdné rádky mezi klauzulemi; každý cíl na zvláštním rádku Hana Rudová, Logické programování I, 13. kvetna 2011 92 Technika a styl programování v Prologu Správný styl programování JS* konstrukce setrídeného seznamu Seznam3 ze setridených seznamu Seznaml, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování v Prologu Správný styl programování ü> konstrukce setříděného seznamu Seznam3 ze setříděných seznamů Seznaml, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování vPrologu Správný styl programování -í* konstrukce setříděného seznamu Seznam3 ze setříděných seznamU Seznaml, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- I. % prevence redundantních ř ešení Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování v Prologu Správný styl programování -í* konstrukce setříděného seznamu Seznam3 ze setříděných seznamů Seznámí, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- I. % prevence redundantních ř ešení merge( Seznam, [], Seznam ). Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování vPrologu Správný styl programování -í* konstrukce setříděného seznamu Seznam3 ze setříděných seznamů Seznámí, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- I. % prevence redundantních ř ešení merge( Seznam, [], Seznam ). merge( [XjTeloí], [Y|Te1o2], [X|Te1o3] ) :- Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování v Prologu Správný styl programování -í* konstrukce setrídeného seznamu Seznam3 ze setrídených seznamů Seznam1, Seznam2: merge( Seznam1, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- I. % prevence redundantních r ešení merge( Seznam, [], Seznam ). merge( [X|Te1o1], [Y|Te1o2], [X|Te1o3] ) :-X < Y, I, Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování v Prologu Správný styl programování -í* konstrukce setrídeného seznamu Seznam3 ze setrídených seznamů Seznam1, Seznam2: merge( Seznam1, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- 1. % prevence redundantních r ešení merge( Seznam, [], Seznam ). merge( [X|Te1o1], [Y|Te1o2], [X|Te1o3] ) :-X < Y, 1, merge( Te1o1, [Y|Te1o2], Te1o3 ). Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování vPrologu Správný styl programování -í* konstrukce setříděného seznamu Seznam3 ze setříděných seznamů Seznámí, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- I. % prevence redundantních ř ešení merge( Seznam, [], Seznam ). merge( [X|Te1oí], [Y|Te1o2], [X|Te1o3] ) :-X < Y, I, merge( Telol, [Y|Te1o2], Te1o3 ). merge( Seznaml, [Y|Te1o2], [Y|Te1o3] ) :- Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování v Prologu Správný styl programování -í* konstrukce setrídeného seznamu Seznam3 ze setříděných seznamu Seznaml, Seznam2: merge( Seznaml, Seznam2, Seznam3 ) M merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> merge( [], Seznam, Seznam ) :- I. % prevence redundantních r ešení merge( Seznam, [], Seznam ). merge( [X|Te1o1], [Y|Te1o2], [X|Te1o3] ) :-X < Y, I, merge( Telol, [Y|Te1o2], Te1o3 ). merge( Seznaml, [Y|Te1o2], [Y|Te1o3] ) :-merge( Seznaml, Te1o2, Te1o3 ). Hana Rudová, Logické programování I, 13. kvetna 2011 93 Technika a styl programování v Prologu Špatný styl programování merge( S1, S2, S3 ) :- 51 = [], I, S3 = S2; 52 = [], I, S3 = S1; 51 = [X|T1], 52 = [Y|T2], ( X < Y, I, Z = X, merge( T1, S2, T3 ); Z = Y, merge( S1, T2, T3) ), 53 = [ Z | T3 ]. % první seznam je prázdný % druhý seznam je prázdný % Z je hlava seznamu S3 Hana Rudová, Logické programování I, 13. kvetna 2011 94 Technika a styl programování vPrologu Styl programování v Prologu II. & Středník „;" mUže způsobit nesrozumitelnost klauzule a nedávat st ř edník na konec řádku, používat závorky J* v nekterých p r ípadech: rozdelení klauzle se st r edníkem do více klauzulí Hana Rudová, Logické programování I, 13. kvetna 2011 95 Technika a styl programování v Prologu Styl programování v Prologu II. & Středník „;" muže způsobit nesrozumitelnost klauzule a nedávat st r edník na konec rádku, používat závorky iľ v nekterých p r ípadech: rozdelení klauzle se st r edníkem do více klauzulí & Opatrné používání operátoru rezu -fc preferovat použití zeleného r ezu (nemení deklarativní sémantiku) S cervený rez používat v jasne definovaných konstruktech negace: P, !, fail; true \+ P alternativy: Podminka, !, Cil1 ; Cil2 Podminka -> Cil1 ; Cil2 Hana Rudová, Logické programování I, 13. kvetna 2011 95 Technika a styl programování v Prologu Styl přogřamování v Přologu II. & Středník „;" muže způsobit nesrozumitelnost klauzule a nedávat st r edník na konec rádku, používat závorky iľ v nekterých p r ípadech: rozdelení klauzle se st r edníkem do více klauzulí & Opatrné používání opeřátořu řezu -fc preferovat použití zeleného r ezu (nemení deklarativní sémantiku) S cervený rez používat v jasne definovaných konstruktech negace: P, !, fail; true \+ P alternativy: Podminka, !, Cill ; Cil2 Podminka -> Cill ; Cil2 & Opatrné používání negace „\+" a negace jako neúspech: negace není ekvivalentní negaci v matematické logice Hana Rudová, Logické programování I, 13. kvetna 2011 95 Technika a styl programování vPrologu Styl programování v Prologu II. & Středník „;" muže způsobit nesrozumitelnost klauzule a nedávat st r edník na konec rádku, používat závorky iľ v nekterých p r ípadech: rozdelení klauzle se st r edníkem do více klauzulí & Opatrné používání operátoru rezu -fc preferovat použití zeleného r ezu (nemení deklarativní sémantiku) S cervený rez používat v jasne definovaných konstruktech & Opatrné používání negace „\+" a negace jako neúspech: negace není ekvivalentní negaci v matematické logice & Pozor na assert a retract: snižuji transparentnost chování programu negace: P, !, fail; true alternativy: Podminka, !, Cill ; Cil2 Podminka -> Ci11 ; Ci12 \ + P Hana Rudová, Logické programování I, 13. kvetna 2011 95 Technika a styl programování v Prologu Dokumentace a komentáre C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), p ríklad použití Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu DokumentaCe a komentáre C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), príklad použití & které predikáty jsou hlavní (top-level) Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu Dokumentace a komentáre C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), p ríklad použití & které predikáty jsou hlavní (top-level) & jak jsou hlavní koncepty (objekty) reprezentovány Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu Dokumentace a komentáre C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), p ríklad použití & které predikáty jsou hlavní (top-level) & jak jsou hlavní koncepty (objekty) reprezentovány & doba výpoctu a pamet'ové nároky Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování vPrologu DokumentaCe a komentáre C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), príklad použití & které predikáty jsou hlavní (top-level) & jak jsou hlavní koncepty (objekty) reprezentovány & doba výpoctu a pamet'ové nároky JS> jaké jsou limitace programu Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu Dokumentace a komentáře C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), príklad použití -í* které predikáty jsou hlavní (top-level) & jak jsou hlavní koncepty (objekty) reprezentovány & doba výpoctu a pameťové nároky JS> jaké jsou limitace programu zda jsou použity nejaké speciální rysy závislé na systému Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu Dokumentace a komentá ře C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), p ríklad použití & které predikáty jsou hlavní (top-level) & jak jsou hlavní koncepty (objekty) reprezentovány & doba výpoctu a pamet'ové nároky JS> jaké jsou limitace programu zda jsou použity nejaké speciální rysy závislé na systému & jaký je význam predikátu v programu, jaké jsou jejich argumenty, které jsou vstupní a které výstupní (pokud víme) i* vstupní argumenty „+", výstupní „-" merge( +Seznam1, +Seznam2, -Seznam3 ) Jt JmenoPredikatu/Arita merge/3 Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu Dokumentace a komentáre C co program delá, jak ho používat (jaký cíl spustit a jaké jsou ocekávané výsledky), p ríklad použití & které predikáty jsou hlavní (top-level) & jak jsou hlavní koncepty (objekty) reprezentovány & doba výpoctu a pamet'ové nároky JS> jaké jsou limitace programu ifc zda jsou použity nejaké speciální rysy závislé na systému & jaký je význam predikátu v programu, jaké jsou jejich argumenty, které jsou vstupní a které výstupní (pokud víme) i* vstupní argumenty „+", výstupní „-" merge( +Seznam1, +Seznam2, -Seznam3 ) JmenoPredikatu/Arita merge/3 algoritmické a implementacní podrobnosti Hana Rudová, Logické programování I, 13. kvetna 2011 96 Technika a styl programování v Prologu Ladení Pr epínace na trasování: trace/0, notrace/0 & Trasování specifického predikátu: spy/1, nospy/1 -i- spy( merge/3 ) JS> debug/0, nodebug/0: pro trasování pouze predikátu zadaných spy/1 Hana Rudová, Logické programování I, 13. kvetna 2011 97 Technika a styl programování vPrologu M Pr epínace na trasování: trace/0, notrace/0 & Trasování specifického predikátu: spy/1, nospy/1 -i- spy( merge/3 ) & debug/0, nodebug/0: pro trasování pouze predikátů zadaných spy/1 -i* Libovolná cást programu může být spuštena zadáním vhodného dotazu: trasování cíle 3 vstupní informace: jméno predikátu, hodnoty argumentu p r i volání výstupní informace p r i úspechu hodnoty argumentů splnující cíl p r i neuspechu indikace chyby -i- nové vyvolání p r es stejný cíl je volán p r i backtrackingu Hana Rudová, Logické programování I, 13. kvetna 2011 97 Technika a styl programování v Prologu Krabickový (4-branový) model Vizualizace rídícího toku (backtrackingu) na úrovni predikátu Call: volání cíle Exit: úspešné ukoncení volání cíle Fail: volání cíle neuspelo Redo: jeden z následujících cílů neuspel a systém backtrackuje, aby nalezl alternativy k predchozímu rešení __________________________________________ Call I -----------------> + predek( X, Z ) i- rodic( X, Z ). I I predek( X, Z ) i- rodic( X, Y ), I Exit <----------------- + Fail I predek( Y, Z). + --------- > I I + <--------- I Redo __________________________________________ Hana Rudová, Logické programování I, 13. kvetna 2011 98 Technika a styl programování v Prologu Pr íklad: trasování a(X) i- nonvar(X). a(X) i- c(X). a(X) i- d(X). cCX). d(2). __________________/\ Call j j Exit ------> + a(X) i- nonvar(X).! ------> j a(X) i- c(X). j <------+ a(X) i- d(X). + <------ Fail j j Redo ___________________/\ Hana Rudová, Logické programování I, 1S. kvetna 2011 99 Technika a styl programování vPrologu Pííklad: trasování a(X) i- nonvar(X). a(X) i- c(X). a(X) i- d(X). c(l). d(2). I ľ- a(X). 1 2 2 1 Calli a(_463) ľ 2 Calli nonvar(_463) ľ 2 Faili nonvar(_463) ľ __________________/\ Ca11 I I Exit ------> + a(X) i- nonvar(X).I ------> I a(X) i- c(X). I <------+ a(X) i- d(X). + <------ Fai1 I I Redo ___________________/\ Hana Rudová, Logické programování I, 13. kvetna 2011 99 Technika a styl programování v Prologu Příklad: třasování a(X) i- nonvar(X). I ľ- a(X). a(X) i- c(X). 1 1 Calli a(_463) ľ a(X) i- d(X). 2 2 Calli nonvar(_463) ľ c(1). 2 2 Faili nonvar(_463) ľ d(2). 3 2 Calli c(_463) ľ 3 2 Exiti c(1) ľ ľ1 1 Exiti a(1) ľ Call I I Exit ------> + a(X) i- nonvar(X).I ------> I a(X) i- c(X). I <------+ a(X) i- d(X). + <------ Fail I I Redo ___________________/\ X=1ľ Hana Rudová, Logické programování I, 13. kvetna 2011 99 Technika a styl programování v Prologu Pr íklad: trasování a(X) i- nonvar(X). I ľ- a(X). a(X) i- c(X). 1 1 Calli a(_463) ľ a(X) i- d(X). 2 2 Calli nonvar(_463) ľ c(1). 2 2 Faili nonvar(_463) ľ d(2). 3 2 Calli c(_463) ľ 3 2 Exiti c(1) ľ ľ 1 1 Exiti a(1) ľ Call I I Exit X=1 ľ; > ------ > + a(X) i- nonvar(X).| ------> 1 1 Redoi a(1) ľ I a(X) i- c(X). I 4 2 Calli d(_463) ľ <------+ a(X) i- d(X). + <------ Fail I I Redo ___________________/\ Hana Rudová, Logické programování I, 13. kvetna 2011 99 Technika a styl programování v Prologu Pr íklad: trasování a(X) :- nonvar(X). I ľ- a(X). a(X) :- c(X). 1 1 Call: a(_463) ľ a(X) :- d(X). 2 2 Call: nonvar(_463) ľ c(1). 2 2 Fail: nonvar(_463) ľ d(2). 3 2 Call: c(_463) ľ 3 2 Exit: c(1) ľ ľ 1 1 Exit: a(1) ľ Call II Exit X = 1 ľ; > ------> + a(X) :- nonvar(X).I ------> 1 1 Redo: a(1) ľ I a(X) :- c(X). I 4 2 Call: d(_463) ľ <------ + a(X) :- d(X). + <------ 4 2 Exit: d(2) ľ Fail II Redo 1 1 Exit: a(2) ľ X = 2 ľ; > no % trace I ľ- Hana Rudová, Logické programování I, 1S. kvetna 2011 99 Technika a styl programování v Prologu Efektivita -í* Cas výpoctu, pamet'ové nároky, a také casové nároky na vývoj programu 3 u Prologu mužeme casteji narazit na problémy s casem výpoctu a pametí a Prologovské aplikace redukují cas na vývoj ± vhodnost pro symbolické, nenumerické výpocty se strukturovanými objekty a relacemi mezi nimi Hana Rudová, Logické programování I, 13. kvetna 2011 100 Technika a styl programování v Prologu Efektivita -í* Cas výpoctu, pamet'ové nároky, a také casové nároky na vývoj programu 3 u Prologu mužeme casteji narazit na problémy s casem výpoctu a pametí a Prologovské aplikace redukují cas na vývoj ± vhodnost pro symbolické, nenumerické výpocty se strukturovanými objekty a relacemi mezi nimi & Pro zvýšení efektivity je nutno se zabývat procedurálními aspekty &> zlepšení efektivity p r i prohledávání odstranení zbytecného backtrackingu zrušení provádení zbytecných alternativ co nejd r íve a návrh vhodnejších datových struktur, které umožní efektivnejší operace s objekty Hana Rudová, Logické programování I, 13. kvetna 2011 100 Technika a styl programování v Prologu Zlepšení efektivity: základní techniky Optimalizace posledního volání (LCO) a akumulátory Rozdílové seznamy p r i spojování seznamů Caching: uložení vypocítaných výsledku do programové databáze Hana Rudová, Logické programování I, 13. kvetna 2011 101 Technika a styl programování vPrologu Zlepšení efektivity: základní techniky Optimalizace posledního volání (LCO) a akumulátořy Rozdílové seznamy p r i spojování seznamů Caching: uložení vypocítaných výsledků do programové databáze Indexace podle prvního argumentu a nap r . v SICStus Prologu J> p r i volání predikátu s prvním nainstaniovaným argumentem se používá hašovací tabulka zp r ístupnující pouze odpovídající klauzule zamestnanec( Prijmem', KrestniJmeno, Odděleni, ...) Hana Rudová, Logické programování I, 13. kvetna 2011 101 Technika a styl programování v Prologu Zlepšení efektivity: základní techniky Optimalizace posledního volání (LCO) a akumulátory Rozdílové seznamy pri spojování seznamů Caching: uložení vypocítaných výsledků do programové databáze Indexace podle prvního argumentu a napr. v SICStus Prologu J> pri volání predikátu s prvním nainstaniovaným argumentem se používá hašovací tabulka zprístupnující pouze odpovídající klauzule zamestnanec( Prijmeni, KrestniJmeno, Oddeleni, ...) Determinismus: & rozhodnout, které klauzule mají uspet vícekrát, overit požadovaný determinismus Hana Rudová, Logické programování I, 13. kvetna 2011 101 Technika a styl programování v Prologu Predikátová logika l.rádu Teorie logického programování -í* PROLOG: PROgramming in LOGic, cást predikátové logiky 1. rádu a fakta: rodic(petr,petrik), VXa(X) klauzule: VXVY rodic(X,Y) => predek(X,Y) Hana Rudová, Logické programování I, 13. kvetna 2011 103 Teorie logického programování Teorie logického programování -í* PROLOG: PROgramming in LOGic, cást predikátové logiky 1. rádu a fakta: roch'c(petr,petrik), VXa(X) klauzule: VXVY rodic(X,Y) => predek(X,Y) & Predikátová logika I. r ádu(PLl) soubory objektu: lidé, císla, body prostoru, ... -i* syntaxe PL1, sémantika PL1, pravdivost a dokazatelnost Hana Rudová, Logické programování I, 13. kvetna 2011 103 Teorie logického programování Teorie logického programování —* PROLOG: PROgramming in LOGic, cást predikátové logiky 1. rádu a fakta: rodic(petr,petrik), VXa(X) klauzule: VXVY rodic(X,Y) => predek(X,Y) & Predikátová logika I. r ádu(PLl) soubory objektu: lidé, císla, body prostoru, ... Jt syntaxe PL1, sémantika PL1, pravdivost a dokazatelnost —> Rezoluce ve výrokové logice, v PL1 dokazovací metoda C Rezoluce v logickém programování —* Backtracking, r ez, negace vs. rezoluce Hana Rudová, Logické programování I, 13. kvetna 2011 103 Teorie logického programování Predikátová logika I. rádu (PL1) Abeceda A jazyka L PL1 se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru Hana Rudová, Logické programování I, 13. kvetna 2011 104 Predikátová logika Predikátová logika I. rádu (PLl) Abeceda A jazyka L PL1 se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru & funkcní symboly f, g, ... oznacují operace (p ríklad: +, x ) -i- arita = pocet argumentů, n-ární symbol, znacíme f/n A nulární funkcní symboly - konstanty: oznacují význacné objekty (p r íklad: 0, 1, ...) Hana Rudová, Logické programování I, 13. kvetna 2011 104 Predikátová logika Predikátová logika I. rádu (PL1) Abeceda A jazyka L PL1 se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru & funkční symboly f, g, ... oznacují operace (p ríklad: +, x ) -i- arita = pocet argumentu, n-ární symbol, znacíme f/n nulární funkcní symboly - konstanty: oznacují význacné objekty (p r íklad: 0, 1, ...) & predikátové symboly p,q, ... pro vyjád r ení vlastností a vztahů mezi objekty arita = pocet argumentu, n-ární symbol, znacíme p/n p r íklad: <, g Hana Rudová, Logické programování I, 13. kvetna 2011 104 Predikátová logika Predikátová logika I. rádu (PL1) Abeceda A jazyka L PL1 se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru & funkcní symboly f, g, ... oznacují operace (príklad: +, x ) -i- arita = pocet argumentů, n-ární symbol, znacíme f/n A nulární funkcní symboly - konstanty: oznacují význacné objekty (príklad: 0, 1, ...) & predikátové symboly p,q, ... pro vyjádrení vlastností a vztahů mezi objekty arita = pocet argumentu, n-ární symbol, znacíme p/n príklad: <, g & logické spojky a, v, =>, = Hana Rudová, Logické programování I, 13. kvetna 2011 104 Predikátová logika Predikátová logika I. rádu (PL1) Abeceda A jazyka L PL1 se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru & funkCní symboly f, g, ... oznacují operace (p ríklad: +, x ) -i- arita = pocet argumentu, n-ární symbol, znacíme f/n nulární funkcní symboly - konstanty: oznacují význacné objekty (p r íklad: 0, 1, ...) & predikátové symboly p,q, ... pro vyjád r ení vlastností a vztahů mezi objekty arita = pocet argumentu, n-ární symbol, znacíme p/n p r íklad: <, g & logické spojky a, v, =>, = JS> kvantifikátory V, 3 ± logika I. rádu používá kvantifikaci pouze pro individua (odlišnost od logik vyššího rádu) 30 v logice 1. rádu nelze: v R : V A c R, Vf : R - R Hana Rudová, Logické programování I, 13. kvetna 2011 104 Predikátová logika Predikátová logika I. rádu (PLl) Abeceda A jazyka L PL1 se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru & funkcní symboly f, g, ... oznacují operace (p ríklad: +, x ) -i- arita = pocet argumentu, n-ární symbol, znacíme f/n A nulární funkcní symboly - konstanty: oznacují význacné objekty (p r íklad: 0, 1, ...) & predikátové symboly p,q, ... pro vyjád r ení vlastností a vztahů mezi objekty arita = pocet argumentů, n-ární symbol, znacíme p/n p r íklad: <, g & logické spojky a, v, =>, = JS> kvantifikátory V, 3 ± logika I. rádu používá kvantifikaci pouze pro individua (odlišnost od logik vyššího rádu) v logice 1. rádu nelze: v R : V A c R, Vf : R - R & závorky: ),( Hana Rudová, Logické programování I, 13. kvetna 2011 104 Predikátová logika Jazyky PL1 Specifikace jazyka L je definována funkcními a predikátovými symboly symboly tedy urcují oblast, kterou jazyk popisuje Jazyky s rovností: obsahují predikátový symbol pro rovnost „=" Hana Rudová, Logické programování I, 13. kvetna 2011 105 Predikátová logika Jazyky PL1 Specifikace jazyka L je definována funkcními a predikátovými symboly symboly tedy urcují oblast, kterou jazyk popisuje & Jazyky s řovností: obsahují predikátový symbol pro rovnost „=" Př íklady C jazyk teorie uspo rádání & jazyk s =, binární prediátový symbol < Hana Rudová, Logické programování I, 13. kvetna 2011 105 Predikátová logika Jazyky PL1 Specifikace jazyka L je definována funkcními a predikátovými symboly symboly tedy urcují oblast, kterou jazyk popisuje & Jazyky s rovností: obsahují predikátový symbol pro rovnost „=" Pr íklady C jazyk teorie uspo rádání & jazyk s =, binární prediátový symbol < Jfc jazyk teorie množin -i- jazyk s =, binární predikátový symbol g Hana Rudová, Logické programování I, 13. kvetna 2011 105 Predikátová logika Jazyky PL1 Specifikace jazyka L je definována funkcními a predikátovými symboly symboly tedy urcují oblast, kterou jazyk popisuje & Jazyky s rovností: obsahují predikátový symbol pro rovnost „=" Príklady C jazyk teorie uspo rádání J* jazyk s =, binární prediátový symbol < JS* jazyk teorie množin -i- jazyk s =, binární predikátový symbol g jazyk elementární aritmetiky jazyk s =, nulární funkcní symbol 0 pro nulu, unární funkcní symbol s pro operaci následníka, binární funkcní symboly pro scítání + a násobení x Hana Rudová, Logické programování I, 13. kvetna 2011 105 Predikátová logika Term, atomická formule, formule Term nad abecedou A Jť každá promenná z A je term je-li f/n z A a t\,...,tn jsou termy, pak f(t\, ...,tn) je také term -i- každý term vznikne konecným poctem užití p r echozích kroku f( X, g(X,0)) Hana Rudová, Logické programování I, 13. kvetna 2011 106 Predikátová logika Teřm, atomická fořmule, fořmule M Teřm nad abecedou A Jť každá promenná z A je term je-li f/n z A a t1,...,tn jsou termy, pak f(t\, ...,tn) je také term -i- každý term vznikne konecným poctem užití p r echozích kroku f( X, g(X,0)) & Atomická fořmule (atom) nad abecedou A -fc je-li p/n z A a t1,...,tn jsou termy, pak p(ti,. ..,tn) je atomická formule f(X) < g(X,0) Hana Rudová, Logické programování I, 13. kvetna 2011 106 Predikátová logika Term, atomická formule, formule Term nad abecedou A Jť každá promenná z A je term je-li f/n z A a t1,...,tn jsou termy, pak f(t\, ...,tn) je také term -i- každý term vznikne konecným poctem užití p r echozích kroku f( X, g(X,0)) & Atomická formule (atom) nad abecedou A -fc je-li p/n z A a t1,...,tn jsou termy, pak p(t1,. ..,tn) je atomická formule f(X) < g(X,0) & Formule nad abecedou A a každá atomická formule je formule J> jsou-li F a G formule, pak také (-F), (F a G), (F v G), (F => G), (F = G) jsou formule je-li X promenná a F formule, pak také (VX F) a (3X F) jsou formule každá formule vznikne konecným poctem užití p r echozích kroku (3X ((f(X) = 0) a p(0))) Hana Rudová, Logické programování I, 13. kvetna 2011 106 Predikátová logika Interpretace Interpretace I jazyka L nad abecedou A je dána a neprázdnou množinou D (také znacíme nazývá se univerzum) a i» zobrazením, které každé konstante c g A p r i radí nejaký prvek D každému funkcnímu symbolu f/n g A p r i radí n-ární operaci nad D každému predikátovému symbolu p/n g A p r i radí n-ární relaci nad D Hana Rudová, Logické programování I, 13. kvetna 2011 107 Predikátová logika Interpretace Interpretace I jazyka L nad abecedou A je dána a neprázdnou množinou D (také znaCíme nazývá se univerzum) a a zobrazením, které každé konstante c g A priradí nejaký prvek D každému funkCnímu symbolu f/n g A priradí n-ární operaci nad D každému predikátovému symbolu p/n g A priradí n-ární relaci nad D Príklad: uspořádání na R a jazyk: predikátový symbol mensi/2 & interpretace: univerzum R; zobrazení: mensi(x,y) := x < y Hana Rudová, Logické programování I, 13. kvetna 2011 107 Predikátová logika Interpretace & Interpretace I jazyka L nad abecedou A je dána a neprázdnou množinou D (také znaCíme nazývá se univerzum) a a zobrazením, které každé konstante c g A priradí nejaký prvek D každému funkCnímu symbolu f/n g A priradí n-ární operaci nad D každému predikátovému symbolu p/n g A priradí n-ární relaci nad D -í* Príklad: uspořádání na R a jazyk: predikátový symbol mensi/2 & interpretace: univerzum R; zobrazení: mensi(x,y) := x < y & Príklad: elementární aritmetika nad množinou N (vCetne 0) -fc jazyk: konstanta zero, funCní symboly s/1, plus/2 J* interpretace: univerzum N; zobrazení: zero := 0, s(x) := 1 + x, plus(x,y) := x + y Hana Rudová, Logické programování I, 13. kvetna 2011 107 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé promenné X je prirazen prvek |1| Hodnota termu qp(t): každému termu je prirazen prvek univerza príklad: necht' qp(X) := 0 qp(plus(s(zero),X)) = Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé promenné X je přiřazen prvek |1| Hodnota termu qp(t): každému termu je prirazen prvek univerza príklad: necht' qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé promenné X je p r i razen prvek |1| Hodnota termu qp(t): každému termu je p r i razen prvek univerza p ríklad: necht' qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé promenné X je p r i razen prvek |1| Hodnota termu op(t): každému termu je p r i razen prvek univerza p r íklad: necht' qp(X) := 0 q (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0) + 0 = 1 Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení proměnné qp(X): každé promenné X je p r i razen prvek |1| Hodnota termu op(t): každému termu je p r i razen prvek univerza p r íklad: necht' qp(X) := 0 q (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0) + 0 = 1 Každá dobre utvorená formule oznacuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktu r e a interpretaci Pravdivá formule I Nq q: formule Q oznacena pravda Neravdivá formule I tfq, q: formule Q oznacena nepravda Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé promenné X je p r i razen prvek |1| Hodnota termu op(t): každému termu je p r i razen prvek univerza p r íklad: necht' qp(X) := 0 q (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0) + 0 = 1 Každá dob re utvo rená formule oznacuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktu r e a interpretaci Pravdivá formule I Nq q: formule Q oznacena pravda Neravdivá formule I Nq q: formule Q oznacena nepravda -fc p r íklad: p/1 predikátový symbol, tj. p ^ |1| p := {(1), (3), (5),...} I N p (zero) a p (s (zero)) Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé promenné X je p r i razen prvek |1| Hodnota termu op(t): každému termu je p r i razen prvek univerza p ríklad: necht' qp(X) := 0 op (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0) + 0 = 1 Každá dob re utvo rená formule oznacuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktu r e a interpretaci Pravdivá formule I Nq q: formule Q oznacena pravda Neravdivá formule I Nq q: formule Q oznacena nepravda -fc p r íklad: p/1 predikátový symbol, tj. p ^ |1| p := {(1), (3), (5),...} I N p(zero) a p(s(zero)) iff I N p(zero) a I N p(s(zero)) Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika fořmulí Ohodnocení přomenné q(X): každé promenné X je p r i razen prvek |1| Hodnota teřmu q(t): každému termu je p r i razen prvek univerza p ríklad: necht' qp(X) := 0 q (plus (s (zero), X)) = q(s(zero)) + q(X) = (i + q(zero)) + 0 = (i + 0) + 0 = i Každá dob ře utvo řená fořmule oznacuje přavdivostní hodnotu (pravda, nepravda) v závislosti na své struktu r e a interpretaci Přavdivá fořmule I Nq q: formule Q oznacena pravda Neřavdivá fořmule I Nq Q: formule Q oznacena nepravda -fc p r íklad: p/i predikátový symbol, tj. p ^ |1| p := {(i), (3), (5),...} I N p(zero) a p(s(zero)) iff I N p(zero) a I N p(s(zero)) iff (q(zero)) g p a (q(s(zero))) g p Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné qp(X): každé proměnné X je p r i razen prvek |1| Hodnota termu op(t): každému termu je p r i razen prvek univerza p r íklad: necht' qp(X) := 0 q (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0) + 0 = 1 Každá dob re utvo rená formule oznaCuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktu r e a interpretaci Pravdivá formule I Nq q: formule Q oznaCena pravda Neravdivá formule I ^ q: formule Q oznaCena nepravda & p r íklad: p/1 predikátový symbol, tj. p ^ |1| p := {(1), (3), (5),...} I N p(zero) a p(s(zero)) iff I N p(zero) a I N p(s(zero)) iff (qp(zero)) g p a (qp(s(zero))) g p iff (qp(zero)) g p a ((1 + qp(zero)) g p Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Sémantika formulí Ohodnocení promenné op(X): každé promenné X je p r i razen prvek |1| Hodnota termu op(t): každému termu je p r i razen prvek univerza p r íklad: necht' qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0) + 0 = 1 Každá dobre utvorená formule oznacuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktu r e a interpretaci Pravdivá formule I Nq q: formule Q oznacena pravda Neravdivá formule I Nq q: formule Q oznacena nepravda -fc p r íklad: p/1 predikátový symbol, tj. p ^ |1| p := {(1), (3), (5),...} I N p(zero) a p(s(zero)) iff I N p(zero) a I N p(s(zero)) iff (qp(zero)) g p a (qp(s(zero))) g p iff (qp(zero)) g p a ((1 + qp(zero)) g p iff (0) g p a (1) g p (1) g p ale (0) G p, tedy formule je nepravdivá v I Hana Rudová, Logické programování I, 13. kvetna 2011 108 Predikátová logika Model Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá interpretace množiny N s obvyklými operacemi je modelem formule ( 1 + s(0) = s(s(0))) interpretace, která se liší prirazením s/1: s(x):=x není modelem této formule Hana Rudová, Logické programování I, 13. kvetna 2011 109 Predikátová logika Model Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá interpretace množiny N s obvyklými operacemi je modelem formule ( 1 + s(0) = s(s(0))) interpretace, která se liší prirazením s/1: s(x):=x není modelem této formule Teorie T jazyka L je množina formulí jazyka L, tzv. axiomů - s(X) = 0 je jeden z axiomu teorie elementární aritmetiky Hana Rudová, Logické programování I, 13. kvetna 2011 109 Predikátová logika Model Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá interpretace množiny N s obvyklými operacemi je modelem formule ( 1 + s(0) = s(s(0))) interpretace, která se liší p r i razením s/1: s(x):=x není modelem této formule Teorie T jazyka L je množina formulí jazyka L, tzv. axiomů - s(X) = 0 je jeden z axiomu teorie elementární aritmetiky Model teorie: libovolná interpretace, která je modelem všech jejích axiomů J* všechny axiomy teorie musí být v této interpretaci pravdivé Hana Rudová, Logické programování I, 13. kvetna 2011 109 Predikátová logika Model Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá interpretace množiny N s obvyklými operacemi je modelem formule ( 1 + s(0) = s(s(0))) interpretace, která se liší p r i razením s/1: s(x):=x není modelem této formule Teorie T jazyka L je množina formulí jazyka L, tzv. axiomů - s(X) = 0 je jeden z axiomu teorie elementární aritmetiky Model teorie: libovolná interpretace, která je modelem všech jejích axiomů J* všechny axiomy teorie musí být v této interpretaci pravdivé Pravdivá formule v teorii T = F: pravdivá v každém z modelů teorie T A r íkáme také formule platí v teorii nebo je splnena v teorii ± formule 1 + s(0) = s(s(0))je pravdivá v teorii elementárních císel Hana Rudová, Logické programování I, 13. kvetna 2011 109 Predikátová logika Model Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá interpretace množiny N s obvyklými operacemi je modelem formule ( 1 + s(0) = s(s(0))) interpretace, která se liší p r i razením s/1: s(x):=x není modelem této formule JS> Teořie T jazyka L je množina formulí jazyka L, tzv. axiomů - s(X) = 0 je jeden z axiomu teorie elementární aritmetiky -i* Model teořie: libovolná interpretace, která je modelem všech jejích axiomů J* všechny axiomy teorie musí být v této interpretaci pravdivé & Přavdivá fořmule v teořii T = F: pravdivá v každém z modelu teorie T A r íkáme také formule platí v teořii nebo je splnena v teořii ± formule 1 + s(0) = s(s(0))je pravdivá v teorii elementárních císel JS> Logicky přavdivá fořmule = F: libovolná interpretace je jejím modelem S> nebo-li F je pravdivá v každém modelu libovolné teorie formule G v - G je logicky pravdivá, formule 1 + s(0) = s(s(0)) není logicky pravdivá Hana Rudová, Logické programování I, 13. kvetna 2011 109 Predikátová logika Zkoumání pravdivosti formulí Zjištení pravdivosti provádíme dukazem Důkaz: libovolná posloupnost Fi,..., Fn formulí jazyka L, v níž každé Fi je bud' axiom teorie jazyka L nebo lze Fi odvodit z predchozích Fj (j < i) použitím urcitých odvozovacích pravidel Hana Rudová, Logické programování I, 13. kvetna 2011 110 Predikátová logika Zkoumání pravdivosti formulí Zjištení pravdivosti provádíme dukazem Důkaz: libovolná posloupnost F1,..., Fn formulí jazyka L, v níž každé Fi je bud' axiom teorie jazyka L nebo lze Fi odvodit z p redchozích Fj (j < i) použitím urcitých odvozovacích pravidel JS> Odvozovací pravidla - p ríklady a pravidlo modus ponens: z formulí F a F => G lze odvodit G Hana Rudová, Logické programování I, 13. kvetna 2011 110 Predikátová logika Zkoumání pravdivosti formulí Zjištení pravdivosti provádíme dukazem Důkaz: libovolná posloupnost Fi,..., Fn formulí jazyka L, v níž každé Fi je bud' axiom teorie jazyka L nebo lze Fi odvodit z predchozích Fj (j < i) použitím urcitých odvozovacích pravidel JS> Odvozovací pravidla - príklady a pravidlo modus ponens: z formulí F a F => G lze odvodit G i* rezoluCní princip: z formulí F v A, G v -A odvodit F v G Hana Rudová, Logické programování I, 13. kvetna 2011 110 Predikátová logika Zkoumání pravdivosti formulí Zjištení pravdivosti provádíme dukazem Důkaz: libovolná posloupnost F1,..., Fn formulí jazyka L, v níž každé Fi je bud' axiom teorie jazyka L nebo lze Fi odvodit z p redchozích Fj (j < i) použitím urcitých odvozovacích pravidel JS> Odvozovací pravidla - p ríklady A pravidlo modus ponens: z formulí F a F => G lze odvodit G i* rezolucní princip: z formulí F v A, G v -A odvodit F v G & F je dokazatelná z formulí A1, • • • ,An A1, • • • ,An h F existuje-li dukaz F z A1, • • • ,An Hana Rudová, Logické programování I, 13. kvetna 2011 110 Predikátová logika Zkoumání pravdivosti formulí Zjištení pravdivosti provádíme dukazem Důkaz: libovolná posloupnost F1,..., Fn formulí jazyka L, v níž každé Fi je bud' axiom teorie jazyka L nebo lze Fi odvodit z p redchozích Fj (j < i) použitím urcitých odvozovacích pravidel JS> Odvozovací pravidla - p ríklady a pravidlo modus ponens: z formulí F a F => G lze odvodit G i* rezolucní princip: z formulí F v A, G v -A odvodit F v G & F je dokazatelná z formulí A1, • • • ,An A1, • • • ,An h F existuje-li důkaz F z A1, • • • ,An & Dokazatelné formule v teorii T nazýváme teorémy teorie T Hana Rudová, Logické programování I, 13. kvetna 2011 110 Predikátová logika Korektnost a úplnost Uzavrená formule: neobsahuje volnou promennou (bez kvantifikace) VY ((0 < Y) a ( 3X (X < Y))) je uzavrená formule iľ ( 3X (X < Y)) není uzavrená formule Hana Rudová, Logické programování I, 13. kvetna 2011 111 Predikátová logika Korektnost a úplnost Uzavřená formule: neobsahuje volnou promennou (bez kvantifikace) VY ((0 < Y) a ( 3X (X < Y))) je uzavr ená formule iľ ( 3X (X < Y)) není uzavrená formule M Množina odvozovacích pravidel se nazývá korektní, jestliže pro každou množinu uzavr ených formulí P a každou uzavr enou formuli F platí: jestliže P h F pak P N F (jestliže je neco dokazatelné, pak to platí) Hana Rudová, Logické programování I, 13. kvetna 2011 111 Predikátová logika Korektnost a úplnost Uzavrená formule: neobsahuje volnou promennou (bez kvantifikace) VY ((0 < Y) a ( 3X (X < Y))) je uzavrená formule iľ ( 3X (X < Y)) není uzavrená formule M Množina odvozovacích pravidel se nazývá korektní, jestliže pro každou množinu uzavrených formulí P a každou uzavrenou formuli F platí: jestliže P h F pak P N F (jestliže je neco dokazatelné, pak to platí) Odvozovací pravidla jsou úplná, jestliže jestliže P N F pak P h F (jestliže neco platí, pak je to dokazatelné) Hana Rudová, Logické programování I, 13. kvetna 2011 111 Predikátová logika Korektnost a úplnost Uzavrená formule: neobsahuje volnou proměnnou (bez kvantifikace) VY ((0 < Y) a ( 3X (X < Y))) je uzavr ená formule iľ ( 3X (X < Y)) není uzavrená formule M Množina odvozovacích pravidel se nazývá korektní, jestliže pro každou množinu uzavr ených formulí P a každou uzavr enou formuli F platí: jestliže P h F pak P N F (jestliže je neco dokazatelné, pak to platí) Odvozovací pravidla jsou úplná, jestliže jestliže P N F pak P h F (jestliže neco platí, pak je to dokazatelné) -í* PL1: úplná a korektní dokazatelnost, tj. pro teorii T s množinou axiomu A platí: T = F práve když Ah F Hana Rudová, Logické programování I, 13. kvetna 2011 111 Predikátová logika Rezoluce v predikátové logice I. rádu Rezoluce rezolucní princip: z F v A, G v -A odvodit F v G JS> dokazovací metoda používaná a v Prologu a ve vetšine systému pro automatické dokazování Hana Rudová, Logické programování I, 13. kvetna 2011 113 Rezoluce v PL1 Rezoluce —* rezoluční princip: z F v A, G v -A odvodit F v G —* dokazovací metoda používaná a v Prologu a ve většině systémU pro automatické dokazování procedura pro vyvrácení a hledáme dukaz pro negaci formule snažíme se dokázat, že negace formule je nesplnitelná => formule je vždy pravdivá Hana Rudová, Logické programování I, 13. kvetna 2011 113 Rezoluce v PL1 Formule literál l J» pozitivní literál = atomická formule p(t1, • • • ,tn) s* negativní literál = negace atomické formule -p(t1, • • • ,tn) Hana Rudová, Logické programování I, 13. kvetna 2011 114 Rezoluce v PL1 Formule literál l J» pozitivní literál = atomická formule p(t1, • • • ,tn) s* negativní literál = negace atomické formule -p(t1, • • • ,tn) & klauzule C = konecná množina literálů reprezentující jejich disjunkci p r íklad: p(X) v q(a,f) v -p(Y) notace: {p(X), q(a, f),-p(Y)} A klauzule je pravdivá <=> je pravdivý alespon jeden z jejích literálů -i- prázdná klauzule se znací □ a je vždy nepravdivá (neexistuje v ní pravdivý literál) Hana Rudová, Logické programování I, 13. kvetna 2011 114 Rezoluce v PL1 Formule literál l J» pozitivní literál = atomická formule p(t1, • • • ,tn) s* negativní literál = negace atomické formule -p(t1, • • • ,tn) & klauzule C = konecná množina literálů reprezentující jejich disjunkci príklad: p(X) v q(a,f) v -p(Y) notace: {p (X), q(a, f),-p(Y)} A klauzule je pravdivá <=> je pravdivý alespoň jeden z jejích literálů -i- prázdná klauzule se znací □ a je vždy nepravdivá (neexistuje v ní pravdivý literál) & formule F = množina klauzulí reprezentující jejich konjunkci formule je v tzv. konjuktivní normální forme (konjunkce disjunkcí) J* príklad: (p v q) a (-p) a (p v-q v r) notace: {{p, q}, {-p}, {p, -q,r}} Hana Rudová, Logické programování I, 13. kvetna 2011 114 Rezoluce vPL1 Formule literál l s* pozitivní literál = atomická formule p(t1, • • • ,tn) s* negativní literál = negace atomické formule -p(t1, • • • ,tn) & klauzule C = konecná množina literálů reprezentující jejich disjunkci príklad: p(X) v q(a,f) v -p(Y) notace: {p (X), q(a, f),-p(Y)} A klauzule je pravdivá <=> je pravdivý alespon jeden z jejích literálů -i- prázdná klauzule se znací □ a je vždy nepravdivá (neexistuje v ní pravdivý literál) & formule F = množina klauzulí reprezentující jejich konjunkci formule je v tzv. konjuktivní normální forme (konjunkce disjunkcí) J* príklad: (p v q) a (-p) a (p v-q v r) notace: {{p, q}, {-p}, {p, -q,r}} A formule je pravdivá <=> všechny klauzule jsou pravdivé J* prázdná formule je vždy pravdivá (neexistuje klauzule, která by byla nepravdivá) Hana Rudová, Logické programování I, 13. kvetna 2011 114 Rezoluce vPL1 Fořmule liteřál l J» pozitivní liteřál = atomická formule p(ti, • • • ,tn) s» negativní liteřál = negace atomické formule -p(ti, • • • ,tn) & klauzule C = konecná množina literálů reprezentující jejich disjunkci príklad: p(X) v q(a,f) v -p(Y) notace: {p(X),q(a, f),-p(Y)} A klauzule je přavdivá <=> je pravdivý alespon jeden z jejích literálů -i- přázdná klauzule se znací □ a je vždy nepravdivá (neexistuje v ní pravdivý literál) & fořmule F = množina klauzulí reprezentující jejich konjunkci formule je v tzv. konjuktivní normální forme (konjunkce disjunkcí) J* príklad: (p v q) a (-p) a (p v-q v r) notace: {{p, q}, {-p}, {p, -q,r}} A fořmule je přavdivá <=> všechny klauzule jsou pravdivé J* prázdná formule je vždy pravdivá (neexistuje klauzule, která by byla nepravdivá) & množinová notace: literál je prvek klauzule, klauzule je prvek formule, ... Hana Rudová, Logické programování I, 13. kvetna 2011 114 Rezoluce v PL1 Splnitelnost [Opakování:] Interpretace I jazyka L je dána univerzem D a zobrazením, které p r i radí konstante c prvek D, funkCnímu symbolu //n n-ární operaci v D a predikátovému symbolu p/n n-ární relaci. príklad: F = {{f(a,b) = /(b,a)}, [f(f(a,a),b) = a}} interpretace ?i: D = Z, a := 1,b := -1,f := " + " Hana Rudová, Logické programování I, 13. kvetna 2011 115 Rezoluce v PL1 Splnitelnost -i* [Opakování:] Interpretace I jazyka L je dána univerzem D a zobrazením, které priradí konstante c prvek D, funkcnímu symbolu f /n n-ární operaci v D a predikátovému symbolu p/n n-ární relaci. príklad: F = {{f(a,b) = f (b,a)}, {f(f(a,a),b) = a}} interpretace I1: D = Z,a := 1,b := -1,f := " + " JS> Formule je splnitelná, existuje-li interpretace, pro kterou je pravdivá a formule je konjunkce klauzulí, tj. všechny klauzule musí být v dané interpretaci pravdivé ± príklad (pokrač): F je splnitelná (je pravdivá v 11) Hana Rudová, Logické programování I, 13. kvetna 2011 115 Rezoluce v PL1 Splnitelnost [Opakování:] Interpretace I jazyka L je dána univerzem D a zobrazením, které p r i radí konstante c prvek D, funkCnímu symbolu f/n n-ární operaci v D a predikátovému symbolu p/n n-ární relaci. p r íklad: F ={{f(a,b) = f (b,a)}, {f(f(a,a),b) = a}} interpretace ?i: D = Z,a := 1,b := -1,f := " + " JS> Formule je splnitelná, existuje-li interpretace, pro kterou je pravdivá a formule je konjunkce klauzulí, tj. všechny klauzule musí být v dané interpretaci pravdivé ± p r íklad (pokraC): F je splnitelná (je pravdivá v I1) & Formule je nesplnitelná, neexistuje-li interpretace, pro kterou je pravdivá J* tj. formule je ve všech iterpretacích nepravdivá -i- tj. neexistuje interpretace, ve které by byly všechny klauzule pravdivé J* p r íklad: G = {{p(b)}, {p(a)}, {-p(a)}} je nesplnitelná ({p(a)} a {-p(a)} nemohou být zároven pravdivé) Hana Rudová, Logické programování I, 13. kvetna 2011 115 Rezoluce v PL1 Rezoluční princip ve výrokové logice M Rezoluční princip = pravidlo, které umožňuje odvodit z klauzulí C1 u jí} a j-í} u C2 klauzuli Ci u C2 Ci u {l} j-í} u C2 Ci u C2 & C1 u C2 se ňazývá rezolventou původních klauzulí Hana Rudová, Logické programování I, 13. kvetna 2011 116 Rezoluce vPL1 Rezoluční princip ve výrokové logice Rezoluční princip = pravidlo, které umožňuje odvodit z klauzulí C1 u jí} a { —í} u C2 klauzuli Ci u C2 Ci u {l} { —í} u C2 Ci u C2 C1 u C2 se ňazývá rezolventou puvodňích klauzulí příklad: jp,r} {—r,s} (p v r) a (—r v s) jp,s} p v s Hana Rudová, Logické programování I, 13. kvetna 2011 116 Rezoluce vPL1 Rezolucní princip ve výrokové logice Rezolucní princip = pravidlo, které umožnuje odvodit z klauzulí C1 u {l} a {-l} u C2 klauzuli C1 u C2 C1 u {l} {-l} u C2 C1 u C2 C1 u C2 se nazývá rezolventou puvodních klauzulí príklad: {p,r} {-r, s} (p v r) a (-r v s) {p,s} p v s obe klauzule (p v r) a (-r v s) musí být pravdivé protože r nestací k pravdivosti obou klauzulí, musí být pravdivé p (pokud je pravdivé -r) nebo s (pokud je pravdivé r), tedy platí klauzule p v s Hana Rudová, Logické programování I, 13. kvetna 2011 116 Rezoluce v PL1 RezoluCní důkaz rezoluCní důkaz klauzule C z formule F je konecná posloupnost C1,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 Rezolucní důkaz rezolucní důkaz klauzule C z formule F je konecná posloupnost C1,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, -r}, {-q}} Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 Rezolucní důkaz rezolucní důkaz klauzule C z formule F je konecná posloupnost C1,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, -r}, {-q}} C1 = {p,r} klauzule z F Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 Rezoluční důkaz rezoluční důkaz klauzule C z formule F je konecná posloupnost Ci,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, —r}, {-q}} C = {p,r} klauzule z F C2 = {q, —r} klauzule z F Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 Rezolucní důkaz rezolucní důkaz klauzule C z formule F je konecná posloupnost C1,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, -r}, {-q}} C1 = {p,r} klauzule z F C2 = {q, -r} klauzule z F C3 = {p, q} rezolventa C1 a C2 Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 RezoluCní důkaz rezoluCní důkaz klauzule C z formule F je konecná posloupnost C1,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, —r}, {-q}} C1 = {p,r} klauzule z F C2 = {q, —r} klauzule z F C3 = {p, q} rezolventa C1 a C2 C4 = {—q} klauzule z F Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 Rezolucní důkaz rezolucní důkaz klauzule C z formule F je konecná posloupnost C1,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, -r}, {-q}} C1 = {p,r} klauzule z F C2 = {q, -r} klauzule z F C3 = {p, q} rezolventa C1 a C2 C4 = {-q} klauzule z F C5 = {p} = C rezolventa C3 a C4 Hana Rudová, Logické programování I, 13. kvetna 2011 117 Rezoluce v PL1 Rezolucní vyvrácení důkaz pravdivosti formule F spocívá v demonstraci nesplnitelnosti — F & —F nesplnitelná == —F je nepravdivá ve všech interpretacích == F je vždy pravdivá Hana Rudová, Logické programování I, 13. kvetna 2011 118 Rezoluce v PL1 Rezoluční vyvrácení důkaz pravdivosti formule F spocívá v demonstraci nesplnitelnosti -F & -F nesplnitelná == -F je nepravdivá ve všech interpretacích == F je vždy pravdivá ii> zacneme-li z klauzulí reprezentujících -F, musíme postupným uplatnováním rezolucního principu dospet k prázdné klauzuli □ C Pr íklad: F...-*av a Hana Rudová, Logické programování I, 13. kvetna 2011 118 Rezoluce v PL1 Rezolucní vyvrácení důkaz pravdivosti formule F spocívá v demonstraci nesplnitelnosti -F & -F nesplnitelná == -F je nepravdivá ve všech interpretacích == F je vždy pravdivá ii> zacneme-li z klauzulí reprezentujících -F, musíme postupným uplatňováním rezolucního principu dospet k prázdné klauzuli □ C Príklad: F... -a v a -F.. .a a -a -F... {{a}, {-a}} Hana Rudová, Logické programování I, 13. kvetna 2011 118 Rezoluce v PL1 Rezolucní vyvřácení M důkaz pravdivosti formule F spocívá v demonstřaci nesplnitelnosti -F & -F nesplnitelná = -F je nepravdivá ve všech interpretacích == F je vždy pravdivá ii> zacneme-li z klauzulí reprezentujících -F, musíme postupným uplatňováním rezolucního principu dospet k přázdné klauzuli □ C Príklad: F... -a v a -F.. .a a -a -F... {{a}, {-a}} Ci = {a}, C2 = {-a} rezolventa C1 a C2 je □, tj. F je vždy pravdivá & rezolucní důkaz □ z formule G se nazývá řezolucní vyvřácení fořmule G -i* a tedy G je nepravdivá ve všech interpretacích, tj. G je nesplnitelná Hana Rudová, Logické programování I, 13. kvetna 2011 118 Rezoluce v PL1 Strom rezolučního důkazu strom rezolučního důkazu klauzule C z formule F je binární strom: J* koren je označen klauzulí C, listy jsou označeny klauzulemi z F a i* každý uzel, který není listem, má bezprostředními potomky označené klauzulemi C\ a C2 je označen rezolventou klauzulí C a C2 M príklad: F = {{p,r}, {q, -r}, {-q}, {-p}} C = □ {p,r} {q, -r} {-q} {-p} / / / strom rezolučního vyvrácení (rezoluční dukaz □ z F) Hana Rudová, Logičké programování I, 13. kvetna 2011 119 Rezoluce v PL1 Strom rezolučního důkazu strom rezolučního důkazu klauzule C z formule F je binární strom: J* koren je označen klauzulí C, listy jsou označeny klauzulemi z F a i* každý uzel, který není listem, má bezprostředními potomky označené klauzulemi C\ a C2 je označen rezolventou klauzulí C a C2 M príklad: F = {{p,r}, {q, -r}, {-q}, {-p}} C = □ {p,r} {q, -r} {-q} {-p} IM / / / / / strom rezolučního vyvrácení (rezoluční důkaz □ z F) príklad: {{p,r}, {q, -r}, {-q}, {-p, t}, {-s}, {s,-t}} Hana Rudová, Logičké programování I, 13. kvetna 2011 119 Rezoluce v PL1 Substituce JS> co s promennými? vhodná substituce a unifikace f(X,a,g(Y)) < 1,f(h(c),a,Z) < 1, X = h(c),Z = g(Y) == f(h(c),a,g(Y)) < 1 Hana Rudová, Logické programování I, 13. kvetna 2011 120 Rezoluce v PL1 Substituce co s promennými? vhodná substituce a unifikace f(X,a,g(Y)) < l,f(h(c),a,Z) < 1, X = h(c),Z = g(Y) == f(h(c),a,g(Y)) < 1 substituce je libovolná funkce 9 zobrazující výrazy do výrazů tak, že platí -i- 9(E) = E pro libovolnou konstantu E 9(f(E1, • • • ,En)) = f (9(E\), • • • , 9(En)) pro libovolný funkcní symbol f -i- 9(p(E1, • • • ,En)) = p(9(E1), • • • , 9(En)) pro libovolný predik. symbol p substituce je tedy homomorfismus výrazu, který zachová vše krome promenných - ty lze nahradit címkoliv substituce zapisujeme zpravidla ve tvaru seznamu [X1/^1, • • • ,Xn/^n] kde Xi jsou promenné a substituované termy p r íklad: p(X)[X/f(a)] = p(f(a)) Hana Rudová, Logické programování I, 13. kvetna 2011 120 Rezoluce v PL1 Substituce JS> co s promennými? vhodná substituce a unifikace f(X,a,g(Y)) < 1,f(h(c),a,Z) < 1, X = h(c),Z = g(Y) => f(h(c),a,g(Y)) < 1 -i* substituce je libovolná funkce 9 zobrazující výrazy do výrazů tak, že platí -i- 9(E) = E pro libovolnou konstantu E 9(f(E1, • • • ,En)) = f (9(E\), • • • , 9(En)) pro libovolný funkcní symbol f -i* 9(p(E1, • • • ,En)) = p(9(E1), • • • , 9(En)) pro libovolný predik. symbol p JS> substituce je tedy homomorfismus výrazů, který zachová vše krome promenných - ty lze nahradit címkoliv & substituce zapisujeme zpravidla ve tvaru seznamu [X1/^1, • • • ,Xn/^n] kde Xi jsou promenné a "E)i substituované termy príklad: p(X)[X/f(a)] = p(f(a)) & prejmenování promenných: speciální náhrada proměnných promennými príklad: p(X)[X/Y] = p(Y) Hana Rudová, Logické programování I, 13. kvetna 2011 120 Rezoluce v PL1 Unifikace Ztotožnení dvou literál u p, q pomocí vhodné substituce a takové, že pa = qa nazýváme unifikací a príslušnou substituci unifikátorem. Unifikátorem množiny S literál u nazýváme substituce 0 takovou, že množina S0 = {t0|t g S} má jediný prvek. Hana Rudová, Logické programování I, 13. kvetna 2011 121 Rezoluce vPL1 Unifikace Ztotožnení dvou literálu p, q pomocí vhodné substituce a takové, že pa = qa nazýváme unifikací a príslušnou substituci unifikátorem. & Unifikátorem množiny S literálu nazýváme substituce 0 takovou, že množina se = {t0it g s} má jediný prvek. príklad: S = { datum( D1, M1, 2003 ), datum( 1, M2, Y2) } unifikátor 0 = [D1/1, M1/2, M2/2, Y2/2003] S0 = { datum( 1, 2, 2003 ) } Hana Rudová, Logické programování I, 13. kvetna 2011 121 Rezoluce v PL1 Unifikace Ztotožnení dvou literál u p, q pomocí vhodné substituce a takové, že pa = qa nazýváme unifikací a príslušnou substituci unifikátorem. & Unifikátorem množiny S literál u nazýváme substituce 0 takovou, že množina S0 = {t0|t g S} má jediný prvek. príklad: S = { datum( D1, M1, 2003 ), datum( 1, M2, Y2) } unifikátor 0 = [D1/1, M1/2, M2/2, Y2/2003] S0 = { datum( 1, 2, 2003 ) } & Unifikátor a množiny S nazýváme nejobecnejším unifikátorem (mgu - most generál unifier), jestliže pro libovolný unifikátor 0 existuje substituce A taková, že 0 = aA. Hana Rudová, Logické programování I, 13. kvetna 2011 121 Rezoluce vPL1 Unifikace C Ztotožnení dvou literálu p, q pomočí vhodné substituče a takové, že pa = qa nazýváme unifikací a príslušnou substituči unifikátorem. & Unifikátorem množiny S literálu nazýváme substituče 0 takovou, že množina se = {t0\t g s} má jediný prvek. príklad: S = { datum( D1, M1, 2003 ), datum( 1, M2, Y2) } unifikátor 0 = [D1/1, M1/2, M2/2, Y2/2003] S0 = { datum( 1, 2, 2003 ) } & Unifikátor a množiny S nazýváme nejobečnejším unifikátorem (mgu - most generál unifier), jestliže pro libovolný unifikátor 0 existuje substituče A taková, že 0 = aA. a príklad (pokrač.): nejobečnejší unifikátor a = [D1/1, Y2/2003, M1/M2], Hana Rudová, Logičké programování I, 13. kvetna 2011 121 Rezoluče v PL1 Unifikace Ztotožnení dvou literálu p, q pomocí vhodné substituce a takové, že pa = qa nazýváme unifikací a príslušnou substituci unifikátorem. & Unifikátorem množiny S literálu nazýváme substituce 0 takovou, že množina se = {teit g s} má jediný prvek. príklad: S = { datum( D1, M1, 2003 ), datum( 1, M2, Y2) } unifikátor 0 = [D1/1, M1/2, M2/2, Y2/2003] S0 = { datum( 1, 2, 2003 ) } & Unifikátor a množiny S nazýváme nejobecnejším unifikátorem (mgu - most generál unifier), jestliže pro libovolný unifikátor 0 existuje substituce A taková, že 0 = aA. príklad (pokrac.): nejobecnejší unifikátor a = [D1/1, Y2/2003, M1/M2], A=[M2/2] Hana Rudová, Logické programování I, 13. kvetna 2011 121 Rezoluce v PL1 Rezolucní princip v PL1 základ: & rezolucní princip ve výrokové logice----- Cl U C2 Jť substituce, unifikátor, nejobecnejší unifikátor Hana Rudová, Logické programování I, 13. kvetna 2011 122 Rezoluce v PL1 Rezolucní přincip v PL1 základ: & rezolucní princip ve výrokové logice----- Ci u C2 Jť substituce, unifikátor, nejobecnejší unifikátor řezolucní přincip v PL1 je pravidlo, které -fc pripraví príležitost pro uplatnení vlastního rezolucního pravidla nalezením vhodného unifikátoru provede rezoluci a získá rezolventu Hana Rudová, Logické programování I, 13. kvetna 2011 122 Rezoluce v PL1 Rezolucní princip v PL1 základ: & rezolucní princip ve výrokové logice----- C1 u C2 Jť substituce, unifikátor, nejobecnejší unifikátor rezolucní princip v PL1 je pravidlo, které -fc pripraví príležitost pro uplatnení vlastního rezolucního pravidla nalezením vhodného unifikátoru provede rezoluci a získá rezolventu C1 u {A} {-B}u C2 C1 pa u C2a *> kde p je p rejmenováním promenných takové, že klauzule (C1 u A)p a {B} u C2 nemají spolecné promenné a a je nejobecnejší unifikátor klauzulí Ap a B Hana Rudová, Logické programování I, 13. kvetna 2011 122 Rezoluce v PL1 Príklad: rezoluče v PLI C príklad: Ci = {p(X,Y), q(Y)} C2 = {-q(a), s(X,W)} Hana Rudová, Logičké programování I, 13. kvetna 2011 123 Rezoluče v PL1 Príklad: rezoluce v PL1 príklad: C1 = {p(X,Y), q(Y)} C2 = {-q(a), s(X,W)} prejmenování promenných: p = [X/Z] C1 ={p(Z,Y), q(Y)} C2 ={-q(a), s(X,W)} Hana Rudová, Logické programování I, 13. kvetna 2011 123 Rezoluce vPL1 Príklad: rezoluče v PLI príklad: Ci = {p(X,Y), q(Y)} C2 = {-q(a), s(X,W)} přejmenování promennýčh: p = [X/Z] Ci ={p(Z,Y), q(Y)} C2 ={-q(a), s(X,W)} nejobečnejší unifikátor: a = [Y/a] Ci = {p(Z,a), q(a)} C2 = {-q(a), s(X,W)} Hana Rudová, Logičké programování I, 13. kvetna 2011 123 Rezoluče v PL1 Příklad: řezoluce v PL1 príklad: Ci = {p(X,Y), q(Y)} C2 = {-q(a), s(X,W)} prejmenování promenných: p = [X/Z] Ci = {p(Z,Y), q(Y)} C2 = {-q(a), s(X,W)} nejobecnejší unifikátor: a = [Y/a] Ci = {p(Z,a), q(a)} C2 = {-q(a), s(X,W)} rezolucní princip: C = {p(Z,a), s(X,W)} Hana Rudová, Logické programování I, 13. kvetna 2011 123 Rezoluce vPL1 Príklad: rezoluce v PLI príklad: C = {p(X,Y), q(Y)} C2 = {-q(a), s(X,W)} přejmenování promenných: p = [X/Z] C1 ={p(Z,Y), q(Y)} C2 = {-q(a), s(X,W)} nejobecnejší unifikátor: a = [Y/a] C1 = {p(Z,a), q(a)} C2 = {-q(a), s(X,W)} rezolucní princip: C = {p(Z,a), s(X,W)} * vyzkoušejte si: C1 = {q(X), -r (Y), p (X, Y), p (f (Z), f (Z))} C2 = {n(Y), -r(W), -p(f(W),f(W)} Hana Rudová, Logické programování I, 13. kvetna 2011 123 Rezoluce v PL1 Rezoluce v PL1 Obecný rezolucní princip v PL1 C1 pa u C2a & kde p je prejmenováním promenných takové, že množiny klauzulí {A1p, • • • ,Amp, C1p} a {B1, • • • ,Bn, C2} nemají spolecné promenné Jr a je nejobecnejší unifikátor množiny {A1p, • • • ,Amp,B1, • • • ,Bn} Hana Rudová, Logické programování I, 13. kvetna 2011 124 Rezoluce vPL1 Rezoluce v PLI Obecný rezoluCní princip v PL1 Ci U [Ai, • • • ,Am} {-Bi, • • • , -Bn} u C2 C1pa u C2a & kde p je přejmenováním proměnných takové, že množiny klauzulí [A1p, • • • ,Amp, C1p} a [B1, • • • ,Bn, C2} nemají spoleCné promenné Jr a je nejobecnejší unifikátor množiny [A1p, • • • ,Amp,B1, • • • ,Bn} příklad: A1 = a(X) vs. {-B1, -B2} = [-a(b), -a(Z)} v jednom kroku potřebuji vyrezolvovat zároven B1 i B2 Hana Rudová, Logické programování I, 13. kvetna 2011 124 Rezoluce v PL1 Rezoluce v PL1 Obecný rezolucní princip v PL1 C1 u {A1, • • • ,Am} {-B1, • • • , -Bn} u C2 C1 pa u C2a & kde p je prejmenováním promenných takové, že množiny klauzulí {A1p, • • • ,Amp, C1p} a {B1, • • • ,Bn, C2} nemají spolecné promenné Jr a je nejobecnejší unifikátor množiny {A1p, • • • ,Amp,B1, • • • ,Bn} príklad: A1 = a(X) vs. {-B1, -B2} = {-a(b), -a(Z)} v jednom kroku potrebuji vyrezolvovat zároven B1 i B2 Rezoluce v PL1 a korektní: jestliže existuje rezolucní vyvrácení F, pak F je nesplnitelná & úplná: jestliže F je nesplnitelná, pak existuje rezolucní vyvrácení F Hana Rudová, Logické programování I, 13. kvetna 2011 124 Rezoluce vPL1 Zefektivnení rezoluce rezoluce je intuitivne efektivnejší než axiomatické systémy a axiomatické systémy: který z axiomu a pravidel použít? & rezoluce: pouze jedno pravidlo Hana Rudová, Logické programování I, 13. kvetna 2011 125 Rezoluce vPL1 Zefektivnení rezoluce rezoluče je intuitivne efektivnejší než axiomatičké systémy a axiomatičké systémy: který z axiomu a pravidel použít? a rezoluče: pouze jedno pravidlo stále ale príliš mnoho možností, jak hledat dukaz v prohledávačím prostoru problém SAT= {S\S je splnitelná } NP úplný, ničméne: menší prohledávačí prostor vede k ryčhlejšímu nalezení rešení strategie pro zefektivnení prohledávání => varianty rezoluční metody Hana Rudová, Logičké programování I, 13. kvetna 2011 125 Rezoluče v PL1 Zefektívnení rezoluce C rezoluče je intuitivne efektivnejší než axiomatičké systémy a axiomatičké systémy: který z axiomu a pravidel použít? a rezoluče: pouze jedno pravidlo -í* stále ale príliš mnoho možností, jak hledat dukaz v prohledávačím prostoru C- problém SAT= {515 je splnitelná } NP úplný, ničméne: menší prohledávačí prostor vede k ryčhlejšímu nalezení rešení & strategie pro zefektivnení prohledávání => varianty rezoluční metody JS> vylepšení prohledávání a zastavit prohledávání čest, které nejsou slibné & spečifikače poradí, jak pročházíme alternativními čestami Hana Rudová, Logičké programování I, 13. kvetna 2011 125 Rezoluče v PL1 Varianty rezolucní metody Veta: Každé omezení rezoluce je korektní. & stále víme, že to, co jsme dokázali, platí Hana Rudová, Logické programování I, 13. kvetna 2011 126 Rezoluce v PL1 Varianty rezolucní metody Veta: Každé omezení rezoluce je korektní. J* stále víme, že to, co jsme dokázali, platí T-rezoluce: klauzule ucastnící se rezoluce nejsou tautologie úplná -i- tautologie nepomuže ukázat, že formule je nesplnitelná Hana Rudová, Logické programování I, 13. kvetna 2011 126 Rezoluce vPL1 Varianty rezolucní metody Veta: Každé omezení rezoluce je korektní. J* stále víme, že to, co jsme dokázali, platí T-rezoluce: klauzule ucastnící se rezoluce nejsou tautologie úplná -i- tautologie nepomuže ukázat, že formule je nesplnitelná sémantická rezoluce: úplná zvolíme libovolnou interpretaci a pro rezoluci používáme jen takové klauzule, z nichž alespon jednaje v této interpretaci nepravdivá a pokud jsou obe klauzule pravdivé, težko odvodíme nesplnitelnost formule Hana Rudová, Logické programování I, 13. kvetna 2011 126 Rezoluce v PL1 Varianty rezolucní metody Veta: Každé omezení rezoluce je korektní. J* stále víme, že to, co jsme dokázali, platí T-řezoluce: klauzule ucastnící se rezoluce nejsou tautologie úplná -i- tautologie nepomuže ukázat, že formule je nesplnitelná sémantická řezoluce: úplná zvolíme libovolnou interpretaci a pro rezoluci používáme jen takové klauzule, z nichž alespon jednaje v této interpretaci nepravdivá a pokud jsou obe klauzule pravdivé, težko odvodíme nesplnitelnost formule vstupní (input) řezoluce: neúplná alespon jedna z klauzulí, použitá pri rezoluci, je z výchozí vstupní množiny S Hana Rudová, Logické programování I, 13. kvetna 2011 126 Rezoluce vPL1 Varianty rezoluční metody Veta: Každé omezení rezoluče je korektní. stále víme, že to, čo jsme dokázali, platí & T-rezoluče: klauzule učastníčí se rezoluče nejsou tautologie úplná -i- tautologie nepomuže ukázat, že formule je nesplnitelná JS> sémantičká rezoluče: úplná zvolíme libovolnou interpretači a pro rezoluči používáme jen takové klauzule, z ničhž alespon jednaje v této interpretači nepravdivá a pokud jsou obe klauzule pravdivé, težko odvodíme nesplnitelnost formule JS> vstupní (input) rezoluče: neúplná alespon jedna z klauzulí, použitá pri rezoluči, je z výčhozí vstupní množiny S {{p, q}, {-p, q}, {p, -q}, {-p, -q}} existuje rezoluční vyvráčení neexistuje rezoluční vyvráčení pomočí vstupní rezoluče Hana Rudová, Logičké programování I, 13. kvetna 2011 126 Rezoluče v PL1 Rezoluce a logické programování Lineární rezoluce varianta rezolucní metody a snaha o generování lineární posloupnosti místo stromu v každém kroku krome prvního mužeme použít bezprost r edne p redcházející rezolventu a k tomu bud' nekterou z klauzulí vstupní množiny S nebo nekterou z p r edcházejících rezolvent C0^B0 C2 B2 c Hana Rudová, Logické programování I, 13. kvetna 2011 128 Rezoluce a logické programování Lineární rezoluce varianta rezolucní metody snaha o generování lineární posloupnosti místo stromu v každém kroku krome prvního mužeme použít bezprostredne predcházející rezolventu a k tomu bud' nekterou z klauzulí vstupní množiny S nebo nekterou z predcházejících rezolvent lineární rezolucní důkaz C z S je posloupnost dvojic , ... (Cn,Bn) taková, že C = Cn+1 a C0 a každá Bi jsou prvky S nebo nekteré Cj,j < i J» každá Ci+1, i < n je rezolventa Ci a Bi C0^B0 C2 B2 c Hana Rudová, Logické programování I, 13. kvetna 2011 128 Rezoluce a logické programování Lineární rezoluce varianta rezolucní metody snaha o generování lineární posloupnosti místo stromu v každém kroku krome prvního mužeme použít bezprostredne predcházející rezolventu a k tomu bud' nekterou z klauzulí vstupní množiny S nebo nekterou z predcházejících rezolvent lineární rezolucní důkaz C z S je posloupnost dvojic , ... (Cn,Bn) taková, že C = Cn+1 a C0 a každá Bi jsou prvky S nebo nekteré Cj,j < i J» každá Ci+1, i < n je rezolventa Ci a Bi lineární vyvrácení S = lineární rezolucní důkaz □ z S C0^B0 C2 B2 c Hana Rudová, Logické programování I, 13. kvetna 2011 128 Rezoluce a logické programování Lineární rezoluce II. -í* príklad: S = {A1, A2, A3, A4} A1= {p,q} A2 = {p, -q} A3 = {-p,q} A4 = {-p, -q} Hana Rudová, Logické programování I, 13. kvetna 2011 129 Rezoluce a logické programování Lineární rezoluče II. -í* príklad: S = {A1,A2,Ab,A4} Ai = { p, q} A2 = {p, -q} Ab = {-p,q} A4 = {-p, -q} C, Bi {p,q}{p, -1q} \/ {p} {^p,q} IX {^p} {p} □ Hana Rudová, Logičké programování I, l3. kvetna 20ll l29 Rezoluče a logičké programování Lineární rezoluce II. -í* príklad: S = {A1,A2,A3,A4} A1 = {p,g} A2 = {p, -g} A3 = {-p,g} A4 = {-p, -g} & S: vstupní množina klauzulí & Ci: strední klauzule Bi: bocní klauzule C Bi {p,q}{p, -1 q} {p} {^p,q} IX {^p} {p} □ Hana Rudová, Logické programování I, 13. kvetna 2011 129 Rezoluce a logické programování Přologovská notace & Klauzule v matematické logice {Hi, ■■■ ,Hm,-Ti, ■■■ ,-Tn} Hi v--- v Hm v -Ti v ■ ■ ■ v -Tn Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notače & Klauzule v matematičké logiče {Hi, ■■■ ,Hm,-Ti, --- ,-Tn} Hi V ---V Hm V -Ti V - - - V -Tn & Hornova klauzule: nejvýše jeden pozitivní literál {H,-Ti,...,-Tn} {H} {-Ti,...,-Tn} a H V -Ti V - - - V -Tn H -Ti V - - - V -Tn Hana Rudová, Logičké programování I, 13. kvetna 2011 130 Rezoluče a logičké programování Prologovská notace & Klauzule v matematické logice {H1, ■■■ ,Hm,-T1, ■■■ ,-Tn} H1 V--- V Hm V -T1 V ■ ■ ■ V -Tn & Hornova klauzule: nejvýše jeden pozitivní literál {H,-T1,...,-Tn} {H} {-T1,...,-Tn} a H V -T1 V ■ ■ ■ V -Tn H -T1 V ■ ■ ■ V -Tn -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál Prolog: H : - T1, ■ ■ ■ ,Tn. Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notače & Klauzule v matematičké logiče {Hi, --- ,Hm,-Ti, --- ,-Tn} Hi v ---v Hm v -Ti v - - - v -Tn & Hornova klauzule: nejvýše jeden pozitivní literál {H,-Ti,...,-Tn} {H} {-Ti,...,-Tn} a H v -Ti v - - - v -Tn H -Ti v - - - v -Tn JS> Pravidlo: jeden pozitivní a alespon jeden negativní literál J* Prolog: H : - Ti, - - - ,Tn. Matematičká logika: H <= Ti a - - - a Tn Hana Rudová, Logičké programování I, 13. kvetna 2011 130 Rezoluče a logičké programování Prologovská notace & Klauzule v matematické logice {Hi, ■■■ ,Hm,— Ti, ■■■ ,-Tn) Hi v--- v Hm v — Ti v ■ ■ ■ v — Tn ii> Hornova klauzule: nejvýše jeden pozitivní literal {H, —Ti,..., —Tn} {H} { — Ti,..., — Tn} a H v —Ti v ■ ■ ■ v — Tn H —Ti v ■ ■ ■ v —Tn JS> Pravidlo: jeden pozitivní a alespon jeden negativní literal & Prolog: H : - Ti, ■ ■ ■ ,Tn. Matematická logika: H <= Ti a ■ ■ ■ a Tn H <= T Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice {H1, ■■■ ,Hm,-T1, ■■■ ,-Tn} H1 v--- v Hm v -T1 v ■ ■ ■ v -Tn & Hornova klauzule: nejvýše jeden pozitivní literál {H,-T1,...,-Tn} {H} {-T1,...,-Tn} a H v -T1 v ■ ■ ■ v -Tn H -T1 v ■ ■ ■ v -Tn -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál & Prolog: H : - T1, ■ ■ ■ ,Tn. Matematická logika: H <= T1 a ■ ■ ■ a Tn Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice {H1, ■■■ ,Hm,-T1, ■■■ ,-Tn} H1 v--- v Hm v -T1 v ■ ■ ■ v -Tn & Hornova klauzule: nejvýše jeden pozitivní literál a H v -T1 v ■ ■ ■ v -Tn H -T1 v ■ ■ ■ v -Tn -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál J* Prolog: H : - T1, ■ ■ ■ ,Tn. Matematická logika: H <= T1 a ■ ■ ■ a Tn m» H <= T H v-T H v-T v ■ ■ ■ v-Tn Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice {H1, ■■■ ,Hm,-T1, ■■■ ,-Tn} H1 v--- v Hm v -T1 v ■ ■ ■ v -Tn & Hornova klauzule: nejvýše jeden pozitivní literál a H v -T1 v ■ ■ ■ v -Tn H -T1 v ■ ■ ■ v -Tn -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál J* Prolog: H : - T1, ■ ■ ■ , Tn. Matematická logika: H <= T1 a ■ ■ ■ a Tn m» H <= T H V-T H v-T1 v ■ ■ ■ v-Tn Klauzule: {H,-T1,..., -Tn} Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice [Hu --- ,Hm,-Ti, --- ,-Tn} Hi v ---v Hm v -Ti v - - - v -Tn & Hornova klauzule: nejvýše jeden pozitivní literal [H,-Ti,...,-Tn} [H} [-Ti,...,-Tn} a H v -T1 v - - - v -Tn H -T1 v - - - v -Tn JS> Pravidlo: jeden pozitivní a alespon jeden negativní literal & Prolog: H : - T1, - - - ,Tn. Matematická logika: H <= T1 a - - - a Tn J* H <= T H v-T H v-T1 v---v-Tn Klauzule: [H,-T1,..., -Tn} -í* Fakt: pouze jeden pozitivní literal Prolog: H. Matematická logika: H Klauzule: [H} Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice {H1, ■■■ ,Hm,-T1, ■■■ ,-Tn} H1 v--- v Hm v -T1 v ■ ■ ■ v -Tn & Hornova klauzule: nejvýše jeden pozitivní literál {H,-T1,...,-Tn} {H} {-T1,...,-Tn} a H v -T1 v ■ ■ ■ v -Tn H -T1 v ■ ■ ■ v -Tn -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál J* Prolog: H : - T1, ■ ■ ■ ,Tn. Matematická logika: H <= T1 a ■ ■ ■ a Tn m» H <= T H v-T H v-T1 v ■ ■ ■ v-Tn Klauzule: {H,-T1,..., -Tn} JS> Fakt: pouze jeden pozitivní literál Prolog: H. Matematická logika: H Klauzule: {H} & Cílová klauzule: žádný pozitivní literál J* Prolog: : - T1,... Tn. Matematická logika: -T1 v ■ ■ ■ v -Tn Klauzule: {-T1, ■ ■ ■ -Tn} Hana Rudová, Logické programování I, 13. kvetna 2011 130 Rezoluce a logické programování Logický program Programová klauzule: práve jeden pozitivní literál (fakt nebo pravidlo) Logický program: konecná množina programových klauzulí Príklad: Sľ logický program jako množina klauzulí: P = {P1.P2.P3} P1 = {p}. P2 = {p. -q}, P3 = {q} Hana Rudová, Logické programování I, 13. kvetna 2011 131 Rezoluce a logické programování Logický program Programová klauzule: práve jeden pozitivní literál (fakt nebo pravidlo) Logíčký program: konečná množina programovýčh klauzulí Príklad: a logičký program jako množina klauzulí: P = {Pi,P2,P3} Pi = {p}, P2 = {p, -q}, P3 = {q} & logičký program v prologovské notači: p. p: -q. q. a čílová klauzule: G = {-q, -p} : -q, p. Hana Rudová, Logické programování I, 13. května 2011 131 Rezoluce a logické programování Lineářní řezoluce přo Hořnovy klauzule & Zacneme s cílovou klauzulí: C0 = G & Bocní klauzule vybíráme z programových klauzulí P M G = {-q,-p} P ={Pi,P2,Pb} : Pi = {p}, P2 = {p, -q}, P3 = {q} : -q, p. p. p : -q, q. Hana Rudová, Logické programování I, 13. kvetna 2011 132 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule St Zacneme s cílovou klauzulí: C0 = G St Bocní klauzule vybíráme z programových klauzulí P MG = {-q,-p} P ={P1,P2,P3} : P1 = {p}, P2 = {p, -q}, P3 = {q} * : -q,p. p. p: -q, q. {^q,^p} {q} {^p} {p} □ Hana Rudová, Logické programování I, 13. kvetna 2011 132 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule Zacneme s cílovou klauzulí: Co = G Bocní klauzule vybíráme z programových klauzulí P G = {-q,-p} P = {P1,P2,Pb} : P1 = {p}, P2 = {p, -q}, P3 = {q} : -q,p. p. p: -q, q. {^p} {p} {^q} {q} □ □ Hana Rudová, Logické programování I, 13. kvetna 2011 132 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule JS* Zacneme s cílovou klauzulí: Co = G St Bocní klauzule vybíráme z programových klauzulí P MG = {-q.-p} P ={P1.P2.P3} : P1 = {p}. P2 = {p. -q}. P3 = {q} * : -q.p- p. p: -q. q. □ □ JS> St rední klauzule jsou cílové klauzule Hana Rudová, Logické programování I, 13. kvetna 2011 132 Rezoluce a logické programování Lineární vstupní rezoluce Vstupní rezoluce na P u {G} -i* (opakování:) alespon jedna z klauzulí použitá p r i rezoluci je z výchozí vstupní množiny & zacneme s cílovou klauzulí: C0 = G & bocní klauzule jsou vždy z P (tj. jsou to programové klauzule) Hana Rudová, Logické programování I, 13. kvetna 2011 133 Rezoluce a logické programování Lineářní vstupní řezoluce Vstupní řezoluce na P u {G} -i* (opakování:) alespon jedna z klauzulí použitá pri rezoluci je z výchozí vstupní množiny & zacneme s cílovou klauzulí: Co = G & bocní klauzule jsou vždy z P (tj. jsou to programové klauzule) (Opakování:) Lineářní řezolucní dukaz C z P je posloupnost dvojic (Co,Bo>, ... (Cn,Bn) taková, že C = Cn+i a C0 a každá Bi jsou prvky P nebo nekteřé Cj,j < i S» každá Ci+i, i < n je rezolventa Ci a Bi Hana Rudová, Logické programování I, 13. kvetna 2011 133 Rezoluce a logické programování Lineární vstupní rezoluče & Vstupní rezoluče na P u {G} S» (opakování:) alespon jedna z klauzulí použitá pri rezoluči je z výčhozí vstupní množiny & začneme s čílovou klauzulí: C0 = G J* boční klauzule jsou vždy z P (tj. jsou to programové klauzule) JS* (Opakování:) Lineární rezoluční dukaz C z P je posloupnost dvojič (Co,Bo), ... (Cn,Bn) taková, že C = Cn+i a C0 a každá Bi jsou prvky P nebo nekteré Cj,j < i S* každá Ci+i, i < n je rezolventa Ci a Bi Lineární vstupní (Linear Input) rezoluče (LI-rezoluče) C z P u {G} posloupnost dvojič {Co,Bo), ... {Cn,Bn) taková, že C = Cn+i a a C0 = G a každá Bi jsou prvky P lineární rezoluče + vstupní rezoluče a každá Ci+i, i < n je rezolventa Ci a Bi Hana Rudová, Logičké programování I, 13. kvetna 2011 133 Rezoluče a logičké programování Cíle a fakta pri lineární rezolučí JS> Veta: Je-li S nesplnitelná množina Hornovýčh klauzulí, pak S obsahuje alespon jeden číl a jeden fakt. ± pokud nepoužiji číl, mám pouze fakta (1 pozit.literál) a pravidla (1 pozit.literál a alespon jeden negat. literál), pri rezoluči mi stále zustává alespon jeden pozit. literál Hana Rudová, Logičké programování I, 13. kvetna 2011 134 Rezoluče a logičké programování Cíle a fakta pri lineární rezoluci JS> Veta: Je-li S nesplnitelná množina Hornových klauzulí, pak S obsahuje alespon jeden cíl a jeden fakt. ± pokud nepoužiji cíl, mám pouze fakta (1 pozit.literál) a pravidla (1 pozit.literál a alespon jeden negat. literál), pri rezoluci mi stále zůstává alespon jeden pozit. literál -fc pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 pozit.literál a alespon jeden negat. literál), v rezolvente mi stále zustávají negativní literály Hana Rudová, Logické programování I, 13. kvetna 2011 134 Rezoluce a logické programování Cíle a fakta p r i lineární rezoluci JS> Veta: Je-li S nesplnitelná množina Hornových klauzulí, pak S obsahuje alespon jeden cíl a jeden fakt. ± pokud nepoužiji cíl, mám pouze fakta (1 pozit.literál) a pravidla (1 pozit.literál a alespon jeden negat. literál), p r i rezoluci mi stále zustává alespon jeden pozit. literál -fc pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 pozit.literál a alespon jeden negat. literál), v rezolvente mi stále zustávají negativní literály Veta: Existuje-li rezolucní dukaz prázdné množiny z množiny S Hornových klauzulí, pak tento rezolucní strom má v listech jedinou cílovou klauzuli. pokud zacnu dukaz pravidlem a faktem, pak dostanu zase pravidlo -i- pokud zacnu dukaz dvema pravidly, pak dostanu zase pravidlo A na dvou faktech rezolvovat nelze Hana Rudová, Logické programování I, 13. kvetna 2011 134 Rezoluce a logické programování Cíle a fakta p r i lineární rezoluci JS> Veta: Je-li S nesplnitelná množina Hornových klauzulí, pak S obsahuje alespon jeden cíl a jeden fakt. ± pokud nepoužiji cíl, mám pouze fakta (1 pozit.literál) a pravidla (1 pozit.literál a alespon jeden negat. literál), pri rezoluci mi stále zůstává alespon jeden pozit. literál -fc pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 pozit.literál a alespon jeden negat. literál), v rezolvente mi stále zustávají negativní literály veta: Existuje-li rezolucní dukaz prázdné množiny z množiny S Hornových klauzulí, pak tento rezolucní strom má v listech jedinou cílovou klauzuli. pokud zacnu dukaz pravidlem a faktem, pak dostanu zase pravidlo -i- pokud zacnu dukaz dvema pravidly, pak dostanu zase pravidlo A na dvou faktech rezolvovat nelze == dokud nepoužiji cíl pracuji stále s množinou faktu a pravidel Hana Rudová, Logické programování I, 13. kvetna 2011 134 Rezoluce a logické programování Cíle a fakta p r i lineární rezoluci JS> Veta: Je-li S nesplnitelná množina Hornových klauzulí, pak S obsahuje alespon jeden cíl a jeden fakt. ± pokud nepoužiji cíl, mám pouze fakta (1 pozit.literál) a pravidla (1 pozit.literál a alespon jeden negat. literál), pri rezoluci mi stále zustává alespon jeden pozit. literál -fc pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 pozit.literál a alespon jeden negat. literál), v rezolvente mi stále zustávají negativní literály veta: Existuje-li rezolucní dukaz prázdné množiny z množiny S Hornových klauzulí, pak tento rezolucní strom má v listech jedinou cílovou klauzuli. pokud zacnu dukaz pravidlem a faktem, pak dostanu zase pravidlo -i- pokud zacnu dukaz dvema pravidly, pak dostanu zase pravidlo A na dvou faktech rezolvovat nelze => dokud nepoužiji cíl pracuji stále s množinou faktu a pravidel ± pokud použiji v dukazu cílovou klauzulí, fakta mi ubírají negat.literály, pravidla mi je pridávají, v rezolvente mám stále samé negativní literály, tj. nelze rezolvovat s dalším cílem Hana Rudová, Logické programování I, 13. kvetna 2011 134 Rezoluce a logické programování Korektnost a úplnost Veta: Množina S Hornových klauzulí je nesplnitelná, práve když existuje rezolucní vyvrácení S pomocí vstupní rezoluce. M Korektnost platí stejne jako pro ostatní omezení rezoluce * Úplnost LI-rezoluce pro Hornovy klauzule: Necht' P je množina programových klauzulí a G cílová klauzule. Je-li množina P u {G} Hornových klauzulí nesplnitelná, pak existuje rezolucní vyvrácení P u {G} pomocí LI-rezoluce. A vstupní rezoluce pro (obecnou) formuli sama o sobe není úplná => LI-rezoluce aplikovaná na (obecnou) formuli nezarucuje, že nalezeneme dukaz, i když formule platí! Hana Rudová, Logické programování I, 13. kvetna 2011 135 Rezoluce a logické programování Korektnost a úplnost Veta: Množina S Hornovýčh klauzulí je nesplnitelná, práve když existuje rezoluční vyvráčení S pomočí vstupní rezoluče. M Korektnost platí stejne jako pro ostatní omezení rezoluče * Úplnost LI-rezoluče pro Hornovy klauzule: Nečht' P je množina programovýčh klauzulí a G čílová klauzule. Je-li množina P u {G} Hornovýčh klauzulí nesplnitelná, pak existuje rezoluční vyvráčení P u {G} pomočí LI-rezoluče. A vstupní rezoluče pro (obečnou) formuli sama o sobe není úplná => LI-rezoluče aplikovaná na (obečnou) formuli nezaručuje, že nalezeneme dukaz, i když formule platí! & Význam LI-rezoluče pro Hornovy klauzule: i* P = {Pi, . . . , Pn}, G = {G i ,...,Gm} iľ LI-rezolučí ukážeme nesplnitelnost Pi a • • • a Pn a (-Gi v • • • v -Gm) Hana Rudová, Logičké programování I, 13. kvetna 2011 135 Rezoluče a logičké programování Kořektnost a úplnost Veta: Množina S Hornových klauzulí je nesplnitelná, práve když existuje rezolucní vyvrácení S pomocí vstupní řezoluce. M Kořektnost platí stejne jako pro ostatní omezení rezoluce * Úplnost Ll-řezoluce přo Hořnovy klauzule: Necht' P je množina programových klauzulí a G cílová klauzule. Je-li množina P u {G} Hornových klauzulí nesplnitelná, pak existuje rezolucní vyvrácení P u {G} pomocí LI-rezoluce. A vstupní rezoluce pro (obecnou) formuli sama o sobe není úplná => LI-rezoluce aplikovaná na (obecnou) formuli nezarucuje, že nalezeneme dukaz, i když formule platí! & Význam Ll-řezoluce přo Hořnovy klauzule: i* P = {Pi, . . . , Pn}, G = {Gi ,...,Gm} iľ LI-rezolucí ukážeme nesplnitelnost Pi a ■ ■ ■ a Pn a (-Gi v ■ ■ ■ v -Gm) A pokud tedy predpokládáme, že program {Pi,.. .,Pn} platí, tak musí být nepravdivá (-Gi v ■ ■ ■ v -Gm), tj. musí platit Gi a ■ ■ ■ a Gm Hana Rudová, Logické programování I, 13. kvetna 2011 135 Rezoluce a logické programování Uspořádané klauzule (definite clauses) Klauzule = množina literálů JS> Uspořádaná klauzule (definite clause) = posloupnost liteřálů -fc nelze volne menit poradí literálů £ Rezoluční princip přo uspořádané klauzule: _I-Aq, -An}_{B, -Bq,-Bm\_ I-Aq,—Ai-i, -BqP, —BmP,—Ai+\,—An}v M uspořádaná řezolventa: {-Aq, -Ai-\, -B0p,—Bmp,—Ai+\,-An}cr &> p je přejmenování promenných takové, že klauzule {Aq, .. .,An} a {B,Bq, .. .,Bm}p nemají společné promenné ± a je nejobecnejší unifikátor pro Ai a Bp Hana Rudová, Logické programování I, 13. kvetna 2011 136 Rezoluce a logické programování Uspo rádané klauzule (definite clauses) JS> Klauzule = množina literálů JS> Uspo rádáná klauzule (definite clause) = posloupnost literálů -fc nelze volne menit poradí literálů £ RezoluCní princip pro uspo rádané klauzule: _I-Aq, -An}_{B, -Bq,-Bm\_ I-Aq,—Ai-i, -BqP, —BmP,—At+i,—An}v M uspo rádaná rezolventa: {-Aq, -Ai-\, -B0p,—Bmp,—Ai+\,-An}cr &> p je přejmenování promenných takové, že klauzule {Aq, .. .,An} a {B,Bq, .. .,Bm}p nemají společné promenné ± a je nejobecnejší unifikátor pro Ai a Bp -í* rezoluce je realizována na literálech —Aia a Bpa je dodržováno poradí literálu, tj. {-B0p,—Bmp}a jde do uspo rádané rezolventy p resne na pozici —Aia Hana Rudová, Logické programování I, 13. kvetna 2011 136 Rezoluce a logické programování Usporádané klauzule II. C Usporádáné klauzule _{-Ao,-An}_{B, -Bo,-Bm\_ {-Ao,-Ai-1, -Bop,-BmP,-Ai+1,-An} Lineární rezoluce se selekcním pravidlem = SLD-rezoluce (Selected Linear resolution for Definite clauses) J» rezoluce & Selekcní pravidlo Jr Lineární rezoluce a Definite (usporádané) klauzule a vstupní rezoluce -i* Selekcní pravidlo R je funkce, která každé neprázdné klauzuli C prirazuje nejaký z jejích literálu R(C) g C -i- pri rezoluci vybírám z klauzule literál urcený selekcním pravidlem Hana Rudová, Logické programování I, 13. kvetna 2011 139 Rezoluce a logické programování SLD-rezoluče JS> Lineární rezoluče se selekčním pravidlem = SLD-rezoluče (Selected Linear resolution for Definite clauses) J» rezoluče & Selekční pravidlo Jr Lineární rezoluče a Definite (uspořádané) klauzule a vstupní rezoluče -i* Selekční pravidlo R je funkče, která každé neprázdné klauzuli C prirazuje nejaký z jejíčh literálu R(C) e C -i- pri rezoluči vybírám z klauzule literál určený selekčním pravidlem & Pokud se R neuvádí, pak se predpokládá výber nejlevejšího literálu nejlevejší literál vybírá i Prolog Hana Rudová, Logičké programování I, 13. kvetna 2011 139 Rezoluče a logičké programování Lineární rezoluce se selekcním pravidlem P = {{p}, {p, -q}, {q}}, G = {-q,-p} {^q,^pj {q} {^q,^p} {p} výber j výber | y/ nejlevejšího {^P} Jp} nejpravejšího Jq} literálu ' / literálu ' ^ □ □ Hana Rudová, Logické programování I, 13. kvetna 2011 140 Rezoluce a logické programování Lineářní řezoluce se selekcním přavidlem P = {{p}, {p, -q}, {q}}, G = {-q,-p} {^q,^pj {q} {^q,^p} {p} výber | výber | y/ nejlevejšího {^P} Jp} nejpravejšího Jq} literálu ' / literálu ' ^ □ □ SLD-řezolucní vyvřácení P u {G} pomocí selekcního pravidla R je LD-rezolucní vyvrácení (G0,C0>,(Gn,Cn> takové, že G = G0,Gn+i = □ a R(Gi) je literál rezolvovaný v kroku i Hana Rudová, Logické programování I, 13. kvetna 2011 140 Rezoluce a logické programování Lineární rezoluce se selekcním pravidlem JS> SLD-rezolucní vyvrácení P u {G} pomocí selekčního pravidla R je LD-rezoluční vyvrácení (Go,C0),(Gn,Cn) takové, že G = G0,Gn+\ = □ a R(Gi) je literál rezolvovaný v kroku i M SLD-rezoluce - korektní, úplná -í* Efektivita SLD-rezoluce je závislá na selekcním pravidle R & zpusobu výberu príslušné programové klauzule pro tvorbu rezolventy v Prologu se vybírá vždy klauzule, která je v programu první n literálu □ Hana Rudová, Logické programování I, 13. kvetna 2011 140 Rezoluce a logické programování P ř íklad: SLD-strom t: -p,r. t : -5. p : -q, v. p : - u, w q. s. u. (1) (2) (3) (4) (5) (6) (7) : t. :-p,r. (3)/ \(4) :- s. (5) :- v,r. fall :- u,w,r. (7) :- w,r. .(6) □ fall Hana Rudová, Logické programování I, 13. května 2011 141 Rezoluce a logické programování Střom výpoctu (SLD-střom) SLD-střom je strom tvorený všemi možnými výpocetními posloupnostmi logického programu P vzhledem k cíli G Hana Rudová, Logické programování I, 13. kvetna 2011 142 Rezoluce a logické programování Strom výpočtu (SLD-strom) SLD-strom je strom tvorený všemi možnými výpočetními posloupnostmi logičkého programu P vzhledem k číli G -í* koreny stromy jsou programové klauzule a čílová klauzule G -i* vuzlečhjsou rezolventy -í* výčhozím korenem rezoluče je čílová klauzule G Hana Rudová, Logičké programování I, 13. kvetna 2011 142 Rezoluče a logičké programování Strom výpočtu (SLD-strom) SLD-strom je strom tvorený všemi možnými výpočetními posloupnostmi logičkého programu P vzhledem k číli G koreny stromy jsou programové klauzule a čílová klauzule G vuzlečhjsou rezolventy výčhozím korenem rezoluče je čílová klauzule G listy jsou dvojího druhu: -fc označené prázdnou klauzulí - jedná se o úspešné uzly (succes nodes) &> označené neprázdnou klauzulí - jedná se o neúspešné uzly (failure nodes) Hana Rudová, Logičké programování I, 13. kvetna 2011 142 Rezoluče a logičké programování Střom výpoctu (SLD-střom) SLD-střom je strom tvorený všemi možnými výpocetními posloupnostmi logického programu P vzhledem k cíli G koreny stromy jsou programové klauzule a cílová klauzule G v uzlech jsou rezolventy výchozím korenem rezoluce je cílová klauzule G listy jsou dvojího druhu: -fc oznacené prázdnou klauzulí - jedná se o úspešné uzly (succes nodes) A" oznacené neprázdnou klauzulí - jedná se o neúspešné uzly (failure nodes) úplnost SLD-rezoluce zarucuje existenci cesty od korene k úspešnému uzlu pro každý možný výsledek príslušející cíli G Hana Rudová, Logické programování I, 13. kvetna 2011 142 Rezoluce a logické programování Př íklad: SLD-strom a výsledná substituce : -a(Z). a(X) : -b(X,Y),c(Y) a(X) : -c(X). b(2, 3). b(l, 2). c(2). (1) (2) (3) (4) (5) :- a(Z). :- b(Z,Y), c(Y). :- c(Z). [Z/2,Y/3] (3) / \4) [Z/1,Y/2] \ (5) [Z/2] :- c(3). fall :- c(2). (5) □ [Z/1] □ [Z/2] Hana Rudová, Logické programování I, 13. května 2011 143 Rezoluce a logické programování Príklad: SLD-strom a výsledná substituce : -a(Z). a(X) : -b(X,Y),c(Y) a(X) : -c(X). b(2, 3). b(l, 2). c (2). Cvicení: p(B) : -q(A,B),r(B). p (A) : -q(A,A). q(a, a). q(a, b). r(b). (1) (2) (3) (4) (5) :- a(Z). (\y \2) :- b(Z,Y), c(Y). :- c(Z). [Z/2,Y/3] \(4) [Z/1,Y/2] \ (5) [Z/2] :- c(3). fall :- c(2). (5) □ [Z/1] □ [Z/2] ve výsledné substituci jsou pouze promenné z dotazu, tj. výsledné substituce jsou [Z/l] a [Z/2] nezajímá me substituce [Y/2] Hana Rudová, Logické programování I, 13. kvetna 2011 143 Rezoluce a logické programování Výsledná substituce (answer substitution) q(a). — P(X,Y). q(a). [X/a] p(a,b). I / :- p(a,Y). p(a,b). [Y/b] :-q(X), p(X,Y). / X=a, Y=b □ [X/a,Y/b] Hana Rudová, Logické programování I, 13. května 2011 144 Rezoluce a logické programování Výsledná substituce (answer substitution) q(a). — P(X,Y). q(a). [X/a] p(a,b). I / :- p(a,Y). p(a,b). [Y/b] :-q(X), p(X,Y). / X=a, Y=b □ [X/a,Y/b] JS> Každý krok SLD-rezoluce vytváří novou unifikacní substituci Qi => potenciální instanciace proměnné ve vstupní cílové klauzuli & Výsledná substituce (answer substitution) Q = QqQi • • • Qn složení unifikací Hana Rudová, Logické programování I, 13. kvetna 2011 144 Rezoluce a logické programování Význam SLD-rezolucního vyvrácení P u {G} C Množina P programových klauzulí, cílová klauzule G & Dokazujeme nesplnitelnost (1) P a (vX)(-GAX) v -Gz(X) v ■ ■ ■ v -Gn(Xl)) kde G = {-G1, -G2, ■ ■ ■ , - Gn} a X je vektor proměnných v G Hana Rudová, Logické programování I, 13. kvetna 2011 145 Rezoluce a logické programování Význam SLD-rezolucního vyvrácení P u {G} C Množina P programových klauzulí, cílová klauzule G & Dokazujeme nesplnitelnost (1) P a (VX)(-G1(X) v -G2(X) v ■ ■ ■ v -Gn(X)) kde G = {-G1, -G2, ■ ■ ■ , -Gn} a X je vektor promenných v G nesplnitelnost (1) je ekvivalentní tvrzení (2) a (3) (2) P h -G (3) P h (3X)(G1(X) a —a Gn(XÍ)) Hana Rudová, Logické programování I, 13. kvetna 2011 145 Rezoluce a logické programování Význam SLD-rezolucního vyvrácení P u {G} C Množina P programových klauzulí, cílová klauzule G & Dokazujeme nesplnitelnost (1) P A (VX)(-G1(X) v -Gz(X) v - - - v -Gn(X)) kde G = {-G1, — G2, - - - , -Gn} a X je vektor promenných v G nesplnitelnost (1) je ekvivalentní tvrzení (2) a (3) (2) P h -G (3) P h (3X)(G1(X) A---A Gn(XÍ)) a jedná se tak o dukaz existence vhodných objektů, které na základe vlastností množiny P splnují konjunkci literálů v cílové klauzuli Hana Rudová, Logické programování I, 13. kvetna 2011 145 Rezoluce a logické programování Význam SLD-rezolucního vyvrácení P u {G} C Množina P programových klauzulí, cílová klauzule G & Dokazujeme nesplnitelnost (1) P A (VX)(-GAX) v -G2(X) v - - - v -Gn(X)) kde G = {-G1. -G2. - - - . -Gn} a X je vektor promenných v G nesplnitelnost (1) je ekvivalentní tvrzení (2) a (3) (2) P h -G (3) P h (3X)(G1(X) A---A Gn(XÍ)) a jedná se tak o dukaz existence vhodných objektů, které na základe vlastností množiny P splnují konjunkci literálů v cílové klauzuli Dukaz nesplnitelnosti P u {G} znamená nalezení protip r íkladu ten pomocí SLD-stromu konstruuje termy (odpoveď) splnující konjunkci v (3) Hana Rudová, Logické programování I, 13. kvetna 2011 145 Rezoluce a logické programování Výpocetní střategie M Kořektní výpocetní střategie prohledávání stromu výpoctu musí zarucit, že se každý (konecný) výsledek nalézt v konecném case Hana Rudová, Logické programování I, 13. kvetna 2011 146 Rezoluce a logické programování Výpočetní strategie Korektní výpočetní strategie prohledávání stromu výpočtu musí zaručit, že se každý (konečný) výsledek nalézt v konečném čase & Korektní výpočetní strategie = prohledávání stromu do šírky & exponenčiální pamet'ová náročnost a složité rídíčí struktury Hana Rudová, Logičké programování I, 13. kvetna 2011 146 Rezoluče a logičké programování Výpocetní střategie M Kořektní výpocetní střategie prohledávání stromu výpoctu musí zarucit, že se každý (konecný) výsledek nalézt v konecném case & Korektní výpocetní strategie = přohledávání střomu do šířky & exponenciální pamet'ová nárocnost a složité rídící struktury JS> Použitelná výpocetní strategie = přohledávání střomu do hloubky & jednoduché rídící struktury (zásobník) * lineární pamet'ová nárocnost s> není ale úplná: nenalezne vyvrácení i když existuje procházení nekonecné vetve stromu výpoctu => na nekonecných stromech dojde k zacyklení nedostaneme se tak na jiné existující úspešné uzly Hana Rudová, Logické programování I, 13. kvetna 2011 146 Rezoluce a logické programování SLD-rezoluce v Prologu: úplnost -í* Prolog: prohledávání stromu do hloubky => neúplnost použité výpocetní strategie -i* Implementace SLD-rezoluce v Prologu a není úplná logický program: q : —r. (1) r : —q. (2) q. (3) dotaz: : —q. :- q. :- r. □ Hana Rudová, Logické programování I, 13. kvetna 2011 147 Rezoluce a logické programování Test výskytu Kontrola, zda se promenná vyskytuje v termu, kterým ji substituujeme A dotaz : -a(B,B). i> logický program: a(X,f(X)). vede k: [B/X], [X/f(X)] Unifikátor pro g(X1, ...,Xn) a g(f(Xo,Xo),f(X1,X1),.. .,f(Xn-1,Xn-1)) X1 = f(Xo,Xo), X2 = f(X1,Xi),..., Xn = f(Xn-1,Xn-1) X2 = f (f (Xo,Xo), f (Xo,Xo)),... délka termu pro Xk exponenciálne narůstá Hana Rudová, Logické programování I, 13. kvetna 2011 14S Rezoluce a logické programování Test výskytu -í* Kontrola, zda se proměnná vyskytuje v termu, kterým ji substituujeme A dotaz : -a(B,B). i> logický program: a(X,f(X)). vede k: [B/X], [X/f(X)] & Unifikátor pro g(Xi, ...,Xn) a g(f(Xo,Xo),f(Xi,Xi),.. .,f(Xn-i,Xn-i)) Xi = f(Xo,Xo), X2 = f(Xi,Xi),..., Xn = f(Xn-l,Xn-l) X2 = f (f (Xo,Xo), f (Xo,Xo)),... délka termu pro Xk exponenciálne narůstá => exponenciální složitost na overení kontroly výskytu & Test výskytu se p r i unifikaci v Prologu neprovádí * Dusledek: ? - X = f(X) uspeje s X = f (f (f (f (f (f (f (f (f (f (...)))))))))) Hana Rudová, Logické programování I, 13. kvetna 2011 148 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost -í* Implementace SLD-rezoluce v Prologu nepoužívá pri unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(X,f(X)). X = f (f(f(f (...)))))))))) problém se projeví Hana Rudová, Logické programování I, 13. kvetna 2011 149 Rezoluce a logické programování SLD-rezoluče v Prologu: korektnost -í* Implementače SLD-rezoluče v Prologu nepoužívá pri unifikači test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(X,f(X)). X = f (f(f(f (...)))))))))) problém se projeví (2) t : -p(X,X). : -t. p(X,f(X)). yes dokazovačí systém nehledá unifikátor pro X a f(X) Hana Rudová, Logičké programování I, 13. kvetna 2011 149 Rezoluče a logičké programování SLD-rezoluce v Prologu: korektnost -í* Implementace SLD-rezoluce v Prologu nepoužívá pri unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(X,f(X)). X = f (f(f(f (...)))))))))) problém se projeví (2) t : -p(X,X). : -t. p(X,f(X)). yes dokazovací systém nehledá unifikátor pro X a f(X) & Rešení: problém typu (2) prevést na problém typu (1) ? Hana Rudová, Logické programování I, 13. kvetna 2011 149 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost Implementace SLD-rezoluce v Prologu nepoužívá pri unifikaci test výskytu není korektní (1) t(X) : -p(X,X). : -t(X). p(X,f(X)). X = f (f(f(f (...)))))))))) problém se projeví (2) t : -p(X,X) p(X,f(X)). : -t. yes dokazovací systém nehledá unifikátor pro X a f(X) Rešení: problém typu (2) prevést na problém typu (1) ? *> každá promenná v hlave klauzule se objeví i v tele, aby se vynutilo hledání unifikátoru (pridáme X = X pro každou X, která se vyskytuje pouze v hlave) t: -p(X,X). p(X,f(X)) : -X = X. Hana Rudová, Logické programování I, 13. kvetna 2011 149 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost Implementace SLD-rezoluce v Prologu nepoužívá pri unifikaci test výskytu není korektní (1) t(X) : -p(X,X). : -t(X). p(X,f(X)). X = f (f(f(f (...)))))))))) problém se projeví (2) t : -p(X,X) p(X,f(X)). : -t. yes dokazovací systém nehledá unifikátor pro X a f(X) Řešení: problém typu (2) převést na problém typu (1) ? *> každá promenná v hlave klauzule se objeví i v tele, aby se vynutilo hledání unifikátoru (pridáme X = X pro každou X, která se vyskytuje pouze v hlave) t: -p(X,X). p(X,f(X)) : -X = X. a optimalizace v kompilátoru mohou způsobit opet odpoved' „yes" Hana Rudová, Logické programování I, 13. kvetna 2011 149 Rezoluce a logické programování Řízení implementace: JS> rez se syntakticky chová jako kterýkoliv jiný literál & nemá ale žádnou deklarativní sémantiku JS> místo toho mení implementaci programu *> p : —q, !,v. ořezání Hana Rudová, Logické programování I, 13. kvetna 2011 150 Rezoluce a logické programování Řízení implementace: rez rez se syntakticky chová jako kterýkoliv jiný literál nemá ale žádnou deklarativní sémantiku místo toho mení implementaci programu p : -q, !,v. snažíme se splnit q pokud uspeji => preskocím rez a pokracuji jako by tam rez nebyl :- q,!,v. upnutí ořezání pokud ale neuspěji (a tedy i p ř i backtrackingu) a vracím se p řes řez => vracím se až na rodiCe : -p. a zkouším další vetev Hana Rudová, Logické programování I, 13. kvetna 2011 150 Rezoluce a logické programování Řízení implementace: řez r ez se syntakticky chová jako kterýkoliv jiný literál nemá ale žádnou deklarativní sémantiku místo toho mení implementaci přogřamu p : -q, !,v. snažíme se splnit q pokud uspeji => p reskocím rez a pokracuji jako by tam r ez nebyl :- q,!,v. upnutí ořezání pokud ale neuspeji (a tedy i při backtřackingu) a vřacím se přes řez => vřacím se až na řodice : -p. a zkouším další vetev ^ nezkouším tedy další možnosti, jak splnit p upnutí => a nezkouším ani další možnosti, jak splnit q v SLD-stromu o r ezání Hana Rudová, Logické programování I, 13. kvetna 2011 150 Rezoluce a logické programování Př íklad: řez t: -p,r. t: -s. p : -q(X), \,v, p : -u,w. q(a). q(b). s. u. (D (2) (3) (4) (5) (6) (7) (8) (D/ \<2) :- p,r. :- q(X),!,v,r. [X/a] (5) :- ! v r (!) :- v, r. fail (7) □ Hana Rudová, Logické programování I, 13. května 2011 151 Rezoluce a logické programování a(X) : -b(X, Y),\,c(Y) a(X) : -c(X). b(2, 3). b(l, 2). c(2). s(X) : -a(X). s(X) : -p(X). p(B) : -q(A,B),r(B). p (A) : -q(A,A). q(a, a). q(a, b). r(b). Příklad: řez II (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) :- s(X). (6) / \ (7) :— a(X). :- b(X,Y),!,c(Y). [X/2,Y/3] (3) :— !,c(3). (rez) :— c(3). fail Hana Rudová, Logické programování I, 13. kvetna 2011 152 Rezoluce a logické programování a(X) : -b(X,Y),c(Y),! a(X) : -c(X). b(2, 3). b(l, 2). c(2). s(X) : -a(X). s(X) : -p(X). p(B) : -q(A,B),r(B). p(A) : -q(A,A). q(a, a). q(a, b). r(b). Priklad: rez III (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) :- s(X). (6) / \(7) (1l :- a(X). :- b(X,Y),c(Y),!. [X/2,Y/3] (3^ \ (4) [X/1,Y/2] :- c(3),!. :- c(2),!. fail (5) • • • (rez) □ [X/1] Hana Rudova, Logicke programovani I, 13. kvetna 2011 153 Rezoluce a logicke programovani Operacní a deklarativní semantika Operacní sémantika Operacní sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez promenných, které lze pro nejaký cíl G1 odvodit nejakým rezolucním dukazem ze vstupní množiny P u {G}. 1tímto výrazem jsou míneny všechny cíle, pro než zmínený rezolucní dukaz existuje. Hana Rudová, Logické programování I, 13. kvetna 2011 155 Sémantiky Operacní sémantika Operacní sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez proměnných, které lze pro nejaký cíl G1 odvodit nejakým rezolucním dukazem ze vstupní množiny P u {G}. 1tímto výrazem jsou míneny všechny cíle, pro než zmínený rezolucní dukaz existuje. iS* Deklarativní sémantika logického programu P ??? Hana Rudová, Logické programování I, 13. kvetna 2011 155 Sémantiky Opakování: interpretace -i* Interpretace I jazyka L je dána univerzem D a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v D a predikátovému symbolu p/n n-ární relaci. príklad: F = {{f(a,b) = f (b,a)}, {f(f(a,a),b) = a}} interpretace ?i: D = Z, a := 1,b := -1,f := " + " Hana Rudová, Logické programování I, 13. kvetna 2011 156 Sémantiky Opakování: interpretace -i* Interpretace I jazyka L je dána univerzem D a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v D a predikátovému symbolu p/n n-ární relaci. príklad: F = {{f(a,b) = f (b,a)}, {f(f(a,a),b) = a}} interpretace ?i: D = Z, a := 1,b := -1,f := " + " JS> Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá interpretace množiny N s obvyklými operacemi je modelem formule ( 0 + s(0) = s(0)) Hana Rudová, Logické programování I, 13. kvetna 2011 156 Sémantiky Herbrandovy interpretace Omezení na obor skládající se ze symbolických výrazU tvorených z predikátových a funkcních symbolU daného jazyka i* pri zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretacemi Hana Řudová, Logické programování I, 13. kvetna 2011 157 Sémantiky Herbrandovy interpretace Omezení na obor skládající se ze symbolických výrazu tvo rených z predikátových a funkcních symbolu daného jazyka i* pri zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretacemi Herbrandovo univerzum: množina všech termů bez proměnných, které mohou být tvoreny funkcními symboly a konstantami daného jazyka Herbrandova interpretace: libovolná interpretace, která prirazuje i* promenným prvky Herbrandova univerza Jť konstantám sebe samé J* funkcním symbolům funkce, které symbolu f pro argumenty t1, • • • ,tn priradí term f(t1, • • • ,tn) J* predikátovým symbolům libovolnou funkci z Herbrand. univerza do pravdivostních hodnot Hana Rudová, Logické programování I, 13. kvetna 2011 157 Sémantiky Herbrandovy interpretace & Omezení na obor skládající se ze symbolických výrazů tvorených z predikátových a funkcních symbolů daného jazyka i* pri zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretacemi JS> Herbrandovo univerzum: množina všech termů bez promenných, které mohou být tvoreny funkcními symboly a konstantami daného jazyka i* promenným prvky Herbrandova univerza Jť konstantám sebe samé J* funkcním symbolům funkce, které symbolu f pro argumenty t\, • • • ,tn priradí term f(t\, • • • ,tn) J* predikátovým symbolům libovolnou funkci z Herbrand. univerza do pravdivostních hodnot & Herbrandův model množiny uzavrených formulí P: Herbrandova interpretace taková, že každá formule z P je v ní pravdivá. prirazuje Hana Řudová, Logické programování I, 13. kvetna 2011 157 Sémantiky Specifikace Herbrandova modelu C Herbrandovy interpretace mají preddefinovaný význam funktoru a konstant -í* Pro specifikaci Herbrandovy interpretace tedy stací zadat relace pro každý predikátový symbol Hana Rudová, Logické programování I, 13. kvetna 2011 158 Sémantiky Specifikace Heřbřandova modelu C Herbrandovy interpretace mají p r eddefinovaný význam funktorů a konstant & Pro specifikaci Herbrandovy interpretace tedy stací zadat relace pro každý predikátový symbol & Príklad: Herbrandova interpretace a Herbranduv model množiny formulí 1ichy(s(0)). % (1) 1ichy(s(s(X))) :- lichy(X). % (2) Hana Rudová, Logické programování I, 13. kvetna 2011 158 Sémantiky Spečifikače Herbrandova modelu C Herbrandovy interpretače mají preddefinovaný význam funktorů a konstant -í* Pro spečifikači Herbrandovy interpretače tedy stačí zadat relače pro každý predikátový symbol & Príklad: Herbrandova interpretače a Herbrandův model množiny formulí 1ichy(s(0)). % (1) 1ichy(s(s(X))) :- lichy(X). % (2) & li = 0 není model (1) Hana Rudová, Logičké programování I, 13. kvetna 2011 158 Sémantiky Specifikace Herbrandova modelu C Herbrandovy interpretace mají preddefinovaný význam funktorů a konstant ü> Pro specifikaci Herbrandovy interpretace tedy staCí zadat relace pro každý predikátový symbol & Príklad: Herbrandova interpretace a HerbrandUv model množiny formulí 1ichy(s(0)). % (1) 1ichy(s(s(X))) :- lichy(X). % (2) a ?i = 0 není model (1) a 12 = {lichy(s(0))} není model (2) Hana Rudová, Logické programování I, 13. kvetna 2011 158 Sémantiky Specifikace Herbrandova modelu C Herbrandovy interpretace mají preddefinovaný význam funktoru a konstant -í* Pro specifikaci Herbrandovy interpretace tedy staCí zadat relace pro každý predikátový symbol & Príklad: Herbrandova interpretace a Herbranduv model množiny formulí 1ichy(s(0)). % (1) 1ichy(s(s(X))) :- lichy(X). % (2) a ?i = 0 není model (1) a 12 = {lichy(s(0))} není model (2) I3 = {lichy (s (0)), lichy(s(s(s(0))))} není model (2) Hana Rudová, Logické programování I, 13. kvetna 2011 158 Sémantiky Specifikace Herbrandova modelu C Herbrandovy interpretace mají preddefinovaný význam funktorů a konstant ü> Pro specifikaci Herbrandovy interpretace tedy staCí zadat relace pro každý predikátový symbol & Príklad: Herbrandova interpretace a Herbrandův model množiny formulí 1ichy(s(0)). % (1) 1ichy(s(s(X))) :- lichy(X). % (2) a I1 = 0 není model (1) a 12 = {lichy (s(0))} není model (2) 13 = {lichy (s(0)), lichy(s(s(s(0))))} není model (2) 14 = {lichy (sn(0))\n g {1, 3, 5, 7,...}} Herbrandův model (1) i (2) Hana Rudová, Logické programování I, 13. kvetna 2011 158 Sémantiky Spečifikače Herbrandova modelu Herbrandovy interpretače mají preddefinovaný význam funktom a konstant Pro spečifikači Herbrandovy interpretače tedy stačí zadat relače pro každý predikátový symbol Príklad: Herbrandova interpretače a Herbranduv model množiny formulí 1ichy(s(G)). % (1) 1ichy(s(s(X))) i- lichy(X). % (2) ^ li = 0 není model (1) a l2 = {lichy(s(0))} není model (2) 13 = {lichyis (0)), lichy (s (s (s (0))))} není model (2) 14 = {lichy (sn(0))\n e {i, 3, 5, V,...}} Herbranduv model (1) i (2) Is = {lichy(sn(0))\n e N}} Herbranduv model (1) i (2) Hana Rudová, Logičké programování I, 1B. kvetna 2G11 1SS Sémantiky Príklad: Herbrandovy interpretace rodic(a,b). rodic(b,c). predek(X,Y) predek(X,Z) :- rodic(X,Y). :- rodic(X,Y), predek(Y,Z). Hana Rudová, Logické programování I, 13. kvetna 2011 159 Sémantiky P r íklad: Herbrandovy interpretace rodic(a,b). rodic(b,c). predek(X,Y) :- rodic(X,Y). predek(X,Z) :- rodic(X,Y), predek(Y,Z). 11 = {rodic(a, b),rodic(b, c),predek(a, b),predek(b, c),predek(a, c)} 12 = {rodic(a,b),rodic(b,c), predek(a, b), predek(b, c), predek(a, c), predek(a, a)} I1 i 12 jsou Herbrandovy modely klauzulí Hana Rudová, Logické programování I, 13. kvetna 2011 159 Sémantiky a operacní sémantika ii> Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelů S, pak průnik techto modelů je opet Herbrandův model množiny S. JS> Důsledek: Existuje nejmenší Herbrandův model množiny S, který znacíme M(S). Hana Rudová, Logické programování I, 13. kvetna 2011 160 Sémantiky a operacní sémantika ii> Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelu S, pak průnik techto modelů je opet Herbrandův model množiny S. JS> Důsledek: Existuje nejmenší Herbrandův model množiny S, který znacíme M(S). -á* Deklarativní sémantikou logického programu P rozumíme jeho minimální Herbrandův model M(P). Hana Řudová, Logické programování I, 13. kvetna 2011 160 Sémantiky a operační sémantika ii> Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelů S, pak průnik techto modelů je opet Herbrandův model množiny S. JS> Důsledek: Existuje nejmenší Herbrandův model množiny S, který znacíme M(S). -á* Deklarativní sémantikou logického programu P rozumíme jeho minimální Herbrandův model M(P). & Operační sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez promenných, které lze pro nejaký cíl G1 odvodit nejakým rezolucním dukazem ze vstupní množiny P u (G). 1tímto výrazem jsou míneny všechny cíle, pro než zmínený rezolucní dukaz existuje. Hana Rudová, Logické programování I, 13. kvetna 2011 160 Sémantiky a operacní sémantika ii> Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelu S, pak průnik techto modelů je opet Herbrandův model množiny S. JS> Důsledek: Existuje nejmenší Herbrandův model množiny S, který znacíme M(S). -á* Deklarativní sémantikou logického programu P rozumíme jeho minimální Herbrandův model M(P). & Operacní sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez promenných, které lze pro nejaký cíl G1 odvodit nejakým rezolucním důkazem ze vstupní množiny P u (G). 1tímto výrazem jsou míneny všechny cíle, pro než zmínený rezolucní dukaz existuje. -i* Pro libovolný logický program P platí M(P) = O(P) Hana Rudová, Logické programování I, 13. kvetna 2011 160 Sémantiky Negače v logičkém programování Negativní znalost JS> logické programy vyjadrují pozitivní znalost negativní liteřály: pozice urcena definicí Hornových klauzulí => nelze vyvodit negativní informaci z logického programu & každý predikát definuje úplnou relaci i* negativní literál není logickým dusledkem programu Hana Rudová, Logické programování I, 13. kvetna 2011 162 Negace v logickém programování Negativní znalost JS> logičké programy vyjadrují pozitivní znalost negativní literály: poziče určena definičí Hornovýčh klauzulí => nelze vyvodit negativní informači z logičkého programu & každý predikát definuje úplnou relači iť negativní literál není logičkým dusledkem programu relače vyjádreny expličitne v nejmenším Herbrandove modelu -i- nad(X, Y) : -na(X, Y). na(c,b). nad(X, Y) : -na(X, Z),nad(Z, Y). na(b, a). J* nejmenší Herbranduv model: {na(b,a),na(c, b),nad(b,a),nad(c, b),nad(c,a)} Hana Rudová, Logičké programování I, 13. kvetna 2011 162 Negače v logičkém programování Negativní znalost JS> logické programy vyjadrují pozitivní znalost negativní literály: pozice uníena definicí Hornových klauzulí => nelze vyvodit negativní informaci z logického programu & každý predikát definuje úplnou relaci i* negativní literál není logickým dusledkem programu & relace vyjádreny explicitne v nejmenším Herbrandove modelu -i- nad(X,Y) : -na(X,Y). na(c,b). nad(X, Y) : -na(X, Z),nad(Z, Y). na(b, a). J* nejmenší Herbrandův model: {na(b,a),na(c, b),nad(b,a),nad(c, b),nad(c,a)} JS> ani program ani model nezahrnují negativní informaci A a není nad c, a není na c S* i v realite je negativní informace vyjadrena explicitne zrídka, napr. jízdní rád Hana Rudová, Logické programování I, 13. kvetna 2011 162 Negace v logickém programování Predpoklad uzavreného sveta neexistence informace chápána jako opak: predpoklad uzavřeného sveta (closed world assumption, CWA) prevzato z databází urcitý vztah platí pouze když je vyvoditelný z programu. P \£ A „odvozovací pravidlo" (A je (uzavrený) term):-— (CWA) Hana Řudová, Logické programování I, 13. kvetna 2011 163 Negace v logickém programování Předpoklad uzavřeného sveta neexistence informace chápána jako opak: předpoklad uzavřeného sveta (closed world assumption, CWA) prevzato z databází urcitý vztah platí pouze když je vyvoditelný z programu. P ^ A „odvozovací pravidlo" (A je (uzavrený) term):-— (CWA) —A pro SLD-rezoluci: P ^ nad(a,c), tedy lze podle CWA odvodit —nad(a,c) Hana Rudová, Logické programování I, 13. kvetna 2011 163 Negace v logickém programování P redpoklad uzav reného sveta C neexistence informace chápána jako opak: p r edpoklad uzav r eného sveta (closed world assumption, CWA) -í* prevzato z databází & urcitý vztah platí pouze když je vyvoditelný z programu. pro SLD-rezoluci: P £ nad(a,c), tedy lze podle CWA odvodit -nad(a,c) & problém: není rozhodnutelné, zda daná atomická formule je logickým důsledkem daného logického programu. -** nelze tedy urát, zda pravidlo CWA je aplikovatelné nebo ne ii> CWA v logickém programování obecne nepoužitelná. JS> „odvozovací pravidlo" (A je (uzavrený) term): P £ A (CWA) A Hana Rudová, Logické programování I, 13. kvetna 2011 163 Negace v logickém programování Negace jako neúspěch (negation as failure) slabší verze CWA: definitivně neúspěšný (finitely failed) SLD-strom cíle : -A : -A má definitivně (koneCne) neúspešný SLD-strom -A (negation as failure, NF) normální cíl: cíl obsahující i negativní literály -í* : -nad(c,a), -nad(b,c). Hana Rudová, Logické programování I, 13. kvetna 2011 164 Negace v logickém programování Negace jako neúspěch (negation as failure) slabší verze CWA: definitivně neúspěšný (finitely failed) SLD-strom cíle : -A : -A má definitivně (koneCne) neúspešný SLD-strom -A (negation as failure, NF) M normální cíl: cíl obsahující i negativní literály -í* : -nad(c,a), -nad(b,c). -í* rozdíl mezi CWA a NF -i- program nad(X,Y) : -nad(X, Y), cíl : --nad(b,c) it neexistuje odvození cíle podle NF, protože SLD-strom : -nad(b,c) je nekonecný it existuje odvození cíle podle CWA, protože neexistuje vyvrácení: -nad(b,c) Hana Rudová, Logické programování I, 13. května 2011 164 Negace v logickém programování Negace jako neúspěch (negation as failure) £ slabší verze CWA: definitívne neúspešný (finitely failed) SLD-strom cíle : -A : -A má definitívne (konecne) neúspešný SLD-strom -A (negation as failure, NF) M normální cíl: cíl obsahující i negativní literály -í* : -nad(c,a), -nad(b,c). -í* rozdíl mezi CWA a NF -i- program nad(X,Y) : -nad(X, Y), cíl : --nad(b,c) neexistuje odvození cíle podle NF, protože SLD-strom : -nad(b,c) je nekonecný A existuje odvození cíle podle CWA, protože neexistuje vyvrácení: -nad(b,c) M CWA i NF jsou nekorektní: A není logickým dusledkem programu P & rešení: definovat programy tak, aby jejich dusledkem byly i negativní literály zúplnení logického programu Hana Řudová, Logické programování I, 13. kvetna 2011 164 Negace v logickém programování Podstata zúplnení logického přogřamu prevod všech if príkazu v logickém programu na iff nad(X,Y) : -na(X,Y). nad(X, Y) : -na(X, Z),nad(Z,Y). -i* lze psát jako: nad(X,Y) : -(na(X,Y)) v (na(X, Z),nad(Z,Y)). &> zúplnení: nad(X,Y) — (na(X,Y)) v (na(X,Z),nad(Z,Y)). Hana Rudová, Logické programování I, 13. kvetna 2011 165 Negace v logickém programování Podstata zúplnení logického programu prevod všech if príkazů v logickém programu na iff nad(X,Y) : -na(X,Y). nad(X, Y) : -na(X, Z),nad(Z,Y). -i* lze psát jako: nad(X,Y) : -(na(X,Y)) v (na(X, Z),nad(Z,Y)). zúplnení: nad(X,Y) (na(X,Y)) v (na(X,Z),nad(Z,Y)). X je nad Y práve tehdy, když alespon jedna z podmínek platí A tedy pokud žádná z podmínek neplatí, X není nad Y Hana Rudová, Logické programování I, 13. kvetna 2011 165 Negace v logickém programování Podstata zúplnení logického programu prevod všech if príkazu v logickém programu na iff nad(X,Y) : -na(X,Y). nad(X, Y) : -na(X, Z),nad(Z,Y). -i* lze psát jako: nad(X,Y) : -(na(X,Y)) v (na(X,Z),nad(Z,Y)). zúplnení: nad(X,Y) (na(X,Y)) v (na(X,Z),nad(Z,Y)). X je nad Y práve tehdy, když alespon jedna z podmínek platí A tedy pokud žádná z podmínek neplatí, X není nad Y JS> kombinace klauzulí je možná pouze pokud mají identické hlavy S> na(c,b). na(b, a). S* lze psát jako: na(X1,X2) : -Xi = c,X2 = b. na(X1,X2) : -X1 = b,X2 = a. -i- zúplnení: na(X1,X2) (X1 = c,X2 = b) v (X1 = b,X2 = a). Hana Rudová, Logické programování I, 13. kvetna 2011 165 Negace v logickém programování Zúplnení programu Zúplnení programu P je: comp(P) := IFF(P) u CET -í* Základní vlastnosti: *> comp(P) ^ P s do programuje pridána pouze negativní informace Hana Řudová, Logické programování I, 13. kvetna 2011 166 Negace v logickém programování Zúplnení programu Zúplnení programu P je: comp(P) := IFF(P) u CET -í* Základní vlastnosti: *> comp(P) i= P s do programuje pridána pouze negativní informace & IFF(P): spojka : - v IF(P) je nahrazena spojkou — & IF(P): množina všech formulí IF(q,P) pro všechny predikátové symboly q v programu P J* Cíl: definovat IF(q,P) & def(p/n) predikátu p/n je množina všech klauzulí predikátu p/n Hana Rudová, Logické programování I, 13. kvetna 2011 166 Negace v logickém programování na(Xi,X2) : = c,X2 = b,f(Y)) v X = b,X2 = a,#). q/n predikátový symbol programu P na(c,b):-f(Y). na(b,a): ^ X1, ...,Xn jsou „nové" promenné, které se nevyskytují nikde v P Necht' C je klauzule ve tvaru q(t1, . . . , tn) : —L1, . . . , Lm kde m > 0, t1,...,tn jsou termy a L1,Lm jsou literály. Pak označme E(C) výraz 3Y1,Yk(X1 = t1,...,Xn = tn,L1,... ,Lm) kde Y1,...,Yk jsou všechny promenné v C. Hana Rudová, Logické programování I, 13. kvetna 2011 167 Negace v logickém programování IF(q, P) na(Xi,X2) : -SY(Xi = c,X2 = b, f (Y)) v (Xi = b,X2 = a, g). q/n predikátový symbol programu P na(c,b):-f(Y). na(b,a): -g. X1, ...,Xn jsou „nové" promenné, které se nevyskytují nikde v P Necht' C je klauzule ve tvaru q(t1, . . . ,tn) : —L1, . . . , Lm kde m > 0, t1,...,tn jsou termy a L1,Lm jsou literály. Pak označme E(C) výraz 3Y1,Yk(X1 = t1,...,Xn = tn,L1,... ,Lm) kde Y1,...,Yk jsou všechny promenné v C. Necht' def(q/n) = {C1,Cj}. Pak formuli IF(q,P) získáme následujícím postupem: q(X1, ...,Xn) : -E(C1) v E(C2) v • • • v E(Cj) pro j> 0 a q(X1,... ,Xn) : - □ pro j = 0 [q/n není v programu P] Hana Rudová, Logické programování I, 13. kvetna 2011 167 Negace v logickém programování Clarkova Teorie Rovnosti (CET) všechny formule jsou univerzálne kvantifikovány: 1. X = X 2. X = Y - Y = X 3. X = Y a Y = Z - X = Z 4. pro každý f/m: Xi = Yi a • • • a Xm = Ym - /(Xi,...,Xm) = f(Yi,...,Ym) 5. pro každý p/m: Xi = Yi a • • • a Xm = Ym - (p(Xi,... ,Xm) - p(Yi,... ,Ym)) 6. pro všechny různé f /m a g/n, (m,n > 0): f(Xi,... ,Xm) = g(Yi,Yn) 7. pro každý f /m: f(Xi ,...,Xm) = f(Yi,...,Ym) - Xi = Yi a • • • a Xm = Ym 8. pro každý term t obsahující X jako vlastní podterm: t = X X = Y je zkrácený zápis -(X = Y) Hana Rudová, Logické programování I, 13. kvetna 2011 168 Negace v logickém programování Korektnost a úplnost NF pravidla & Korektnost NF pravidla: Nečht' P logičký program a : -A číl. Jestliže : -A má definitívne neúspešný SLD-strom, pak \/(-A) je logičkým dusledkem comp(P) (nebo-li comp(P) \= \/(-A)) Hana Rudová, Logičké programování I, 13. kvetna 2011 169 Negače v logičkém programování Korektnost a úplnost NF pravidla & Korektnost NF pravidla: Necht' P logický program a : -A cíl. Jestliže : -A má definitívne neúspešný SLD-strom, pak V(-A) je logickým dusledkem comp(P) (nebo-li comp(P) £ V(-A)) JS> Úplnost NF pravidla: Necht' P je logický program. Jestliže comp(P) £ V(-A), pak existuje definitivne neúspešný SLD-strom : -A. -i- zůstává problém: není rozhodnutelné, zda daná atomická formule je logickým důsledkem daného logického programu. teorém mluví pouze o existenci definitivne neúspešného SLD-stromu J* definitivne (konecne) neúspešný SLD-strom sice existuje, ale nemusíme ho nalézt napr. v Prologu: muže existovat konecné odvození, ale program presto cyklí (Prolog nenajde definitivne neúspešný strom) Hana Rudová, Logické programování I, 13. kvetna 2011 169 Negace v logickém programování Korektnost a úplnost NF pravidla & Korektnost NF pravidla: Necht' P logický program a : -A cíl. Jestliže : -A má definitívne neúspešný SLD-strom, pak V(-A) je logickým dusledkem comp(P) (nebo-li comp(P) i= V(-A)) JS> Úplnost NF pravidla: Necht' P je logický program. Jestliže comp(P) = V(-A), pak existuje definitivne neúspešný SLD-strom : -A. it zůstává problém: není rozhodnutelné, zda daná atomická formule je logickým důsledkem daného logického programu. teorém mluví pouze o existenci definitivne neúspešného SLD-stromu j* definitivne (konecne) neúspešný SLD-strom sice existuje, ale nemusíme ho nalézt napr. v Prologu: muže existovat konecné odvození, ale program presto cyklí (Prolog nenajde definitivne neúspešný strom) M Odvození pomocí NF pouze test, nelze konstruovat výslednou substituci j* v(comp(P) = V(-A))je A všeob. kvantifikováno, v V(-A) nejsou volné promenné Hana Rudová, Logické programování I, 13. kvetna 2011 169 Negace v logickém programování Normální a stratifikované programy & normální program: obsahuje negativní literály v pravidlech JS> problém: existence zúplnení, která nemají žádný model p : --p. zúplnení: p — -p C- rozdelení programu na vrstvy & vynucují použití negace relace pouze tehdy pokud je relace úplne definovaná Hana Rudová, Logické programování I, 13. kvetna 2011 170 Negace v logickém programování Normální a stratifikované programy & normální program: obsahuje negativní literály v pravidlečh JS> problém: existenče zúplnení, která nemají žádný model p : --p. zúplnení: p -p M rozdelení programu na vrstvy & vynučují použití negače relače pouze tehdy pokud je relače úplne definovaná ± a. a. a : -—b, a. a : -—b, a. b. b : --a. Hana Rudová, Logičké programování I, 13. kvetna 2011 170 Negače v logičkém programování Nořmální a střatifikované přogřamy & nořmální přogřam: obsahuje negativní literály v pravidlech & problém: existence zúplnení, která nemají žádný model p : -—p. zúplnení: p — —p M rozdelení programu na vrstvy J* vynucují použití negace relace pouze tehdy pokud je relace úplne definovaná ±> a. a. a : -—b, a. a : -—b, a. b. b : -—a. stratifikovaný není stratifikovaný Hana Rudová, Logické programování I, 13. května 2011 170 Negace v logickém programování Normální a stratifikované programy & normální program: obsahuje negativní literály v pravidlech JS> problém: existence zúplnení, která nemají žádný model p : --p. zúplnení: p -p M rozdelení programu na vrstvy & vynucují použití negace relace pouze tehdy pokud je relace úplne definovaná ± a. a. a : -—b, a. a : -—b, a. b. b : -—a. stratifikovaný není stratifikovaný & normální program P je stratifikovaný: množina predikátových symbolu programu lze rozdelit do disjunktních množin S0,...,Sm (St = stratum) *> p(...) : - q(...),... g P, p g Sk => q g S0 u ... u Sk p(...) : - —q(...),... g P, p g Sk => q g S0 u ... u Sk-i Hana Řudová, Logické programování I, 13. kvetna 2011 170 Negace v logickém programování Stratifikované programy II program je m-stratifikovaný <^> m je nejmenší index takový, že S0 u ... u Sm je množina všech predikátových symbolu z P & Veta: Zúplnení každého stratifikovaného programu má Herbranduv model. & p : --p. nemá Herbrandův model a p : --p. ale není stratifikovaný Hana Rudová, Logické programování I, 13. kvetna 2011 171 Negace v logickém programování Stratifikované programy II program je m-stratifikovaný <^> m je nejmenší index takový, že S0 u ... u Sm je množina všečh predikátovýčh symbolu z P & Veta: Zúplnení každého stratifikovaného programu má Herbranduv model. & p : - — p. nemá Herbrandův model a p : - — p. ale není stratifikovaný & stratifikované programy nemusí mít jedinečný minimální Herbrandův model & cykli: -—zastavi. s* dva minimální Herbrandovy modely: {cykli}, {zastavi} M dusledek toho, že cykli: -—zastavi. je ekvivalentní cykli v zastavi Hana Rudová, Logičké programování I, 13. kvetna 2011 171 Negače v logičkém programování SLDNF rezoluce: úspešné odvození C NF pravidlo: : - C. má konecne neúspešný SLD-strom £ Pokud máme negativní podcíl —C v dotazu G, pak hledáme dukaz pro C & Pokud odvození C selže (strom pro C je konecne neúspešný), pak je odvození G (i — C) celkove úspešné nahore(X) : -—blokovaný(X). blokovaný(X) : -na(Y,X). na(a, b). Hana Rudová, Logické programování I, 13. kvetna 2011 172 Negace v logickém programování NF pravidlo: -C -í* Pokud máme negativní podcíl —C v dotazu G, pak hledáme dukaz pro C & Pokud odvození C selže (strom pro C je konecne neúspešný), pak je odvození G (i -C) celkove úspešné nahore(X) : -—blokovaný(X). blokovaný (X) : -na(Y,X). na(a, b). : -nahore(c). yes :- nahore(c). :- blokovany(c). ■ :-— blokovany(c). ■ :- na(Y,c). FAIL => uspešné odvození Hana Rudová, Logické programování I, 13. kvetna 2011 172 Negace v logickém programování SLDNF rezoluce: neúspešné odvození C NF pravidlo: : - C má konecne neúspešný SLD-strom JS> Pokud máme negativní podcíl -C v dotazu G, pak hledáme dukaz pro C & Pokud existuje vyvrácení C s prázdnou substitucí (strom pro C je koneCne úspešný), pak je odvození G (i -C) celkove neúspešné nahore(X) : --blokovaný(X). blokovaný(X) : -na(Y,X). na(_, _). Hana Rudová, Logické programování I, 13. kvetna 2011 173 Negace v logickém programování NF pravidlo: C Pokud máme negativní podcíl ->C v dotazu G, pak hledáme důkaz pro C & Pokud existuje vyvrácení C s prázdnou substitucí (strom pro C je konecne úspešný), pak je odvození G (i — C) celkove neúspešné nahore(X) : -—blokovaný(X). blokovaný (X) : -na(Y,X). na(_, _). : -nahore(X). no :- nahore(X). :- blokovany(X). ■ blokovany(X). ■ :- na(Y,X). □ => neúspešné odvození Hana Rudová, Logické programování I, 13. kvetna 2011 173 Negace v logickém programování SLDNF rezoluce: uvázlé odvození C NF pravidlo: : - C. má konecne neúspešný SLD-strom ——C -í* Pokud máme negativní podcíl —C v dotazu G, pak hledáme důkaz pro C & Pokud existuje vyvrácení C s neprázdnou substitucí (strom pro C je konecne úspešný), pak je odvození G (i —C) uvázlé nahore(X) : -—blokovaný(X). blokovaný(X) : -na(Y,X). na(a, b). Hana Řudová, Logické programování I, 13. kvetna 2011 174 Negace v logickém programování SLDNF řezoluce: uvázlé odvození C NF pravidlo: : - C. má konecne neúspešný SLD-strom —C JS> Pokud máme negativní podcíl — C v dotazu G, pak hledáme dukaz pro C £ Pokud existuje vyvřácení C s nepřázdnou substitucí (střom přo C je koneCne úspešný), pak je odvození G (i — C) uvázlé nahore(X) : -—blokovaný(X). blokovaný(X) : -na(Y,X). na(a, b). : -nahore(X). :- nahore(X). :- blokovany(X). blokovany(X). :- na(Y,X). | [Y/a,X/b] ^ => uvázlé odvození [X/b] Hana Rudová, Logické programování I, 13. kvetna 2011 174 Negace v logickém programování SLD+ odvození P je normální program, G0 normální cíl, R selekcní pravidlo: SLD+-odvození G0 je bud' konecná posloupnost ,Gi nebo nekonecná posloupnost (Go; Co>, (Gi; Ci>, (G2; C2>,... kde v každém kroku m + i (m > 0), R vybírá pozitivní literál v Gm a dospívá k Gm+i obvyklým způsobem. Hana Rudová, Logické programování I, 13. kvetna 2011 175 Negace v logickém programování SLD+ odvození P je normální program, G0 normální číl, R selekční pravidlo: SLD+-odvození G0 je bud' konečná posloupnost (Go, Co),..., (Gi-i, Ci-i), Gi nebo nekonečná posloupnost (Go, Co), (Gi, Ci), (G2, C2),... kde v každém kroku m + l(m > 0), R vybírá pozitivní literál v Gm a dospívá k Gm+i obvyklým zpusobem. muže být: 2. neúspešné 3. blokované: Gi je negativní (napr. —A) Hana Rudová, Logičké programování I, 13. kvetna 2011 175 Negače v logičkém programování SLDNF rezoluce: pojmy & Úroveň cíle a P normální program, G0 normální cíl, R selekční pravidlo: úroveň cíle G0 se rovná 0 <^> žádné SLD+-odvození s pravidlem R není blokováno 3 k + 1 <^> maximální úroven cílů : -A, které ve tvaru -A blokují SLD+-odvození G0, je k ±> nekonecná úroven Hana Rudová, Logické programování I, 13. kvetna 2011 176 Negace v logickém programování SLDNF rezoluce: pojmy Úroven cíle a P normální program, G0 normální cíl, R selekcní pravidlo: úroven cíle G0 se rovná 0 <^> žádné SLD+-odvození s pravidlem R není blokováno > k + 1 <^> maximální úroven cílu : -A, které ve tvaru —A blokují SLD+-odvození G0, je k 3 nekonecná úroven cíle: blokované SLDNF odvození Množina SLDNF odvození = {(SLDNF odvození G0) u (SLDNF odvození: -A)} Jr pri odvozování G0 jsme se dostali k cíli —A SLDNF odvození cíle G ? Hana Rudová, Logické programování I, 13. kvetna 2011 176 Negace v logickém programování SLDNF rezoluce P normální program, G0 normální cíl, R selekcní pravidlo: množina SLDNF odvození a podmnožina neúspešných SLDNF odvození cíle G0 jsou takové nejmenší množiny, že: & každé SLD+-odvození G0 je SLDNF odvození G0 & je-li SLD+-odvození , ...,Gi blokováno na -A tj. Gi je tvaru : - Li,..., Lm-i, -A, Lm+i,... ,Ln pak Hana Rudová, Logické programování I, 13. kvetna 2011 177 Negace v logickém programování SLDNF rezoluce P normální program, G0 normální cíl, R selekcní pravidlo: množina SLDNF odvození a podmnožina neúspešných SLDNF odvození cíle G0 jsou takové nejmenší množiny, že: & každé SLD+-odvození G0 je SLDNF odvození G0 & je-li SLD+-odvození (Go; Co>, ...,Gi blokováno na —A tj. Gi je tvaru : - Li,..., Lm-\, —A, Lm+\,... ,Ln pak a existuje-li SLDNF odvození: -A (pod R) s prázdnou cílovou substitucí, pak (G0; C0>, ...,Gi je neúspešné SLDNF odvození Hana Rudová, Logické programování I, 13. května 2011 177 Negace v logickém programování SLDNF rezoluce P normální program, G0 normální cíl, R selekcní pravidlo: množina SLDNF odvození a podmnožina neúspešných SLDNF odvození cíle G0 jsou takové nejmenší množiny, že: & každé SLD+-odvození G0 je SLDNF odvození G0 & je-li SLD+-odvození {G0; C0), ...,Gt blokováno na —A tj. Gt je tvaru : - Li,..., Lm-i, —A, Lm+i, ...,Ln pak a existuje-li SLDNF odvození: -A (pod R) s prázdnou cílovou substitucí, pak {G0; C0), ...,Gt je neúspešné SLDNF odvození & je-li každé úplné SLDNF odvození: -A (pod R) neúspešné pak {G0; C0), . . . , {Gt, £), (: - Ll, . . . , Lm-l, Lm+l, . . . , Ln) je (úspešné) SLDNF odvození cíle G0 e oznacuje prázdnou cílovou substituci Hana Řudová, Logické programování I, 13. kvetna 2011 177 Negace v logickém programování Typy SLDNF odvození Konecné SLDNF-odvození může být: 1. úspešné: Gi = □ 2. neúspešné 3. uvázlé (flounder): Gi je negativní (-A) a : -A je úspešné s neprázdnou cílovou substitucí 4. blokované: Gi je negativní (-A) a : -A nemá konecnou úroveň. Hana Rudová, Logické programování I, 13. kvetna 2011 178 Negace v logickém programování Korektnost a úplnost SLDNF odvození -í* korektnost SLDNF-odvozeňí: P normální program, : -G normální cíl a R je selekcní pravidlo: je-li 9 cílová substituce SLDNF-odvození cíle : -G, pak G9 je logickým důsledkem comp(P) Hana Rudová, Logické programování I, 13. kvetna 2011 179 Negace v logickém programování Korektnost a úplnost SLDNF odvození -í* korektnost SLDNF-odvození: P normální program, : -G normální číl a R je selekční pravidlo: je-li 9 čílová substituče SLDNF-odvození číle : -G, pak G9 je logičkým dusledkem čomp(P) S implementače SLDNF v Prologu není korektní Prolog nereší uvázlé SLDNF-odvození (neprázdná substituče) -i- použití bezpečnýčh číl u (negače neobsahuje promenné) Hana Rudová, Logičké programování I, 13. kvetna 2011 179 Negače v logičkém programování Korektnost a úplnost SLDNF odvození £ korektnost SLDNF-odvození: P normální program, : -G normální cíl a R je selekcní pravidlo: je-li 9 cílová substituce SLDNF-odvození cíle : -G, pak G9 je logickým důsledkem comp(P) S implementace SLDNF v Prologu není korektní Prolog ne reší uvázlé SLDNF-odvození (neprázdná substituce) -i- použití bezpecných cílů (negace neobsahuje promenné) úplnost SLDNF-odvození: SLDNF-odvození není úplné pokud existuje konecný neúspešný strom : -A, pak -A platí ale místo toho se odvozování: -A muže zacyklit, tj. SLDNF rezoluce -A neodvodí == -A tedy sice platí, ale SLDNF rezoluce ho nedokáže odvodit Hana Rudová, Logické programování I, 13. kvetna 2011 179 Negace v logickém programování Logické programování s omezujícími podmínkami Constraint Logic Programming: CLP CP: elektronické materiály & Dechter, R. Constraint Processing. Morgan Kaufmann Publishers, 2003. -i- http://www.ics.uci.edu/~dechter/books/materials.html prUsvitky ke knize Barták R. Prednáška Omezující podmínky na MFF UK, Praha. A http://kti.ms.mff.cuni.cz/~bartak/podminky/index.html & SICStus Prolog User's Manual. Kapitola o CLP(FD). i* http://www.fi.muni.cz/~hanka/sicstus/doc/html/ -í* Príklady v distribuci SICStus Prologu: cca 60 příkladů, zdrojový kód i lib/sicstus-*/library/clpfd/examples/ Hana Rudová, Logické programování I, 13. května 2011 181 Logické programování s omezujícími podmínkami Přobířané oblasti M Obsah úvod: od LP k CLP & základy programování a základní algoritmy pro rešení problémů s omezujícími podmínkami Hana Rudová, Logické programování I, 13. kvetna 2011 182 Logické programování s omezujícími podmínkami Probírané oblasti M Obsah úvod: od LP k CLP & základy programování a základní algoritmy pro rešení problémů s omezujícími podmínkami ii> Príbuzné prednášky na FI s PA163 Programování s omezujícími podmínkami viz interaktivní osnova IS *> PA167 Rozvrhování -v http://www.fi.muni.cz/~hanka/rozvrhovani zahrnuty CP techniky pro rešení rozvrhovacích problémů Hana Rudová, Logické programování I, 13. kvetna 2011 182 Logické programování s omezujícími podmínkami Historie a současnost & 1963 interaktivní grafika (Sutherland: Sketchpad) M Polovina 80. let: logické programování omezujícími podmínkami & Od 1990: komerCní využití JS* Už v roce 1996: výnos rádove stovky milionů dolarU & Aplikace - príklady a Lufthansa: krátkodobé personální plánování reakce na zmeny pri doprave (zpoždení letadla, ...) minimalizace zmeny v rozvrhu, minimalizace ceny J* Nokia: automatická konfigurace sw pro mobilní telefony Jt Renault: krátkodobé plánování výroby, funkcní od roku 1995 Hana Rudová, Logické programování I, 13. kvetna 2011 183 Logické programování s omezujícími podmínkami Omezení (constraint) JS> Dána a množina (doménových) promenných Y = jýi,... ,yk} konecná množina hodnot (doména) D = {D1,... ,Dk} Omezení c na Y je podmnožina D1 x ... x Dk a omezuje hodnoty, kterých mohou promenné nabývat soucasne Hana Rudová, Logické programování I, 13. kvetna 2011 184 Logické programování s omezujícími podmínkami Omezení (constraint) JS> Dána a množina (doménových) promenných Y = {ýi,... ,yk} Jt konecná množina hodnot (doména) D = {D1,... ,Dk} Omezení c na Y je podmnožina D1 x ... x Dk a omezuje hodnoty, kterých mohou promenné nabývat soucasne Príklad: proměnné: A,B -i- domény: {0,1} pro A {1,2} pro B Jt omezení: nebo (A,B) g {(0,1),(0,2),(1,2)} Hana Rudová, Logické programování I, 13. kvetna 2011 184 Logické programování s omezujícími podmínkami Omezení (constraint) JS> Dána a množina (doménových) promenných Y = {yi,... ,yk} konecná množina hodnot (doména) D = {Di,... ,Dk} Omezení c na Y je podmnožina Di x ... x Dk S> omezuje hodnoty, kterých mohou promenné nabývat soucasne M Príklad: a promenné: A,B -i- domény: {0,1} pro A {1,2} pro B omezení: A=B nebo (A,B) g {(0,1),(0,2),(1,2)} & Omezení c definováno na yi, ...yk je splneno, pokud pro di g Di, ...dk g Dk platí (di,... dk) g c -i- príklad (pokracování): omezení splneno pro (0, i), (0, 2), (i, 2), není splneno pro (i, i) Hana Řudová, Logické programování I, 13. kvetna 2011 184 Logické programování s omezujícími podmínkami Problém splňování podmínek (CSP) C Dána a konečná množina proměnných X = [xi,... ,xn} it konečná množina hodnot (doména) D = [Di,... ,Dn} it konečná množina omezení C = [ci,cm} omezení je definováno na podmnožině X Problém splnování podmínek je trojice (X,D,C) (constraint satisfaction problem) Hana Rudová, Logické programování I, 13. kvetna 2011 185 Logické programování s omezujícími podmínkami Problém splňování podmínek (CSP) C Dána a konečná množina proměnných X = jxi,... , xn} it konečná množina hodnot (doména) D = |D1,... ,Dn} it konečná množina omezení C = (c1,..., cm} omezení je definováno na podmnožině X Problém splnování podmínek je trojice (X,D,C) (constraint satisfaction problem) M Príklad: it promenne: A,B,C Jt domeny: {0,1} pro A {1,2} pro B {0,2} pro C omezení: A= B, B= C Hana Rudová, Logické programování I, 13. kvetna 2011 185 Logické programování s omezujícími podmínkami Řešení CSP ■v Cástecné ohodnocení proměnných (d1,dk),k < n s* některé proměnné mají přiřazenu hodnotu Úplné ohodnocení proměnných (di,dn) & všechny proměnné mají přiřazenu hodnotu Hana Rudová, Logické programování I, 13. kvetna 2011 186 Logické programování s omezujícími podmínkami Rešení CSP Cástecné ohodnocení přomenných (d1,dk),k < n s» nekteré promenné mají p r i razenu hodnotu Úplné ohodnocení přomenných (d1,dn) & všechny promenné mají p r i razenu hodnotu Rešení CSP & úplné ohodnocení proměnných, které splnuje všechna omezení s (d1dn) g D1 x ... x Dn je řešení (X, D, C) pro každé ci g C na xi1,...xik platí (di1,...dik) g ci Hana Rudová, Logické programování I, 13. kvetna 2011 186 Logické programování s omezujícími podmínkami Řešení CSP Cástecné ohodnocení přomenných (d1,dk),k < n s» nekteré promenné mají prirazenu hodnotu Úplné ohodnocení přomenných (di,dn) & všechny promenné mají prirazenu hodnotu Řešení CSP -fc úplné ohodnocení promenných, které splnuje všechna omezení s (d1dn) g D1 x ... x Dn je řešení (X, D, C) pro každé c g C na xii,...xik platí (dii,...dik) g a Hledáme: jedno nebo všechna rešení nebo optimální r ešení (vzhledem k objektivní funkci) Hana Rudová, Logické programování I, 13. kvetna 2011 186 Logické programování s omezujícími podmínkami P ř íklad: jednoduchý školní rozvrh proměnné: Jan, Petr, ... domény: (3,4, 5,6}, {3,4},... omezení: a11_distinct([Jan,Petr,...]) učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 187 Logické programování s omezujícími podmínkami Príklad: jednoduchý školní rozvrh proměnné: Jan, Petr, ... domény: (3,4, 5,6}, {3,4},... omězění: a11_distinct([Jan,Petr,...]) částečné ohodnocení: Jan=6, Anna=5, Marie=1 úplné ohodnocení: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Mariě=6 učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 187 Logické programování s omezujícími podmínkami Príklad: jednoduchý školní rozvrh proměnné: Jan, Petr, ... domény: (3,4, 5,6}, {3,4},... omezení: a11_distinct([Jan,Petr,...]) částečné ohodnocení: Jan=6, Anna=5, Marie=1 úplné ohodnocení: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Marie=6 rešení CSP: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Marie=1 učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 všechna řešení: ještě Jan=6, Petr=4, Anna=5, Ota=2, Eva=3, Marie=1 Hana Rudová, Logické programování I, 13. kvetna 2011 187 Logické programování s omezujícími podmínkami P ríklad: jednoduchý školní rozvrh promenné: Jan, Petr, ... domény: (3,4, 5,6}, {3,4},... omezení: a11_distinct([Jan,Petr,...]) CásteCné ohodnocení: Jan=6, Anna=5, Marie=1 úplné ohodnocení: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Marie=6 rešení CSP: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Marie=1 všechna rešení: ješte Jan=6, Petr=4, Anna=5, Ota=2, Eva=3, Marie=1 optimálizace: ženy ucí co nejdríve učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 187 Logické programování s omezujícími podmínkami P ríklad: jednoduchý školní rozvrh & promenné: Jan, Petr, ... -i* domény: {3,4, 5,6}, {3,4},... omezení: a11_distinct([Jan,Petr,...]) JS> cástecné ohodnocení: Jan=6, Anna=5, Marie=1 JS> úplné ohodnocení: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Marie=6 řešení CSP: Jan=6, Petr=3, Anna=5, Ota=2, Eva=4, Marie=1 & všechna rešení: ješte Jan=6, Petr=4, Anna=5, Ota=2, Eva=3, Marie=1 & optimálizace: ženy ucí co nejdříve Anna+Eva+Marie #= Cena minimalizace hodnoty promenné Cena optimální rešení: Jan=6, Petr=4, Anna=5, Ota=2, Eva=3, Marie=1 Hana Rudová, Logické programování I, 13. kvetna 2011 187 Logické programování s omezujícími podmínkami učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 CLP(FD) program & Základní struktura CLP programu 1. definice proměnných a jejich domén 2. definice omezení 3. hledání rešení Hana Rudová, Logické programování I, 13. kvetna 2011 188 Logické programování s omezujícími podmínkami CLP(FD) program & Základní struktura CLP programu 1. definiče promennýčh ajejičh domén 2. definiče omezení 3. hledání rešení & (1) a (2) deklarativní část Jt modelování problému a vyjádrení problému splnování podmínek Hana Rudová, Logičké programování I, 13. kvetna 2011 188 Logičké programování s omezujíčími podmínkami CLPCFD) program -i* Základní struktura CLP programu 1. definice proměnných a jejich domén 2. definice omezení 3. hledání r ešení ü> (1) a (2) deklarativní cást Jt modelování problému a vyjád rení problému splnování podmínek -i* (3) r ídící cást & prohledávání stavového prostoru r ešení Jt procedura pro hledání r ešení (enumeraci) se nazývá labeling s> umožní nalézt jedno, všechna nebo optimální řešení Hana Rudová, Logické programování I, 13. kvetna 2011 188 Logické programování s omezujícími podmínkami Kód CLPCFD) programu % základní struktura CLP programu so1ve( Variables ) :- dec1are_variab1es( Variables ), domain([Jan],3,6], ... Hana Rudová, Logické programování I, 13. května 2011 189 Logické programování s omezujícími podmínkami Kód CLP(FD) programu % základní struktura CLP programu so1ve( Variables ) :- dec1are_variab1es( Variables ), post_constraints( Variables ), domain([Jan],3,6], ... a11_distinct([Jan,Petr,...]) Hana Rudová, Logické programování I, 13. kvetna 2011 189 Logické programování s omezujícími podmínkami Kód CLPCFD) programu % základní struktura CLP programu solve( Variables ) declare_variables( Variables ), domain([Jan],3,6], ... post_constraints( Variables ), all_distinct([Jan,Petr,...]) labeling( Variables ). Hana Rudová, Logičké programování I, 1B. kvetna 2G11 189 Logičké programování s omezujíčími podmínkami Kód CLP(FD) programu % základní struktura CLP programu so1ve( Variables ) :- dec1are_variab1es( Variables ), domain([Jan],3,6], ... post_constraints( Variab1es ), a11_distinct([Jan,Petr,...]) 1abe1ing( Variab1es ). % triviální labeling 1abe1ing( [] ). 1abe1ing( [Var|Rest] ) :- fd_min(Var,Min), ( Var#=Min, 1abe1ing( Rest ) % výběr nějmenší hodnoty z domény Hana Rudová, Logické programování I, 13. května 2011 189 Logické programování s omězujícími podmínkami Kód CLPCFD) programu % základní struktura CLP programu so1ve( Variables ) :- dec1are_variab1es( Variables ), domain([Jan],3,6], ... post_constraints( Variables ), a11_distinct([Jan,Petr,...]) 1abe1ing( Variables ). % triviální labeling 1abe1ing( [] ). 1abe1ing( [Var|Rest] ) :- fd_min(Var,Min), % výber nejmenší hodnoty z domény ( Var#=Min, 1abe1ing( Rest ) ■ Var#>Min , 1abe1ing( [Var|Rest] ) Hana Rudová, Logické programování I, 13. kvetna 2011 189 Logické programování s omezujícími podmínkami Príklad: algebrogram Prirad'te cifry 0, ... 9 písmenům S, E, N, D, M, O, Ř, Y tak, aby platilo: SEND + MOŘE = MONEY různá písmena mají prirazena různé cifry s S a M nejsou 0 Hana Řudová, Logické programování I, 13. kvetna 2011 190 Logické programování s omezujícími podmínkami P ríklad: algebrogram Prirad'te cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: SEND + MORE = MONEY mzná písmena mají prirazena různé cifry s S a M nejsou 0 domain([E,N,D,O,R,Y], 0, 9), domain([S,M],1,9) Hana Rudová, Logické programování I, 13. kvetna 2011 190 Logické programování s omezujícími podmínkami Príklad: algebrogram Prirad'te cifry 0, ... 9 písmenům S, E, N, D, M, O, Ř, Y tak, aby platilo: SEND + MOŘE = MONEY různá písmena mají prirazena různé cifry s S a M nejsou 0 domain([E,N,D,O,R,Y], 0, 9), domain([S,M],1,9) 1000*S + 100*E + 10*N + D + 1000*M + 100*0 + 10*R + E #= 10000*M + 1000*0 + 100*N + 10*E + Y Hana Řudová, Logické programování I, 13. kvetna 2011 190 Logické programování s omezujícími podmínkami Príklad: algebrogram Prirad'te cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: SEND + MORE = MONEY mzná písmena mají prirazena různé cifry s S a M nejsou 0 domain([E,N,D,O,R,Y], 0, 9), domain([S,M],1,9) 1000*S + 100*E + 10*N + D + 1000*M + 100*0 + 10*R + E #= 10000*M + 1000*0 + 100*N + 10*E + Y a11_distinct( [S,E,N,D,M,0,R,Y] ) Hana Rudová, Logické programování I, 13. kvetna 2011 190 Logické programování s omezujícími podmínkami Príklad: algebrogram Priraďte čifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: SEND + MORE = MONEY mzná písmena mají prirazena různé čifry s S a M nejsou 0 domain([E,N,D,O,R,Y], 0, 9), domain([S,M],1,9) 1000*S + 100*E + 10*N + D + 1000*M + 100*0 + 10*R + E #= 10000*M + 1000*0 + 100*N + 10*E + Y a11_distinct( [S,E,N,D,M,0,R,Y] ) 1abe1ing( [S,E,N,D,M,0,R,Y] ) Hana Rudová, Logičké programování I, 13. kvetna 2011 190 Logičké programování s omezujíčími podmínkami Od LP k CLP I. -í* CLP: rozšírení logického programování o omezující podmínky -í* CLP systémy se liší podle typu domény -i- CLP(a) generický jazyk -fc CLP(FD) domény promenných jsou koneCné (Finite Domains) 3» CLP(R) doménou promenných je množina reálných císel Hana Rudová, Logické programování I, 13. kvetna 2011 191 Logické programování s omezujícími podmínkami Od LP k CLP I. -í* CLP: rozšírení logického programování o omezující podmínky -í* CLP systémy se liší podle typu domény -i- CLP(a) generický jazyk it CLP(FD) domény promenných jsou konecné (Finite Domains) it CLP(R) doménou promenných je množina reálných císel C Cíl it využít syntaktické a výrazové prednosti LP dosáhnout vetší efektivity Hana Rudová, Logické programování I, 13. kvetna 2011 191 Logické programování s omezujícími podmínkami Od LP k CLP I. -í* CLP: rozšírení logického programování o omezující podmínky & CLP systémy se liší podle typu domény -i- CLP(a) generický jazyk -fc CLP(FD) domény promenných jsou konecné (Finite Domains) 3» CLP(R) doménou promenných je množina reálných císel C Cíl ± využít syntaktické a výrazové prednosti LP dosáhnout vetší efektivity JS> Unifikace v LP je nahrazena splňováním podmínek J* unifikace se chápe jako jedna z podmínek A = B M A #< B, A in 0..9, domain([A,B],0,9), all_distinct([A,B,C]) Hana Řudová, Logické programování I, 13. kvetna 2011 191 Logické programování s omezujícími podmínkami Od LP k CLP II. Pro řešení podmínek se používají konzistenCní techniky A consistency techniques, propagace omezení (constraint propagation) £> omezení: A in 0..2, B in 0..2, B #< A Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. Pro rešení podmínek se používají konzistenCní techniky A consistency techniques, propagace omezení (constraint propagation) £> omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. Pro řešení podmínek se používají konzistenCní techniky it consistency techniques, propagace omezení (constraint propagation) Jt omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. & Pro r ešení podmínek se používají konzistenCní techniky A consistency techniques, propagace omezení (constraint propagation) omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 ii> Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky JS> Prohledávání doplneno konzistencními technikami A in 1..2, B in 0..1, B #< A Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. & Pro r ěšení podmínek se používají konzistenCní techniky A consistency techniques, propagace omezení (constraint propagation) Jt omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 & Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky JS> Prohledávání doplneno konzistenCními technikami A in 1..2, B in 0..1, B #< A -fc po provedení A #=1 se z B #< A se odvodí: B #= 0 Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. & Pro rešení podmínek se používají konzistenCní techniky it consistency techniques, propagace omezení (constraint propagation) Jt omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 -í* Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky Prohledávání doplneno konzistenCními technikami A in 1..2, B in 0..1, B #< A it po provedení A #=1 se z B #< A se odvodí: B #= 0 & Podmínky jako výstup it kompaktní reprezentace nekonecného poctu r ešení, výstup lze použít jako vstup Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. & Pro r ešení podmínek se používají konzistenční techniky A consistency techniques, propagace omezení (constraint propagation) it omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 ii> Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky JS> Prohledávání doplneno konzistenčními technikami A in 1..2, B in 0..1, B #< A it po provedení A #=1 se z B #< A se odvodí: B #= 0 & Podmínky jako výstup it kompaktní reprezentace nekonecného poctu r ešení, výstup lze použít jako vstup it dotaz: A in 0..2, B in 0..2, B #< A výstup: A in 1..2, B in 0..1, Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Od LP k CLP II. & Pro r ešení podmínek se používají konzistenCní techniky it consistency techniques, propagace omezení (constraint propagation) Jt omezení: A in 0..2, B in 0..2, B #< A domény po propagaci omezení B #< A: A in 1..2, B in 0..1 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky Prohledávání doplneno konzistenCními technikami A in 1..2, B in 0..1, B #< A it po provedení A #=1 se z B #< A se odvodí: B #= 0 & Podmínky jako výstup it kompaktní reprezentace nekoneCného poCtu r ešení, výstup lze použít jako vstup Jt dotaz: A in 0..2, B in 0..2, B #< A výstup: A in 1..2, B in 0..1, B #< A Hana Rudová, Logické programování I, 13. kvetna 2011 192 Logické programování s omezujícími podmínkami Syntaxe CLP Výber jazyka omezení CLP klauzule jako LP klauzule, ale její telo muže obsahovat omezení daného jazyka p(X,Y) :- X #< Y+1, q(X), r(X,Y,Z). Rezolucní krok v LP A kontrola existence nejobecnejšího unifikátoru (MGU) mezi cílem a hlavou £ Krok odvození v CLP také zahrnuje 3» kontrola konzistence aktuální množiny omezení s omezeními v tele klauzule => Vyvolání dvou rešiců: unifikace + rešic omezení Hana Rudová, Logické programování I, 13. kvetna 2011 193 Logické programování s omezujícími podmínkami OperaCní sémantika CLP CLP výpocet cíle G J» Store množina aktivních omezení = prostor omezení (constraint store) & inicializace Store = 0 Jr seznamy cílů v G prováděny v obvyklém po r adí a pokud narazíme na cíl s omezením c: NewStore = Store u {c} J* snažíme se splnit c vyvoláním jeho r ěšice p r i neúspěchu se vyvolá backtracking p r i úspěchu se podmínky v NewStore zjednoduší propagací omezení Jt zbývající cíle jsou prováděny s upraveným NewStore CLP výpocet cíle G jě úspěšný, pokud se dostaneme z iniciálního stavu (G, 0) do stavu (G',Store), kde G' jě prázdný cíl a Store jě splnitelná. Hana Rudová, Logické programování I, 13. kvetna 2011 194 Logické programování s omezujícími podmínkami CLPCFD) v SICStus Prologu Systémy a jazyky pro CP J* IBM ILOG CP 1987 Jt omezující podmínky v C++, Jave nebo generickém modelovacím jazyku OPL iľ implementace podmínek založena na objektove orientovaném programování Jt špickový komercní sw, vznikl ve Francii, nedávno zakoupen IBM J> nyní nove volne dostupný pro akademické použití Hana Rudová, Logické programování I, 13. kvetna 2011 196 CLP(FD) v SICStus Prologu Systémy a jazyky pro CP Ji* IBM ILOG CP 1987 it omezující podmínky v C++, Jave nebo generickém modelovacím jazyku OPL it implementace podmínek založena na objektove orientovaném programování it špickový komercní sw, vznikl ve Francii, nedávno zakoupen IBM it nyní nove volne dostupný pro akademické použití & Swedish Institute of Computer Sčienče: SICStus Prolog 1985 it silná CLP(FL)) knihovna, komercní i akademické použití Hana Rudová, Logické programování I, 13. kvetna 2011 196 CLP(FD) v SICStus Prologu Systémy a jazyky pro CP Ji* IBM ILOG CP 1987 it omezující podmínky v C++, Jave nebo generickém modelovacím jazyku OPL it implementace podmínek založena na objektove orientovaném programování it špickový komercní sw, vznikl ve Francii, nedávno zakoupen IBM it nyní nove volne dostupný pro akademické použití & Swedish Institute of Computer Science: SICStus Prolog 1985 it silná CLP(FD) knihovna, komercní i akademické použití IC-PARC, Imperial College London, Cisco Systems: ECL*PSe 1984 it široké možnosti kooperace mezi ruznými rešicemi: konecné domény, reálná císla, repair it od 2004 vlastní Cisco Systems volne dostupné pro akademické použití, rozvoj na IC-PARC, platformy: Windows, Linux, Solaris Hana Rudová, Logické programování I, 13. kvetna 2011 196 CLP(FD) v SICStus Prologu Systémy a jazyky pro CP Ji* IBM ILOG CP 1987 A omezující podmínky v C++, Jave nebo generickém modelovacím jazyku OPL iľ implementace podmínek založena na objektove orientovaném programování A špickový komercní sw, vznikl ve Francii, nedávno zakoupen IBM J* nyní nove volne dostupný pro akademické použití & Swedish Institute of Computer Science: SICStus Prolog 1985 -fc silná CLP(FL)) knihovna, komercní i akademické použití IC-PARC, Imperial College London, Cisco Systems: ECL*PSe 1984 J* široké možnosti kooperace mezi ruznými rešicemi: konecné domény, reálná císla, repair Jť od 2004 vlastní Cisco Systems volne dostupné pro akademické použití, rozvoj na IC-PARC, platformy: Windows, Linux, Solaris iS* Mnoho dalších systému: Choco, Gecode, Minion, Oz, SWI Prolog, ... Hana Rudová, Logické programování I, 13. kvetna 2011 196 CLP(FD) v SICStus Prologu CLP(FD) v SICStus Prologu & Vestavené predikáty jsou dostupné v separátním modulu (knihovně) :- use_modu1e(1ibrary(c1pfd)). Obecné principy platné všude nicméne standarty jsou nedostatečné Jt stejné/podobné vestavené predikáty existují i jinde s CLP knihovny v SWI Prologu i ECLiPSe se liší Hana Rudová, Logické programování I, 13. kvetna 2011 197 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy -i* ?- domain( [A,B], 1,3). domain( +Variab1es, +Min, +Max) A in 1..3 B in 1..3 Hana Rudová, Logické programování I, 13. května 2011 198 CLP(FD) v SICStus Prologu Příslušnost k doméne: Range termy -i* ?- domain( [A,B], 1,3). domain( +Variab1es, +Min, +Max) A in 1..3 B in 1..3 B ?- a in 1..8, A #\= 4. ?X in +Min..+Max A in (1..3) \/ (5..8) Hana Rudová, Logické programování I, 13. kvetna 2011 198 CLP(FD) v SICStus Prologu P r íslušnost k doméne: Range termy i& ?- domain( [A,B], 1,3). domain( +Variab1es, +Min, +Max) A in 1..3 B in 1..3 B ?- a in 1..8, A #\= 4. ?X in +Min..+Max A in (1..3) \/ (5..8) & Doména reprezentována jako posloupnost intervalů celých císel M ?- a in (1..3) \/ (8..15) \/ C5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} Hana Rudová, Logické programování I, 13. kvetna 2011 198 CLP(FD) v SICStus Prologu P ř íslušnost k doméne: Range teřmy -i* ?- domain( [A,B], 1,3). domain( +Variab1es, +Min, +Max) A in 1..3 B in 1..3 B ?- a in 1..8, A #\= 4. ?X in +Min..+Max A in (1..3) \/ (5..8) & Doména reprezentována jako posloupnost intervalů celých císel M ?- a in (1..3) \/ (8..15) \/ C5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} Zjištení domény Range promenné Var: fd_dom(?Var,?Range) A in 1..8, A #\= 4, fd_dom(A,Range). Range=(1..3) \/ (5..8) Hana Rudová, Logické programování I, 13. kvetna 2011 198 CLP(FD) v SICStus Prologu P ř íslušnost k doméne: Range termy -i* ?- domain( [A,B], 1,3). domain( +Variab1es, +Min, +Max) A in 1..3 B in 1..3 B ?- a in 1..8, A #\= 4. ?X in +Min..+Max A in (1..3) \/ (5..8) & Doména reprezentována jako posloupnost intervalů celých císel M ?- a in (1..3) \/ (8..15) \/ C5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} Zjištení domény Range promenné Var: fd_dom(?Var,?Range) A in 1..8, A #\= 4, fd_dom(A,Range). Range=(1..3) \/ (5..8) M A in 2..10, fd_dom(A,(1..3) \/ (5..8)). no Hana Rudová, Logické programování I, 13. kvetna 2011 198 CLP(FD) v SICStus Prologu Príslušnost k doméne: Range termy i& ?- domain( [A,B], 1,3). domain( +Variab1es, +Min, +Max) A in 1..3 B in 1..3 B ?- a in 1..8, A #\= 4. ?X in +Min..+Max A in (1..3) \/ (5..8) & Doména reprezentována jako posloupnost intervalů celých císel M ?- a in (1..3) \/ (8..15) \/ C5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} Zjištení domény Range promenné Var: fd_dom(?Var,?Range) A in 1..8, A #\= 4, fd_dom(A,Range). Range=(1..3) \/ (5..8) A in 2..10, fd_dom(A,(1..3) \/ (5..8)). no & Range term: reprezentace nezávislá na implementaci Hana Rudová, Logické programování I, 13. kvetna 2011 198 CLP(FD) v SICStus Prologu Príslušnost k doméne: FDSet termy C FDSet term: reprezentače závislá na implementači J ?- A in 1..8, A#\= 4, fd_set(A,FDSet). A in (1..3) \/ C5..8) FDSet = [[1|3],[5|8]] fd_set(?Var,?FDSet) Hana Rudová, Logičké programování I, 1B. kvetna 2G11 199 CLP(FD) v SICStus Prologu P r íslušnost k doméne: FDSet termy C FDSet term: reprezentace závislá na implementaci M ?- A in 1..8, A #\= 4, fd_set(A,FDSet). fd_set(?Var,?FDSet) A in (1..3) \/ C5..8) FDSet = [[1|3],[5|8]] J ?- A in 1..8.A #\= 4, fd_set(A,FDSet),B in_set FDSet. ?X in_set +FDSet A in (1..3) \/ C5..8) FDSet = [[1|3],[5|8]] B in (1..3) \/ C5..8) Hana Rudová, Logické programování I, 13. kvetna 2011 199 CLP(FD) v SICStus Prologu Príslušnost k doméne: FDSet termy C FDSet term: reprezentače závislá na implementači M ?- A in 1..8, A #\= 4, fd_set(A,FDSet). fd_set(?Var,?FDSet) A in (1..3) \/ C5..8) FDSet = [[1|3],[5|8]] J ?- A in 1..8.A #\= 4, fd_set(A,FDSet),B in_set FDSet. ?X in_set +FDSet A in (1..3) \/ C5..8) FDSet = [[1|3],[5|8]] B in (1..3) \/ C5..8) & FDSet termy predstavují nízko-úrovnovou implementači & FDSet termy nedoporučeny v programečh it používat pouze predikáty pro manipulači s nimi it omezit použití A in_set [[1|2],[6|9]] & Range termy preferovány Hana Rudová, Logičké programování I, 1B. kvetna 2G11 199 CLP(FD) v SICStus Prologu Další fd_... predikáty fdset_to_list(+FDset, -List) vrací do seznamu prvky FDset & list_to_fdset(+List, -FDset) vrací FDset odpovídající seznamu fd_var(?Var) je Var doménová promenná? fd_min(?Var,?Min) nejmenší hodnota v doméne fd_max(?Var,?Max) nejvetší hodnota v doméne fd_size(?Var,?Size) velikost domény fd_degree(?Var,?Degree) pocet navázaných omezení na promenné iľ mení se behem výpoctu: pouze aktivní omezení, i odvozená aktivní omezení Hana Řudová, Logické programování I, 13. kvetna 2011 200 CLP(FD) v SICStus Prologu Aritmetická omezení J* Expr Re10p Expr Re10p -> #= | #\= | #< | #=< | #> | #>= A A + B #=< 3, A #\= (C - 4) * (D - 5), A/2 #= 4 A POZOR: neplést #=< a #>= s operátory pro implikaci: #<= #=> Hana Rudová, Logické programování I, 13. kvetna 2011 201 CLP(FD) v SICStus Prologu Aritmetická omezení J* Expr RelOp Expr RelOp -> #= | #\= | #< | #=< | #> | #>= A A + B #=< 3, A #\= (C - 4) * (D - 5), A/2 #= 4 A POZOR: neplést #=< a #>= s operátory pro implikaci: #<= #=> -í* sum(Variab1es,Re1Op,Suma) domain([A,B,C,F],1,3), sum([A,B,C],#= ,F) S> Variables i Suma musí být doménové proměnné nebo celá Čísla Hana Rudová, Logické programování I, 13. kvetna 2011 201 CLP(FD) v SICStus Prologu Ařitmetická omezení J> Expr Re1Op Expr Re1Op -> #= | #\= | #< | #=< | #> | #>= A A + B #=< 3, A #\= (C - 4) * ( D - 5), A/2 #= 4 Jt POZOR: neplést #=< a #>= s operátory pro implikaci: #<= #=> & sum(Variab1es,Re1Op,Suma) domain([A,B,C,F],1,3), sum([A,B,C],#= ,F) S> Variab1es i Suma musí být doménové promenné nebo celá císla sca1ar_product(Coeffs,Variab1es,Re1Op,Sca1arProduct) M domain([A,B,C,F],1,6), sca1ar_product( [1,2,3],[A,B,C],#= ,F) it Variab1es i Va1ue musí být doménové promenné nebo celá císla, Coeffs jsou celá císla POZOR na po radí argumentu, nejprve jsou celocíselné koeficienty, pak dom. promenné 3 sca1ar_product(Coeffs, Variab1es, #= , Va1ue, [consistency(domain)]) silnejší typ konzistence POZOR: domény musí mít konecné hranice Hana Rudová, Logické programování I, 13. kvetna 2011 201 CLP(FD) v SICStus Prologu Základní globální omezení all_distinct(l_ist) M všechny proměnné různé cumulative(...) -i- disjunktivní a kumulativní rozvrhování cumulatives(...) 3» kumulativní rozvrhování na více zdrojů Hana Rudová, Logické programování I, 13. května 2011 202 CLP(FD) v SICStus Prologu přomenné řuzné a11_distinct(Variab1es), a11_different(Variab1es) ii> Promenné v seznamu Variab1es jsou různé a11_distinct a a11_different se liší úrovní propagace a a11_distinct má úplnou propagaci s» a11_different má slabší (neúplnou) propagaci Hana Rudová, Logické programování I, 13. kvetna 2011 203 CLP(FD) v SICStus Prologu Všechny proměnné různé all_distinct(Variables), a11_different(Variab1es) Proměnné v seznamu Variables jsou různé a11_distinct a a11_different se liší úrovní propagace a a11_distinct má úplnou propagaci a a11_different má slabší (neúplnou) propagaci Príklad: uCitelé musí uCit v mzné hodiny uCitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 203 CLP(FD) v SICStus Prologu Všechny promenné různé a11_distinct(Variab1es), a11_different(Variab1es) Promenné v seznamu Variab1es jsou různé a11_distinct a a11_different se liší úrovní propagace a a11_distinct má úplnou propagaci a a11_different má slabší (neúplnou) propagaci Príklad: ucitelé musí ucit v mzné hodiny a11_distinct([Jan,Petr,Anna,Ota,Eva,Marie]) Jan = 6, Ota = 2, Anna = 5, Marie = 1, Petr in 3..4, Eva in 3..4 učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 203 CLP(FD) v SICStus Prologu Všechny promenné různé a11_distinct(Variab1es), a11_different(Variab1es) Promenné v seznamu Variab1es jsou různé a11_distinct a a11_different se liší úrovní propagace a a11_distinct má úplnou propagaci a a11_different má slabší (neúplnou) propagaci Príklad: uatelé musí ucit v ruzné hodiny a11_distinct([Jan,Petr,Anna,Ota,Eva,Marie]) Jan = 6, Ota = 2, Anna = 5, Marie = 1, Petr in 3..4, Eva in 3..4 3 a11_different([Jan,Petr,Anna,Ota,Eva,Marie]) Jan in 3..6, Petr in 3..4, Anna in 2..5, Ota in 2..4, Eva in 3..4, Marie in 1..6 učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 203 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování (unární zdroj) -í* cumu1ative([task(Start, Duration, End, 1, Id) | Tasks]) -í* Rozvržení úloh zadaných startovním a koncovým casem (Start,End), dobou trvání (nezáporné Duration) a identifikátorem (Id) tak, aby se nepřekrývaly Hana Rudová, Logické programování I, 13. května 2011 204 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování (unární zdroj) -í* cumu1ative([task(Start, Duration, End, 1, Id) | Tasks]) -í* Rozvržení úloh zadaných startovním a koncovým casem (Start,End), dobou trvání (nezáporné Duration) a identifikátorem (Id) tak, aby se nepřekrývaly A príklad s konstantami: cumu1ative([task(0,2,2,1,1), task(3,1,4,1,2), task(5,1,6,1,3)]) f. 3 1 2 3 4 5 6 Hana Rudová, Logické programování I, 13. kvetna 2011 204 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování (unární zdroj) -í* cumu1ative([task(Start, Duration, End, 1, Id) | Tasks]) -í* Rozvržení úloh zadaných startovním a koncovým casem (Start,End), dobou trvání (nezáporné Duration) a identifikátorem (Id) tak, aby se nep rekrývaly Jt p r íklad s konstantami: cumu1ative([task(0,2,2,1,1), task(3,1,4,1,2), task(5,1,6,1,3)]) f. í 2 3 12 3 4 5 6 ± p r íklad: vytvo r ení rozvrhu, za p r edpokladu, že doba trvání hodin není stejná Hana Rudová, Logické programování I, 13. kvetna 2011 204 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování (unární zdroj) ifc cumulative([task(Start, Duration, End, 1, Id) | Tasks]) iS> Rozvržení úloh zadaných startovním a koncovým casem (Start,End), dobou trvání (nezáporné Duration) a identifikátorem (Id) tak, aby se nepřekrývaly it príklad s konstantami: cumulative([task(0,2,2,1,1), task(3,1,4,1,2), task(5,1,6,1,3)]) f. í 2 3 12 3 4 5 6 ± příklad: vytvoření rozvrhu, za předpokladu, že doba trvání hodin není stejná JanE#= Jan+1, PetrE#= Petr+1, AnnaE#= Anna+2, cumulative(taskOan,1,JanE,1,1),task(Petr,1,PetrE,1,2),task(Anna,1,AnnaE,1,3), task(Ota,2,OtaE,1,4),task(Eva,2,EvaE,1,5),task(Marie,3,MarieE,1,6)]) Hana Rudová, Logické programování I, 13. kvetna 2011 204 CLP(FD) v SICStus Prologu Kumulativní rozvrhování & cumu1ative([task(Start,Duration,End,Demand,TaskId) | Tasks], [limit(Limit)]) & Rozvržení úloh zadaných startovním a koncovým Časem (Start,End), dobou trvání (nezáporné Duration), požadovanou kapacitou zdroje (Demand) a identifikátorem (Id) tak, aby se nepřekrývaly a aby celková kapacita zdroje nikdy neprekrocila Limit Hana Rudová, Logické programování I, 13. kvetna 2011 205 CLP(FD) v SICStus Prologu Kumulativní rozvrhování JS> cumu1ative([task(Start,Duration,End,Demand,TaskId) | Tasks], [limit(Limit)]) iS> Rozvržení úloh zadaných startovním a koncovým casem (Start,End), dobou trvání (nezáporné Duration), požadovanou kapacitou zdroje (Demand) a identifikátorem (Id) tak, aby se nepřekrývaly a aby celková kapacita zdroje nikdy neprekrocila Limit iS> Príklad s konstantami: cumu1ative([task(Q,4,4,1,1),task(1,2,3,2,2),task(3,3,6,2,3),task(4,2,6,1,4)],[1imit(3)]) 2 4 3 1 t Hana Rudová, Logické programování I, 13. kvetna 20lr ^ 205 ^ ^ ° u CLP(FD) v SICStus Prologu Kumulativní rozvrhování s více zdroji Rozvržení úloh tak, aby se neprekrývaly a daná kapacita zdrojů nebyla prekrocena (limit zdroje chápán jako horní mez - bound(upper)) cumu1atives([task(Start,Duration,End,Demand,MachineId)|Tasks], [machine(Id,Limit)|Machines],[bound(upper)]) Úlohy zadány startovním a koncovým casem (Start,End), dobou trvání (nezáporné Duration), požadovanou kapacitou zdroje (Demand) a požadovaným typem zdroje (MachineId) Zdroje zadány identifikátorem (Id) a kapacitou (Limit) Hana Rudová, Logické programování I, 13. kvetna 2011 206 CLP(FD) v SICStus Prologu Kumulativní rozvrhování s více zdroji & Řozvržení úloh tak, aby se neprekrývaly a daná kapacita zdroju nebyla prekrocena (limit zdroje chápán jako horní mez - bound(upper)) & cumu1atives([task(Start,Duration,End,Demand,MachineId)|Tasks], [machine(Id,Limit)|Machines],[bound(upper)]) & Úlohy zadány startovním a koncovým ccasem (Start,End), dobou trvání (nezáporné Duration), požadovanou kapacitou zdroje (Demand) a požadovaným typem zdroje (Machineld) JS> Zdroje zadány identifikátorem (Id) a kapacitou (Limit) M Príklad: ?- domain([B,C],1,2), cumu1atives([task(0,4,4,1,1),task(3,1,4,1,B), task(5,1,6,1,C)], [machine(1,1),machine(2,1)], [bound(upper)]). C in 1..2, B=2 Hana Řudová, Logické programování I, 13. kvetna 2011 206 CLP(FD) v SICStus Prologu Vestavené predikáty pro labeling Instanciace promenné Variable hodnotami vjejí doméne indomain( Variable ) hodnoty jsou instanciovány pri backtrackingu ve vzrůstajícím poradí ?- X in 4..5, indomain(X). X = 4 ? ; X = 5 ? Hana Rudová, Logické programování I, 13. kvetna 2011 207 CLP(FD) v SICStus Prologu Vestavené predikáty pro labeling Instanciace promenné Variable hodnotami vjejí doméne indomain( Variable ) hodnoty jsou instanciovány p r i backtrackingu ve vzrůstajícím po radí ?- X in 4..5, indomain(X). X = 4 ? ; X = 5 ? 1abe1ing( [] ). 1abe1ing( [Var|Rest] ) :- % výber nejlevejší promenné k instanciaci indomain( Var ), % výber hodnot ve vzrustajícím poradí 1abe1ing( Rest ). Hana Rudová, Logické programování I, 13. kvetna 2011 207 CLP(FD) v SICStus Prologu Vestavené predikáty pro labeling Instanciace proměnné Variable hodnotami v její doméně indomain( Variable ) hodnoty jsou instanciovány pri backtrackingu ve vzrůstajícím poradí ?- X in 4..5, indomain(X). X = 4 ? ; X = 5 ? 1abe1ing( [] ). 1abe1ing( [Var|Rest] ) :-indomain( Var ), 1abe1ing( Rest ). % výběr nejlěvější proměnné k instanciaci % výběr hodnot ve vzmstajícím poradí M 1abe1ing( Options, Variables ) ?- A in 0..2, B in 0..2, B#< A, 1abe1ing([], [A,B]). Hana Rudová, Logické programování I, 13. května 2011 207 CLP(FD) v SICStus Prologu Uspo řádání hodnot a přomenných Pr i prohledávání je rozhodující uspo řádání hodnot a přomenných Urcujíje heuřistiky výbeřu hodnot a výbeřu přomenných 1abe1ing( [] ). 1abe1ing( Variab1es ) :- se1ect_variab1e(Variab1es,Var,Rest), se1ect_va1ue(Var,Va1ue), Hana Rudová, Logické programování I, 13. kvetna 2011 208 CLP(FD) v SICStus Prologu Uspo řádání hodnot a proměnných & Pri prohledávání je rozhodující uspo rádání hodnot a promenných Urcujíje heuristiky výberu hodnot a výberu promenných 1abe1ing( [] ). 1abe1ing( Variab1es ) :- se1ect_variab1e(Variab1es,Var,Rest), se1ect_va1ue(Var,Va1ue), ( Var #= Va1ue, 1abe1ing( Rest ) Hana Rudová, Logické programování I, 13. kvetna 2011 208 CLP(FD) v SICStus Prologu Uspo rádání hodnot a proměnných iS» Pri prohledávání je rozhodující uspo rádání hodnot a promenných Urcujíje heuristiky výberu hodnot a výberu promenných 1abe1ing( [] ). 1abe1ing( Variab1es ) :- se1ect_variab1e(Variab1es,Var,Rest), se1ect_va1ue(Var,Va1ue), ( Var #= Va1ue, 1abe1ing( Rest ) Var #\=Va1ue , % nemusí dojít k instanciaci Var 1abe1ing( Variab1es ) % proto pokracujeme se všemi promennými vcetne Var Hana Rudová, Logické programování I, 13. kvetna 2011 208 CLP(FD) v SICStus Prologu Uspořádání hodnot a proměnných & Pri prohledávání je rozhodující uspořádání hodnot a proměnných UrCujíje heuristiky výběru hodnot a výběru proměnných labeling( [] ). labeling( Variables ) :- select_variable(Variables,Var,Rest), select_value(Var,Value), ( Var #= Value, labeling( Rest ) Var #\= Value , % nemusí dojít k instanciaci Var labeling( Variables ) % proto pokraCujeme se všemi proměnnými vCetne Var -í* Statické usporádání: urCeno už pred prohledáváním JS> Dynamické usporádání: poCítá se behem prohledávání Hana Rudová, LogiCké programování I, 13. kvetna 2011 208 CLP(FD) v SICStus Prologu Výbeř hodnoty JS> Obecný princip výberu hodnoty: přvní úspech (succeed first) J> volíme po radí tak, abychom výber nemuseli opakovat ?- domain([A,B,C],1,2), A#=B+C. Hana Rudová, Logické programování I, 13. kvetna 2011 209 CLP(FD) v SICStus Prologu Výber hodnoty JS> Obecný princip výberu hodnoty: první úspech (succeed first) it volíme poradí tak, abychom výber nemuseli opakovat it ?- domain([A,B,C],1,2), A#=B+C. optimální výber A=2,B=1,C=1 je bez backtrackingu Hana Rudová, Logické programování I, 13. kvetna 2011 209 CLP(FD) v SICStus Prologu Výběr hodnoty JS> Obecný princip výběru hodnoty: první úspěch (succeed first) J* volíme poradí tak, abychom výběr nemuseli opakovat A ?- domain([A,B,C],1,2), A#=B+C. optimální výber A=2,B=1,C=1 je bez backtrackingu & Parametry labeling/2 ovlivnující výber hodnoty pr. labe1ing([down], Vars) -i- up: doména procházena ve vzrůstajícím poradí (default) -fc down: doména procházena v klesajícím poradí Hana Rudová, Logické programování I, 13. kvetna 2011 209 CLP(FD) v SICStus Prologu Výber hodnoty & Obečný prinčip výberu hodnoty: první úspech (succeed first) J* volíme poradí tak, abyčhom výber nemuseli opakovat A ?- domain([A,B,C],1,2), A#=B+C. optimální výber A=2,B=1,C=1 je bez bačktračkingu ü> Parametry labeling/2 ovlivnujíčí výber hodnoty pr. 1abe1ing([down], Vars) -i- up: doména procházena ve vzrůstajícím poradí (default) Jt down: doména procházena v klesajícím poradí C- Parametry labeling/2 rídíčí, jak je výber hodnoty realizován j- step: volba mezi X #= M, X #\= M (default) viz drívejší príklad u "Usporádání hodnot a promennýčh" Jt enum: vícenásobná volba mezi všemi hodnotami v doméne podobne jako pri indomain/1 Hana Rudová, Logické programování I, 13. kvetna 2011 209 CLP(FD) v SICStus Prologu Výběr proměnné Obecný princip výběru promenné: first-fail it výběr proměnné, pro kterou je nejobtížnější nalézt správnou hodnotu pozdější výber hodnoty pro tuto proměnnou by snadněji vedl k failu it výbereme proměnnou s nějměnší doménou ?- domain([A,B,C],1,3), A#<3, A#=B+C. Hana Rudová, Logické programování I, 13. května 2011 210 CLP(FD) v SICStus Prologu Výber promenné Obecný princip výberu promenné: first-fail výber promenné, pro kterou je nejobtížnejší nalézt správnou hodnotu pozdejší výber hodnoty pro tuto promennou by snadneji vedl k failu vybereme promennou s nejmenší doménou ?- domain([A,B,C],1,3), A#<3, A#=B+C. nejlépe je zacít s výberem A Hana Rudová, Logické programování I, 13. kvetna 2011 210 CLP(FD) v SICStus Prologu Výběr proměnné Obecný princip výberu promenné: first-fail výber promenné, pro kterou je nejobtížnejší nalézt správnou hodnotu pozdejší výber hodnoty pro tuto promennou by snadneji vedl k failu Jt výbereme promennou s nejmenší doménou J* ?- domain([A,B,C],1,3), A#<3, A#=B+C. nejlépe je zacít s výberem A Parametry labeling/2 ovlivnující výber promenné -i- leftmost: nejlevejší (default) M ff: s (1) nejmenší velikostí domény fd_size(Var,Size) (2) (pokud s nejmenší velikostí domény více, tak) nejlevejší z nich Hana Rudová, Logické programování I, 13. kvetna 2011 210 CLP(FD) v SICStus Prologu Výber proměnné Obecný princip výberu promenné: first-fail výber proměnné, pro kterou je nejobtížnejší nalézt správnou hodnotu pozdější výber hodnoty pro tuto promennou by snadneji vedl k failu vybereme promennou s nejmenší doménou ?- domain([A,B,C],1,3), A#<3, A#=B+C. nejlépe je zacít s výberem A & Parametry labeling/2 ovlivnující výber promenné -i- leftmost: nejlevejší (default) M ff: s (1) nejmenší velikostí domény fd_size(Var,Size) (2) (pokud s nejmenší velikostí domény více, tak) nejlevejší z nich S> ffc: s (1) nejmenší velikostí domény (2) nejvetším množstvím omezením „cekajících" na promenné fd_degree(Var,Size) (3) nejlevejší z nich -4» min/max: s (1) nejmenší/nejvetší hodnotou v doméne promenné (2) nejlevnejšíz nich fd_min(Var,Min)/fd_max(Var,Max) Hana Rudová, Logické programování I, 13. kvetna 2011 210 CLP(FD) v SICStus Prologu řešení (předpokládejme minimalizaci) Parametry labeling/2 pro optimalizaci: minimize(F)/maxirrrize(F) iľ Cena #= A+B+C, 1abe1ing([minimize(Cena)], [A,B,C]) Metoda vetví a mezí (branch&bound) -fc algoritmus, který implementuje proceduru pro minimalizaci (duálne pro maximalizaci) -i- uvažujeme nejhorší možnou cenu r ešení UB (nap r . cena už nalezeného rešení) pocítáme dolní odhad LB ceny cástecného r ešení LB je tedy nejlepší možná cena pro rozšír ení tohoto r ešení procházíme strom a vyžadujeme, aby prozkoumávaná vetev mela cenu LB < UB pokud je LB > UB, tak víme, že v této vetvi není lepší rešení a od r ízneme ji p r idává se tedy inkrementálne omezení LB#= S+D, after(Ss, Ds, E). CLP(FD) v SICStus Prologu P ríklad: kumulativní rozvrhování Vytvo rte rozvrh pro následující úlohy, tak aby nebyla p rekrocena kapacita 13 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita t1 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 t7 4 11 Hana Rudová, Logické programování I, 13. kvetna 2011 schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], domain(Ss, 0, 51), domain([End], 0, 69), after(Ss, Ds, End), % koncový Cas cumulative(Ss, Ds, Rs, 13), append(Ss, [End], Vars), labeling([minimize(End)], Vars). after([], [], _). after([S|Ss], [D|Ds], E) :- E #>= S+D, after(Ss, Ds, E). | ?- schedule(Ss, End). Ss = Ss = [0,16,9,9,4,4,0], End = 22 ? CLP(FD) v SICStus Prologu Algořitmy přo řešení přoblému splnování podmínek (CSP) Grafová reprezentace CSP & Reprezentace podmínek & intenzionální (matematická/logická formule) J* extenzionální (výcet k-tic kompatibilních hodnot, 0-1 matice) Hana Rudová, Logické programování I, 13. kvetna 2011 214 Algoritmy pro CSP Grafová reprezentace CSP Reprezentace podmínek Jt intenzionální (matematická/logická formule) J* extenzionální (výcet k-tic kompatibilních hodnot, 0-1 matice) Graf: vrcholy, hrany (hrana spojuje dva vrcholy) Hypergraf: vrcholy, hrany (hrana spojuje množinu vrcholu) Reprezentace CSP pomocí hypergrafu podmínek Jt vrchol = promenná, hyperhrana = podmínka Hana Rudová, Logické programování I, 13. kvetna 2011 214 Algoritmy pro CSP Grafová reprezentace CSP Reprezentace podmínek & intenzionální (matematická/logická formule) J* extenzionální (výCet k-tic kompatibilních hodnot, 0-1 matice) Graf: vrcholy, hrany (hrana spojuje dva vrcholy) Hypergraf: vrcholy, hrany (hrana spojuje množinu vrcholU) Reprezentace CSP pomocí hypergrafu podmínek vrchol = promenná, hyperhrana = podmínka Cl Príklad promenné x1,...,x6 s doménou {0,1} omezení c1 : x1 + x2 + x6 = 1 c2: x1 - x3 + x4 = 1 c3 : x4 + x5 - x6 > 0 c4: x2 + x5 - x6 = 0 Hana Rudová, Logické programování I, 13. kvetna 2011 214 3 Algoritmy pro CSP Binární CSP M Binární CSP i* CSP, ve kterém jsou pouze binární podmínky Jt unární podmínky zakódovány do domény promenné JS> Graf podmínek pro binární CSP A není nutné uvažovat hypergraf, stací graf (podmínka spojuje pouze dva vrcholy) Hana Rudová, Logické programování I, 13. kvetna 2011 215 Algoritmy pro CSP Binární CSP M Binární CSP i* CSP, ve kterém jsou pouze binární podmínky Jt unární podmínky zakódovány do domény promenné JS> Graf podmínek pro binární CSP A není nutné uvažovat hypergraf, stací graf (podmínka spojuje pouze dva vrcholy) & Každý CSP lze transformovat na "korespondující" binární CSP ii> Výhody a nevýhody binarizace 3 získáváme unifikovaný tvar CSP problému, rada algoritmu navržena pro binární CSP Jt bohužel ale znacné zvetšení velikosti problému Hana Rudová, Logické programování I, 13. kvetna 2011 215 Algoritmy pro CSP Binární CSP M Binární CSP i* CSP, ve kterém jsou pouze binární podmínky Jt unární podmínky zakódovány do domény promenné JS> Graf podmínek pro binární CSP A není nutné uvažovat hypergraf, stací graf (podmínka spojuje pouze dva vrcholy) & Každý CSP lze transformovat na "korespondující" binární CSP ii> Výhody a nevýhody binarizace 3 získáváme unifikovaný tvar CSP problému, rada algoritmu navržena pro binární CSP Jt bohužel ale znacné zvetšení velikosti problému JS> Nebinární podmínky A složitejší propagacní algoritmy Jt lze využít jejich sémantiky pro lepší propagaci X p r íklad: all_different vs. množina binárních nerovností Hana Rudová, Logické programování I, 13. kvetna 2011 215 Algoritmy pro CSP Vrcholová a hranová konzistence iS> Vrcholová konzistence (node consistency) NC Jt každá hodnota z aktuální domény Ví promenné spinuje všechny unární podmínky s promennou Ví Hana Rudová, Logické programování I, 13. kvetna 2011 216 Algoritmy pro CSP Vrcholová a hranová konzistence iS> Vrcholová konzistence (node consistency) NC -fc každá hodnota z aktuální domény Vi promenné splnuje všechny unární podmínky s promennou Vi & Hranová konzistence (arc consistency) AC pro binární CSP J* hrana (Vi,Vj) je hranove konzistentní, práve když pro každou hodnotu x z aktuální domény Di existuje hodnota y tak, že ohodnocení [Vi = x,Vj = y] splnuje všechny binární podmínky nad Vi,Vj. Hana Rudová, Logické programování I, 13. kvetna 2011 216 Algoritmy pro CSP Vrcholová a hranová konzistence Vrcholová konzistence (node consistency) NC it každá hodnota z aktuální domény Ví proměnné splňuje všechny unární podmínky s proměnnou Ví Hranová konzistence (arc consistency) AC pro binární CSP J* hrana (Ví,Vj) je hranove konzistentní, právě když pro každou hodnotu x z aktuální domény Dí existuje hodnota y tak, že ohodnocení [Ví = x,Vj = y] splnuje všechny binární podmínky nad Ví,Vj. it hranová konzistence je smerová konzistence hrany (Ví,Vj) nezarucuje konzistenci hrany (Vj,Ví) A I 3..7 A procedure revise((i,j)) Deleted := false for V x in Dl do if neexistuje y g Dj takové, že (x,y) je konzistentní then Di := Di - {x} Deleted := true end if return Deleted end revise Hana Rudová, Logické programování I, 13. kvetna 2011 217 Algoritmy pro CSP Algoritmus rěvizě hrany & Jak udělat hranu (Vi,Vj) hranově konzistentní? -í* Z domény Di vyradím takové hodnoty x, které nejsou konzistentní s aktuální doménou Dj (pro x neexistuje žádá hodnoty y v Dj tak, aby ohodnocení Vi = x a Vj = y splnovalo všechny binární podmínky mezi Vl a Vj) JS> procedure revise((i,j)) Deleted := false for v x in Dl do if neexistuje y g Dj takové, že (x,y) je konzistentní then Di := Di - {x} Deleted := true end if return Deleted end revise M domain([Vi,V2],2,4), Vi#< V2 Hana Rudová, Logické programování I, 13. kvetna 2011 217 Algoritmy pro CSP Algoritmus revize hrany & Jak udělat hranu (Vi,Vj) hranově konzistentní? -í* Z domény Di vyřadím takové hodnoty x, které nejsou konzistentní s aktuální doménou Dj (pro x neexistuje žádá hodnoty y v Dj tak, aby ohodnocení Vi = x a Vj = y spinovalo všechny binární podmínky mezi Vl a Vj) JS> procedure revise((i,j)) Deleted := false for v x in Dl do if neexistuje y g Dj takové, že (x,y) je konzistentní then Di := Di - {x} Deleted := true end if return Deleted end revise M domain([Vi, V2],2,4), Vi#< V2 revise((1,2)) smaže 4 z Di, Hana Rudová, Logické programování I, 13. kvetna 2011 217 Algoritmy pro CSP Algoritmus revize hrany & Jak udelat hranu (Vi,Vj) hranove konzistentní? -í* Z domény Di vyradím takové hodnoty x, které nejsou konzistentní s aktuální doménou Dj (pro x neexistuje žádá hodnoty y v Dj tak, aby ohodnocení Vi = x a Vj = y splnovalo všechny binární podmínky mezi Vl a Vj) JS> procedure revise((i,j)) Deleted := false for v x in Dl do if neexistuje y g Dj takové, že (x,y) je konzistentní then Di := Di - {x} Deleted := true end if return Deleted end revise JS> domain([Vi, V2],2,4), Vi#< V2 revise((1,2)) smaže 4 z Di,D2 se nezmení Hana Rudová, Logické programování I, 13. kvetna 2011 217 Algoritmy pro CSP Dosažení hranové konzistence problému JS> Jak udelat CSP hranove konzistentní? Jt revize je potreba opakovat, dokud se mení doména nejaké promenné a efektivnejší: opakování revizí můžeme delat pomocí fronty pridáváme do ní hrany, jejichž konzistence mohla být narušena zmenšením domény Hana Rudová, Logické programování I, 13. kvetna 2011 218 Algoritmy pro CSP Dosažení hranové konzistence problému Jak udělat CSP hranově konzistentní? Jt revize je potreba opakovat, dokud se mění doména nějaké proměnné s> efektivnější: opakování revizí mUžeme dělat pomocí fronty pridávame do ní hrany, jejichž konzistence mohla být narušena zmenšením domény Jaké hrany presně revidovat po zmenšení domény? ty, jejichž konzistence mUže být zmenšením domény proměnné narušena jsou to hrany (i,k), které vedou do proměnné Vk se zmenšenou doménou V < V k m hranu (m, k) vedoucí z proměnné Vm, která zmenšení domény způsobila, není treba revidovat (změna se jí nedotkne) Hana Rudová, Logické programování I, 13. května 2011 218 Algoritmy pro CSP Algoritmus AC-3 procedure AC-3(G) ____^ Vk *^ Vm Q := {(i,j) I (i,j) £ hrany(G), í = j} % seznam hran pro revizi while Q non empty do vyber a smaž (k,m) z Q if revise((k, m)) then % pridani pouze hran, ktere Q := Q u {(i,k) g hrany(G), i = k, i = m} % dosud nejsou ve fronte end while end AC-3 Hana Rudová, Logické programování I, 13. kvetna 2011 219 Algoritmy pro CSP Algoritmus AC-3 procedure AC-3(G) ____^ Vk *^ Vm Q := {(í,J) | (í,J) £ hrany(G), í = j} % seznam hran pro revizi while Q non empty do vyber a smaž (k,m) z Q if revise((k,m)) then % pridani pouze hran, ktere Q := Q u {(í,k) g hrany(G), í = k, í = m} % dosud nejsou ve fronte end while end AC-3 Príklad: A Víme alespon zda rešení existuje? NE Hana Rudová, Logické programování I, 13. kvetna 2011 220 Algoritmy pro CSP Je hranová konzistence dostateCná? Použitím AC odstraníme mnoho nekompatibilních hodnot a Dostaneme potom rešení problému? NE %> Víme alespon zda r ešení existuje? NE domain([X,Y,Z],1,2), X#\= Y, Y#\= Z, Z#\= X a hranove konzistentní a nemá žádné r ešení Hana Rudová, Logické programování I, 13. kvetna 2011 220 Algoritmy pro CSP Je hranová konzistence dostatecná? Použitím AC odstraníme mnoho nekompatibilních hodnot a Dostaneme potom rešení problému? NE %> Víme alespon zda r ešení existuje? NE domain([X,Y,Z],1,2), X#\= Y, Y#\= Z, Z#\= X s» hranove konzistentní a nemá žádné r ešení Jaký je tedy význam AC? a nekdydár ešení p rímo nejaká doména se vyprázdní ^ rešení neexistuje všechny domény jsou jednoprvkové ^ máme r ešení a v obecném p rípade se alespon zmenší prohledávaný prostor Hana Rudová, Logické programování I, 13. kvetna 2011 220 Algoritmy pro CSP k-konzistence Mají NC a AC neco spolecného? s NC: konzistence jedné promenné & AC: konzistence dvou proměnných ... mužeme pokracovat Hana Rudová, Logické programování I, 13. kvetna 2011 221 Algoritmy pro CSP k-konzistence Mají NC a AC něco společného? s NC: konzistence jedné proměnné it AC: konzistence dvou proměnných ... mUžeme pokračovat CSP je k-konzistentní práve tehdy, když mUžeme libovolné konzistentní ohodnocení (k-1) rUzných promenných rozšířit do libovolné k-té promenné Hana Rudová, Logické programování I, 1S. kvetna 2011 221 Algoritmy pro CSP k-konzistence Mají NC a AC neco spolecného? s NC: konzistence jedné promenné & AC: konzistence dvou proměnných ... mužeme pokracovat CSP je k-konzistentní práve tehdy, když mužeme libovolné konzistentní ohodnocení (k-1) různých proměnných rozšír it do libovolné k-té promenné f / f 1,2,3 1,2,3 1,2,3 4 JS> Pro obecné CSP, tedy i pro nebinární podmínky Hana Rudová, Logické programování I, 13. kvetna 2011 221 4-konzistentní graf Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf 1,2 1,2 1,2,3 není 2-konzistentní Hana Rudová, Logické programování I, 13. kvetna 2011 222 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1,1) lze rozšírit na (1,1,1) (2, 2) lze rozšírit na (2, 2,2) 1,2 1,2 1,2,3 není 2-konzistentní (3) nelze rozšírit (1, 3) ani (2, 3) nejsou konzistentní dvojice (nerozširujeme je) Hana Rudová, Logické programování I, 13. kvetna 2011 222 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1,1) lze rozšírit na (1,1,1) (2, 2) lze rozšírit na (2, 2,2) 1,2 1,2 1,2,3 není 2-konzistentní (3) nelze rozšírit (1, 3) ani (2, 3) nejsou konzistentní dvojice (nerozširujeme je) & CSPje silne k-konzistentní práve tehdy, když je j-konzistentní pro každé j k-konzistence -í* Silná k-konzistence => j-konzistence V j < k -í* k-konzistence ^ silná k-konzistence Hana Rudová, Logické programování I, 13. kvetna 2011 222 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1,1) lze rozšírit na (1,1,1) 1,2 1,2 1,2,3 není 2-konzistentní (3) nelze rozšírit (2, 2) lze rozšírit na (2, 2,2) (1, 3) ani (2, 3) nejsou konzistentní dvojice (nerozširujeme je) & CSPje silne k-konzistentní práve tehdy, když je j-konzistentní pro každé j Silná k-konzistence => k-konzistence -í* Silná k-konzistence => j-konzistence V j < k -í* k-konzistence ^ silná k-konzistence & NC = silná 1-konzistence = 1-konzistence & AC = (silná) 2-konzistence Hana Rudová, Logické programování I, 13. kvetna 2011 222 Algoritmy pro CSP Konzistence přo nalezení řešení Máme-li graf s n vrcholy, jak silnou konzistenci potrebujeme, abychom prímo našli rešení? a silná n-konzistence je nutná pro graf s n vrcholy Hana Rudová, Logické programování I, 13. kvetna 2011 223 Algoritmy pro CSP Konzistence pro nalezení rešení Máme-li graf s n vrcholy, jak silnou konzistenci potrebujeme, abychom p rímo našli rešení? a silná n-konzistence je nutná pro graf s n vrcholy n-konzistence nestací (viz p r edchozí p ríklad) Hana Rudová, Logické programování I, 13. kvetna 2011 223 Algoritmy pro CSP Konzistence pro nalezení řešení Máme-li graf s n vrcholy, jak silnou konzistenci potřebujeme, abychom přímo našli řešení? a silná n-konzistence je nutná pro graf s n vrcholy n-konzistence nestací (viz predchozí príklad) silná k-konzistence pro k Využívá se sémantika podmínek s> speciální typy konzistence pro globální omezení ±* viz all_distinct a konzistence mezí propagace pouze pri zmene nejmenší a nejvetší hodnoty v doméne promenné C- Pro různé podmínky lze použít různý druh konzistence J* A# Propagaci pres globální podmínku rešíme speciálním algoritmem navrženým pro danou podmínku C Príklady: M all_different omezení: hodnoty všech proměnných různé Jt serialized omezení: rozvržení úloh zadaných startovním casem a dobou trvání tak, aby se neprekrývaly Hana Rudová, Logické programování I, 13. kvetna 2011 226 Algoritmy pro CSP Propagace pro all_distinct -I U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro X1, X3, X6 učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 227 Algoritmy pro CSP Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro X1, X3, X6 X1 in 5..6, X3 = 5, X6 in {1} \/ (5..6) učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 13. května 2011 227 Algoritmy pro CSP Propagace pro all_distinct -I U = {X2, X4, X5}, dom(U) = {2,3,4} nelze pro X1, X1 in 5..6, X3 = 5, & Konzistence: V{Xi,... ,Xk} 2, 3, 4}: X3, X6 X6 in {1} \/ (5..6) c V : card{Di u • • • u Dk} > k učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 13. května 2011 227 Algoritmy pro CSP Přopagace přo a11_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: učitel min max {2,3,4} nelze pro X1, X3, X6 Jan 3 6 X1 in 5..6, X3 = 5, X6 in {1} \/ (5..6) Petr 4 Konzistence: V{X1?.. .,Xk} c V : card{Di u • • • u Dk} > k Anna 2 5 stací hledat Hallův inteřval I: velikost intervalu I je rovna Ota 4 poctu proměnných, jejichž doména je v I Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 227 Algoritmy pro CSP Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro X1, X3, X6 X1 in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: \/{X1,.. .,Xk} c V : card{D1 u • • • u Dk} > k stací hledat Hallův interval I: velikost intervalu I je rovna poctu proměnných, jejichž doména je v I InferenCní pravidlo U = {X1,...,Xk}, dom(U) = {D1 u • • • u Dk} učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 card(U) = card(dom(U)) => \/v e dom(U), MX e (V - U),X = v Hana Rudová, Logické programování I, 13. kvetna 2011 227 Algoritmy pro CSP Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro X1, X3, X6 X1 in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: V{X1,.. .,Xk} c V : card{D1 u • • • u Dk} > k stací hledat Hallův interval I: velikost intervalu I je rovna poctu promenných, jejichž doména je v I Inferencní pravidlo U = {X1,...,Xk}, dom(U) = {D1 u • • • u Dk} card(U) = card(dom(U)) => Vv e dom(U), VX e (V - U),X = v s» hodnoty v Hallove intervalu jsou pro ostatní promenné nedostupné učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 227 Algoritmy pro CSP Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro X1, X3, X6 X1 in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: V{X1?.. .,Xk} c V : card{Di u • • • u Dk} > k stací hledat Hallův interval I: velikost intervalu I je rovna poctu promenných, jejichž doména je v I Inferencní pravidlo U = {Xi,...,Xk}, dom(U) = {Di u • • • u Dk} card(U) = card(dom(U)) => Vv g dom(U), VX g (V - U),X = v s» hodnoty v Hallove intervalu jsou pro ostatní promenné nedostupné učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Složitost: O(2n) - hledání všech podmnožin množiny n promenných (naivní) Hana Rudová, Logické programování I, 13. kvetna 2011 227 Algoritmy pro CSP Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro X1, X3, X6 X1 in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: \/{Xi,.. .,Xk} c V : card{Di u • • • u Dk} > k stací hledat Hallův interval I: velikost intervalu I je rovna poctu proměnných, jejichž doména je v I InferenCní pravidlo U = {Xu...,Xk}, dom(U) = {Di u • • • u Dk} card(U) = card(dom(U)) => Vv g dom(U), VX g (V - U),X = v a hodnoty v Hallove intervalu jsou pro ostatní promenné nedostupné Složitost: O(2n) - hledání všech podmnožin množiny n proměnných (naivní) O(nlogn) - kontrola hranicních bodu Hallových intervalu (1998) učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 13. kvetna 2011 227 Algoritmy pro CSP Prohledávání + konzistence Splňování podmínek prohledáváním prostoru řešení it podmínky jsou užívány pasivné jako test it přiřazuji hodnoty promenných a zkouším co se stane it vestavený prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj Hana Rudová, Logické programování I, 13. kvetna 2011 228 Algoritmy pro CSP Prohlědávání + konzistěncě JS> Splnování podmínek prohlědáváním prostoru r ešení it podmínky jsou užívány pasivně jako test it p r i razuji hodnoty proměnných a zkouším co se stane it vestavěný prohledávací algoritmus Prologu: backtracking, triviální: gěněruj & těstuj it úplná metoda (nalezneme r ešení nebo dokážeme jeho neexistenci) it zbytecně pomalé (exponenciální): procházím i „evidentně" špatná ohodnocení Hana Rudová, Logické programování I, 13. května 2011 228 Algoritmy pro CSP Prohledávání + konzistence Splnování podmínek prohledáváním prostoru r ešení A podmínky jsou užívány pasivne jako test p r i razuji hodnoty promenných a zkouším co se stane vestavený prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj úplná metoda (nalezneme r ešení nebo dokážeme jeho neexistenci) zbytecne pomalé (exponenciální): procházím i „evidentne" špatná ohodnocení & Konzistencní (propagacní) techniky -i- umožnují odstranení nekonzistentních hodnot z domény promenných neúplná metoda (v doméne zustanou ješte nekonzistentní hodnoty) A relativne rychlé (polynomiální) Hana Rudová, Logické programování I, 13. kvetna 2011 228 Algoritmy pro CSP Přohledávání + konzistence Splnování podmínek přohledáváním prostoru r ešení Jt podmínky jsou užívány pasivne jako test J> p r i razuji hodnoty promenných a zkouším co se stane vestavený prohledávací algoritmus Prologu: backtřacking, triviální: geneřuj & testuj Jt úplná metoda (nalezneme r ešení nebo dokážeme jeho neexistenci) zbytecne pomalé (exponenciální): procházím i „evidentne" špatná ohodnocení & Konzistencní (přopagacní) techniky -i- umožnují odstranení nekonzistentních hodnot z domény promenných Jt neúplná metoda (v doméne zustanou ješte nekonzistentní hodnoty) A relativne rychlé (polynomiální) & Používá se kombinace obou metod Jt postupné p r i razování hodnot promenným -i- po p r i razení hodnoty odstranení nekonzistentních hodnot konzistencními technikami Hana Rudová, Logické programování I, 13. kvetna 2011 228 Algoritmy pro CSP Prohledávání do hloubky Základní prohledávací algoritmus pro problémy splnování podmínek & Prohledávání stavového prostoru do hloubky (depth first search) & Dve fáze prohledávání s navracením & dopredná fáze: promenné jsou postupne vybírány, rozširuje se cástecné rešení prirazením konzistení hodnoty (pokud existuje) další promenné po vybrání hodnoty testujeme konzistenci a zpetná fáze: pokud neexistuje konzistentní hodnota pro aktuální promennou, algoritmus se vrací k predchozí prirazené hodnote Hana Rudová, Logické programování I, 13. kvetna 2011 229 Algoritmy pro CSP Prohledávání do hloubky & Základní prohledávací algoritmus pro problémy splnování podmínek & Prohledávání stavového prostoru do hloubky (depth first search) & Dve fáze prohledávání s navracením & dopredná fáze: promenné jsou postupne vybírány, rozširuje se cástecné rešení prirazením konzistení hodnoty (pokud existuje) další promenné po vybrání hodnoty testujeme konzistenci a zpetná fáze: pokud neexistuje konzistentní hodnota pro aktuální promennou, algoritmus se vrací k předchozí prirazené hodnote & Promenné delíme na & minulé - promenné, které už byly vybrány (a mají prirazenu hodnotu) * aktuální - promenná, která je práve vybrána a je jí prirazována hodnota s budoucí - promenné, které budou vybrány v budoucnosti Hana Rudová, Logické programování I, 13. kvetna 2011 229 Algoritmy pro CSP Základní algoritmus prohledávání do hloubky Pro jednoduchost proměnné očíslujeme a ohodnocujeme je v daném po ř adí Na začátku voláno jako 1abe1ing(G,1) procedure 1abe1ing(G,a) if a > |uz1y(G)| then return uzly(G) for Vx g Da do if consistent(G,a) then % consistent(G,a) je nahrazeno FC(G,a), LA(G,a), . R := 1abe1ing(G,a +1) if R = fail then return R return fail end labeling Po p ř i řazení všech promenných vrátíme jejich ohodnocení Procedury consistent uvedeme pouze pro binární podmínky Hana Rudová, Logické programování I, 13. května 2011 230 Algoritmy pro CSP Backtracking (BT) Backtracking overuje v každém kroku konzistenci podmínek vedoucích z minulých promenných do aktuální promenné Backtracking tedy zajišťuje konzistenci podmínek it na všech minulých promenných it na podmínkách mezi minulými promennými a aktuální promennou Hana Rudová, Logické programování I, 13. kvetna 2011 231 Algoritmy pro CSP Backtracking (BT) Backtracking overuje v každém kroku konzistenci podmínek vedoucích z minulých proměnných do aktuální promenné Backtracking tedy zajišťuje konzistenci podmínek Jt na všech minulých promenných Jt na podmínkách mezi minulými promennými a aktuální promennou procedure BT(G,a) Q:={(Vi, Va) g hrany(G), i < a} % hrany vedoucí z minulých promenných do aktuální Consistent := true while Q není prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q Consistent := not revise(Vk,Vm) % pokud vyradíme prvek, bude doména prázdná return Consistent end BT Hana Rudová, Logické programování I, 13. kvetna 2011 231 Algoritmy pro CSP Príklad: backtracking C Omezení: Vi, V2, V3 in 1... 3, Vi# = 3 x V3 & Stavový prostor: í S* cervené ctverecky: chybný pokus o instanciaci, r ešení neexistuje i* nevyplnená kolecka: nalezeno r ešení Jť cerná kolecka: vnit r ní uzel, máme pouze cástecné p r i razení Hana Rudová, Logické programování I, 13. kvetna 2011 232 Kontrola dopředu (FC - forward checking) FC je rozšírení backtrackingu FC navíc zajišťuje konzistenci mezi aktuální proměnnou a budoucími promennými, které jsou s ní spojeny dosud nesplnenými podmínkami Hana Rudová, Logické programování I, 13. kvetna 2011 233 Algoritmy pro CSP Kontrola dopredu (FC - forward checking) FC je rozšírení backtrackingu FC navíc zajišťuje konzistenci mezi aktuální promennou a budoucími promennými, které jsou s ní spojeny dosud nesplnenými podmínkami procedure FC(G,a) Q:={(Vi, va) g hrany(G), i> a} % pridání hran z budoucích do aktuální promenné Consistent := true while Q není prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q if revise((Vk,Vm)) then Consistent := (\Dk\ > 0) % vyprázdnení domény znamená nekonzistenci return Consistent end FC Hrany z minulých promenných do aktuální promenné není nutno testovat Hana Rudová, Logické programování I, 13. kvetna 2011 233 Algoritmy pro CSP Príklad: kontrola dopredu C Omezení: V1,V2,V3 in 1... 3, c : V1# = 3 x V3 -í* Stavový prostor: Hana Rudová, Logické programování I, 13. kvetna 2011 234 Algoritmy pro CSP Pohled dopredu (LA - looking ahead) LAjě rozšírení FC, navíc ově r uje konzistenci hran mezi budoucími proměnnými procedure LA(G,a) Q := {(Vi,Va) g hrany(G), i > a} % zaCínáme s hranami do a Consistent := true while Q není prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q if revise((Vk,Vm)) then Q := Q u {(Vi,Vk)\(Vi,Vk) g hrany(G), i = k,i = m,i> a} Consistent := (|Dk| > 0) return Consistent end LA Hana Rudová, Logické programování I, 13. kvetna 2011 235 Algoritmy pro CSP Pohled dopředu (LA - looking ahead) LA je rozšírení FC, navíc ověřuje konzistenci hran mezi budoucími proměnnými procedure LA(G,a) Q := {(Vi,Va) g hrany(G), i> a} % začínáme s hranami do a Consistent := true while Q není prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q if revise((Vk,Vm)) then Q := Q u {(Vi,Vk)\(Vi,Vk) g hrany(G), i = k, i = m,i> a} Consistent := (\Dk\ > 0) return Consistent end LA A Hrany z minulých promenných do aktuální promenné opet netestujeme -i- Tato LA procedura je založena na AC-3, lze použít i jiné AC algoritmy JS> LA udržuje hranovou konzistenci: protože ale LA(G,a) používá AC-3, musíme zajistit iniciální konzistenci pomocí AC-3 ješte pred startem prohledávání Hana Rudová, Logické programování I, 13. kvetna 2011 235 Algoritmy pro CSP Príklad: pohled dopredu (pomocí AC-3) Omezení: V1.V2.V3 in 1...4, c 1: Vi# > V2, c2: V?# = 3 x V3 Stavový prostor (spouští se iniciální konzistence se pred startem prohledávání) q cl => V in 2..4 V2 in 1..3 c2 => V2 = 3 V3 = 1 V1 4 cl => V1= 4 V2 31 V3 4 Hana Rudová, Logické programování I, 13. kvetna 2011 236 Algoritmy pro CSP Prěhlěd algoritmů Backtracking (BT) kontroluje v kroku a podmínky C(Vi ,Va),...,C(Va-l,Va) z minulých proměnných do aktuální proměnné BT FC LA promenne aktuálni Hana Rudová, Logické programování I, 13. května 2011 237 Algoritmy pro CSP Přehled algoritmů Backtracking (BT) kontroluje v kroku a podmínky C(Vi ,Va),...,c(Va-1,Va) z minulých promenných do aktuální promenné Kontrola dopředu (FC) kontroluje v kroku a podmínky c(Va+1,Va),...,c(Vn,Va) z budoucích promenných do aktuální promenné BT a FC LA n promenne aktuální Hana Rudová, Logické programování I, 13. kvetna 2011 237 Algoritmy pro CSP Prehled algoritmů BT Backtracking (BT) kontroluje v kroku a podmínky C(Vi ,Va),...,c(Va-1,Va) z minulých promenných do aktuální promenné Kontrola dopredu (FC) kontroluje v kroku a podmínky c(Va+1,Va),...,c(Vn,Va) z budoucích promenných do aktuální promenné Pohled dopredu (LA) kontroluje v kroku a podmínky \/l(a < l < n), \/k(a < k < n),k = l: c(Vk,Vi) z budoucích promenných do aktuální promenné LA a mezi budoucími promennými a FC n promenne aktuální Hana Rudová, Logické programování I, 13. kvetna 2011 237 Algoritmy pro CSP Cvicení 1. Jak vypadá stavový prostor rešení pro následující omezení A in 1..4, B in 3..4, C in 3..4, B #< C, A#= C p r i použití kontroly dop redu a uspo rádání promenných A,B,C? Popište, jaký typ propagace probehne v jednotlivých uzlech. 2. Jak vypadá stavový prostor rešení pro následující omezení A in 1..4, B in 3..4, C in 3..4, B #< C, A#= C p r i použití pohledu dop r edu a uspo rádání promenných A,B,C? Popište, jaký typ propagace probehne v jednotlivých uzlech. 3. Jak vypadá stavový prostor rešení pro následující omezení domain([A,B,C],0,1), A#= B-1, C #= A*A p r i použití backtrackingu a pohledu dop r edu a uspo rádání promenných A,B,C? Popište, jaký typ propagace probehne v jednotlivých uzlech. Hana Rudová, Logické programování I, 13. kvetna 2011 238 Algoritmy pro CSP Cvičení 1. Ukažte, jak je dosaženo hranové konzistence v následujícím p r íkladu: domain([X,Y,Z],1,5]), X #< Y, Z#= Y+1 . Hana Rudová, Logické programování I, 13. května 2011 239 Algoritmy pro CSP Implementace Prologu Literatura: & Matyska L., Toman D.: Implementacní techniky Prologu, Informacní systémy, (1990), 21-59. http://www.ics.muni.cz/people/matyska/vyuka/lp/lp.html Opakování: základní pojmy -í* Konecná množina klauzulí Hlava :- Tělo tvo rí přogřam P. JS> Hlava je literál & Tělo je (eventuálne prázdná) konjunkce literál u Ti,...Ta, a > 0 & Liteřál je tvo r en m-árním predikátovým symbolem (m/p) a m termy (argumenty) JS> Teřm je konstanta, promenná nebo složený term. -í* Složený teřm s n termy na míste argumentu & Dotaz (cíl) je neprázdná množina literálu. Hana Rudová, Logické programování I, 13. kvetna 2011 241 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literály tela. Hana Rudová, Logické programování I, 13. kvetna 2011 242 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literály tela. Procedurální (imperativní) sémantika: Entry: Hlava:: { call Ti ■ ■ ■ call Ta } Volání procedury s názvem Hlava uspeje, pokud uspeje volání všech procedur (literálu) v tele. Hana Rudová, Logické programování I, 13. kvetna 2011 242 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literály tela. Procedurální (imperativní) sémantika: Entry: Hlava:: { call Ti ■ ■ ■ call Ta } Volání procedury s názvem Hlava uspeje, pokud uspeje volání všech procedur (literálů) v tele. Procedurální sémantika = podklad pro implementaci Hana Rudová, Logické programování I, 13. kvetna 2011 242 Implementace Prologu Abstraktní interpret Vstup: Logický program P a dotaz G. 1. Inicializuj množinu cílů S literály z dotazu G; S:=G 2. while ( S != empty ) do 3. Vyber AeS a dále vyber klauzuli A':-B1 ,...,Bn (n > 0) z programu P takovou, že 3a : Aer = A' a; a je nejobecnejší unifikátor. Pokud neexistuje A' nebo a, ukonci cyklus. Hana Rudová, Logické programování I, 13. kvetna 2011 243 Implementace Prologu Abstraktní interpret Vstup: Logický program P a dotaz G. 1. Inicializuj množinu cílů S literály z dotazu G; S:=G 2. while ( S != empty ) do 3. Vyber AeS a dále vyber klauzuli A':-B1 ,...,Bn (n > 0) z programu P takovou, že 3a : Aa = A' a; a je nejobecnejší unifikátor. Pokud neexistuje A' nebo a, ukonci cyklus. 4. Nahrad' A v S cíli B1 až Bn. 5. Aplikuj a na G a S. 6. end while 7. Pokud S==empty, pak výpocet úspešne skoncil a výstupem je G se všemi aplikovanými substitucemi. Pokud S!=empty, výpocet koncí neúspechem. Hana Rudová, Logické programování I, 13. kvetna 2011 243 Implementace Prologu Abstraktní interpret - pokracování Kroky (3) až (5) predstavují redukci (logickou inferenci) cíle A. Pocet redukcí za sekundu (LIPS) == indikátor výkonu implementace Hana Rudová, Logické programování I, 13. kvetna 2011 244 Implementace Prologu Abstraktní interpret - pokracování Kroky (3) až (5) p r edstavují redukci (logickou inferenci) cíle A. Pocet redukcí za sekundu (LIPS) == indikátor výkonu implementace veta Existuje-li instance C dotazu G, odvoditelná z programu P v konecném poctu kroků, pak bude tímto interpretem nalezena. Hana Rudová, Logické programování I, 13. kvetna 2011 244 Implementace Prologu Nedeterminismus interpetu 1. Selekcní pravidlo: výber cíle A z množiny cílu S JÍ neovlivnuje výrazne výsledek chování interpretu 2. Způsob prohledávání stromu výpoctu: výber klauzule A' z programu P JG* je velmi důležitý, všechny klauzule totiž nevedou k úspešnému r ešení Hana Rudová, Logické programování I, 13. kvetna 2011 245 Implementace Prologu Nedeterminismus interpetu 1. SelekCní pravidlo: výber cíle A z množiny cílu S JÍ neovlivnuje výrazne výsledek chování interpretu 2. Způsob prohledávání stromu výpoCtu: výber klauzule A' z programu P JG* je velmi důležitý, všechny klauzule totiž nevedou k úspešnému r ešení Vztah k úplnosti: 1. Selekcní pravidlo neovlivnuje úplnost & možno zvolit libovolné v rámci SLD rezoluce 2. Prohledávání stromu výpoctu do šír ky nebo do hloubky Hana Rudová, Logické programování I, 13. kvetna 2011 245 Implementace Prologu Nedeterminismus interpetu 1. SelekCní pravidlo: výber cíle A z množiny cílu S M neovlivnuje výrazne výsledek chování interpretu 2. Způsob prohledávání stromu výpoCtu: výber klauzule A' z programu P JG* je velmi důležitý, všechny klauzule totiž nevedou k úspešnému rešení Vztah k úplnosti: 1. Selekcní pravidlo neovlivnuje úplnost & možno zvolit libovolné v rámci SLD rezoluce 2. Prohledávání stromu výpoctu do šírky nebo do hloubky „Prozrení" - automatický výber správné klauzule & vlastnost abstraktního interpretu, kterou ale reálné interprety nemají Hana Rudová, Logické programování I, 13. kvetna 2011 245 Implementace Prologu Prohledávání do šířky 1. Vybereme všechny klauzule A-, které je možno unifikovat s literálem A M necht'je techto klauzulí q 2. Vytvoríme q kopií množiny S 3. V každé kopii redukujeme A jednou z klauzulí A-. M aplikujeme príslušný nejobecnejší unifikátor Hana Rudová, Logické programování I, 13. kvetna 2011 246 Implementace Prologu Přohledávání do ší ř ky 1. Vybereme všechny klauzule A-, které je možno unifikovat s literálem A M necht'je techto klauzulí q 2. Vytvoríme q kopií množiny S 3. V každé kopii redukujeme A jednou z klauzulí AÍ. M aplikujeme príslušný nejobecnejší unifikátor 4. V následujících krocích redukujeme všechny množiny Si soucasne. Hana Rudová, Logické programování I, 13. kvetna 2011 246 Implementace Prologu Prohledávání do šířky 1. Vybereme všechny klauzule které je možno unifikovat s literálem A M necht'je těchto klauzulí q 2. Vytvo ríme q kopií množiny S 3. V každé kopii redukujeme A jednou z klauzulí AÍ. M aplikujeme p ríslušný nejobecnější unifikátor 4. V následujících krocích redukujeme všechny množiny Si soucasně. 5. Výpocet ukoncíme úspěchem, pokud se alespon jedna z množin Si stane prázdnou. Hana Rudová, Logické programování I, 13. kvetna 2011 246 Implementace Prologu Prohledávání do šírky 1. Vybereme všechny klauzule A-, které je možno unifikovat s literálem A M necht'je techto klauzulí q 2. Vytvo ríme q kopií množiny S 3. V každé kopii redukujeme A jednou z klauzulí A-. M aplikujeme p ríslušný nejobecnejší unifikátor 4. V následujících krocích redukujeme všechny množiny Si soucasne. 5. Výpocet ukoncíme úspechem, pokud se alespon jedna z množin Si stane prázdnou. -í* Ekvivalence s abstraktnímu interpretem A pokud jeden interpret neuspeje, pak neuspeje i druhý i> pokud jeden interpret uspeje, pak uspeje i druhý Hana Rudová, Logické programování I, 13. kvetna 2011 246 Implementace Prologu Prohledávání do hloubky 1. Vybereme všechny klauzule A'i, které je možno unifikovat s literálem A. 2. Všechny tyto klauzule zapíšeme na zásobník. 3. Redukci provedeme s klauzulí na vrcholu zásobníku. Hana Rudová, Logické programování I, 13. kvetna 2011 247 Implementace Prologu Prohledávání do hloubky 1. Vybereme všechny klauzule A'i, které je možno unifikovat s literálem A. 2. Všechny tyto klauzule zapíšeme na zásobník. 3. Redukci provedeme s klauzulí na vrcholu zásobníku. 4. Pokud v nejakém kroku nenajdeme vhodnou klauzuli A', vrátíme se k predchozímu stavu (tedy anulujeme aplikace posledního unifikátoru a) a vybereme ze zásobníku další klauzuli. Hana Rudová, Logické programování I, 13. kvetna 2011 247 Implementace Prologu Prohledávání do hloubky 1. Vybereme všechny klauzule A'i, které je možno unifikovat s literálem A. 2. Všechny tyto klauzule zapíšeme na zásobník. 3. Redukci provedeme s klauzulí na vrcholu zásobníku. 4. Pokud v nejakém kroku nenajdeme vhodnou klauzuli A', vrátíme se k p r edchozímu stavu (tedy anulujeme aplikace posledního unifikátoru a) a vybereme ze zásobníku další klauzuli. 5. Pokud je zásobník prázdný, koncívýpocet neúspechem. 6. Pokud naopak zredukujeme všechny literály v S, výpocet koncí úspechem. Hana Rudová, Logické programování I, 13. kvetna 2011 247 Implementace Prologu Prohledávání do hloubky 1. Vybereme všechny klauzule A'i, které je možno unifikovat s literálem A. 2. Všechny tyto klauzule zapíšeme na zásobník. 3. Redukci provedeme s klauzulí na vrcholu zásobníku. 4. Pokud v nejakém kroku nenajdeme vhodnou klauzuli A', vrátíme se k predchozímu stavu (tedy anulujeme aplikace posledního unifikátoru a) a vybereme ze zásobníku další klauzuli. 5. Pokud je zásobník prázdný, koncívýpocet neúspechem. 6. Pokud naopak zredukujeme všechny literály v S, výpocet koncí úspechem. -» Není úplné, tj. nemusí najít všechna rešení Nižší pametová nárocnost než prohledáváni do širky -í* Používá se v Prologu Hana Rudová, Logické programování I, 13. kvetna 2011 247 Implementace Prologu Reprezentace objektů J& Beztypový jazyk ü> Kontrola „typů" za běhu výpočtu JS> Informace o strukture součástí objektů Hana Rudová, Logické programování I, 13. kvetna 2011 248 Implementace Prologu Reprezentace objektů J& Beztypový jazyk JS> Kontrola „typů" za behu výpoctu JS> Informace o struktu re soucástí objektu Typy objektů M Primitivní objekty: konstanta císlo i* volná promenná -i- odkaz (reference) Hana Rudová, Logické programování I, 13. kvetna 2011 248 Implementace Prologu Reprezentace objektů J& Beztypový jazyk ü> Kontrola „typů" za běhu výpočtu JS> Informace o strukture součástí objektů Typy objektů M Primitivní objekty: konstanta číslo i* volná promenná -i- odkaz (reference) & Složené (strukturované) objekty: ± struktura A seznam Hana Rudová, Logické programování I, 13. kvetna 2011 248 Implementace Prologu Reprezentace objektů II P ríznaky (tags): Objekt Pr íznak volná promenná FREE konstanta CONST celé císlo INT odkaz REF složený term FUNCT Hana Rudová, Logické programování I, lS. kvetna 2Oll 249 Implementace Prologu Reprezentace objektů II P ríznaky (tags): Objekt Príznak volná promenná FREE konstanta CONST celé císlo INT odkaz REF složený term FUNCT Obsah adresovatelného slova: hodnota a príznak. Hana Rudová, Logické programování I, 1S. kvetna 2O11 249 Implementace Prologu Repřezentace objektů II Příznaky (tags): Objekt Příznak volná promenná FREE konstanta CONST celé císlo INT odkaz REF složený term FUNCT Obsah adresovatelného slova: hodnota a p ř íznak. Primitivní objekty uloženy prímo ve slove Hana Rudová, Logické programování I, 1S. kvetna 2011 249 Implementace Prologu Reprezentace objektů II Příznaky (tags): Objekt Pr íznak volná promenná FREE konstanta CONST celé císlo INT odkaz REF složený term FUNCT Obsah adresovatelného slova: hodnota a příznak. Primitivní objekty uloženy p rímo ve slově Složené objekty Ä jsou instance termu ve zdrojovém textu, tzv. zdrojového termu & zdrojový term bez proměnných => každá instanciace ekvivalentní zdrojovému termu zdrojový term s proměnnými => dvě instance se mohou lišit aktuálními hodnotami proměnných, jedinecnost zajišťuje kopírování struktur nebo sdílení struktur Hana Rudová, Logické programování I, 13. května 2011 249 Implementace Prologu Kopírování struktur P ríklad: a(b(X),c(X,Y),d), FUNCT a/S REF REF CONSTd FUNCT c/2 REF FREE Y FUNCT b/1 - FREE X Hana Rudová, Logické programování I, 1S. kvetna 2011 250 Implementace Prologu Kopírování struktur II Term F s aritou A reprezentován A+1 slovy: A funktor a arita v prvním slove J* 2. slovo nese první argument (resp. odkaz na jeho hodnotu) . A A+1 slovo nese hodnotu A-tého argumentu Reprezentace vychází z orientovaných acyklických grafu a/3 i _ d c/2 Y b/l X Vykopírována každá instance => kopírování struktur Termy ukládány na globální zásobník Hana Rudová, Logické programování I, 13. kvetna 2011 251 Implementace Prologu Sdílení struktur Vychází z myšlenky, že p r i reprezentaci je tr eba r ešit p rítomnost promenných & Instance termu < kostra_termu; rámec > M kostra_termu je zdrojový term s ocíslovanými promennými & rámec je vektor aktuálních hodnot techto promenných í-tá položka nese hodnotu í-té promenné v původním termu Hana Rudová, Logické programování I, 13. kvetna 2011 252 Implementace Prologu Sdílení struktur II Príklad: a(b(X),c(X,Y),d) reprezentuje < a(b($1),c($1,$2),d) ; [FREE, FREE] > kde symbolem $i oznacujeme í-tou promennou. Hana Rudová, Logické programování I, 13. kvetna 2011 253 Implementace Prologu Sdílení struktur II Pr íklad: a(b(X),c(X,Y),d) reprezentuje < a(b($1),c($1,$2),d) ; [FREE, FREE] > kde symbolem $i oznacujeme í-tou promennou. Implementace: < &kostra_termu; &rámec > (& vrací adresu objektu) Všechny instance sdílí spolecnou kostru_termu ^ sdílení struktur Hana Rudová, Logické programování I, 13. kvetna 2011 253 Implementace Prologu Srovnání: príklad Naivní srovnání: sdílení pamet'ove méne nárocné Hana Rudová, Logické programování I, 13. kvetna 2011 254 Implementace Prologu Sřovnání: p říklad Naivní srovnání: sdílení pamet'ove méne nárocné Platí ale pouze pro rozsáhlé termy prítomné ve zdrojovém kódu Hana Rudová, Logické programování I, 13. kvetna 2011 254 Implementace Prologu Srovnání: příklad Naivní srovnání: sdílení paměťově méně náročné Platí ale pouze pro rozsáhlé termy prítomné ve zdrojovém kódu Postupná tvorba termů: A = a(K,L,M), K = b(X), L = c(X,Y), M = d Sdílení termů A - kostra_a - K L M:d - kostra_b kostra_č - X Y Hana Rudová, Logické programování I, 13. kvetna 2011 254 Implementace Prologu Srovnání: príklad - pokračování C Kopírování struktur: A = a(K,L,M), K = b(X), L = c(X,Y), M = d FUNCT a/3 REF - REF - CONST d FUNCT c/2 - REF FREE Y FUNCT b/1 FREE X Hana Rudová, Logické programování I, 13. kvetna 2011 2SS Implementace Prologu Srovnání: příklad - pokračování C Kopírování struktur: A = a(K,L,M), K = b(X), L = c(X,Y), M = d FUNCT a/S REF - REF - CONST d FUNCT c/2 - REF FREE Y FUNCT b/l FREE X tj. identické jako prímé vytvoření termu a(b(X),c(X,Y),d) Hana Rudová, Logické programování I, 13. kvetna 201 1 255 Implementace Prologu Sřovnání II Složitost algořitmů přo p řístup k jednotlivým ařgumentům s sdílení struktur: nutná víceúrovnová neprímá adresace Jt kopírování struktur: bez problému Jt jednodušší algoritmy usnadnují i optimalizace Hana Rudová, Logické programování I, 1S. kvetna 2011 256 Implementace Prologu Srovnání II Složitost algoritmů pro přístup k jednotlivým argumentům s sdílení struktur: nutná víceúrovnová neprímá adresace & kopírování struktur: bez problémů jednodušší algoritmy usnadnují i optimalizace Lokalita prístupu do pameti s sdílení struktur: prístupy rozptýleny po pameti & kopírování struktur: lokalizované prístupy pri stránkování pameti - rozptýlení vyžaduje prístup k více stránkám Hana Rudová, Logické programování I, 13. kvetna 2011 256 Implementace Prologu Srovnání II Složitost algoritmů pro prístup k jednotlivým argumentům s sdílení struktur: nutná víceúrovnová nep rímá adresace & kopírování struktur: bez problému jednodušší algoritmy usnadnují i optimalizace Lokalita přístupů do pameti s sdílení struktur: p rístupy rozptýleny po pameti & kopírování struktur: lokalizované p rístupy p r i stránkování pameti - rozptýlení vyžaduje p rístup k více stránkám Z praktického hlediska neexistuje mezi temito p rístupy zásadní rozdíl Hana Rudová, Logické programování I, 13. kvetna 2011 256 Implementace Prologu Rízení výpoCtu JS> Dopředný výpoCet Jt po úspěchu (úspěšná redukce) jednotlivá volání procedur skoncí úspěchem s> klasické volání rekurzivních procedur Hana Rudová, Logické programování I, 13. kvetna 2011 257 Implementace Prologu Řízení výpoCtu JS> Dopredný výpoCet a po úspechu (úspešná redukce) jednotlivá volání procedur skoncí úspechem a klasické volání rekurzivních procedur JS> Zpetný výpoCet (backtracking) a po neúspechu vyhodnocení literálu (neúspešná redukce) nepodarí se unifikace aktuálních a formálních parametrů hlavy a návrat do bodu, kde zústala nevyzkoušená alternativa výpoctu je nutná obnova původních hodnot jednotlivých promenných po nalezení místa s dosud nevyzkoušenou klauzulí pokracuje dále dopredný výpocet Hana Rudová, Logické programování I, 13. kvetna 2011 257 Implementace Prologu AktivaCní záznam -í* Volání (=aktivace) procedury M Aktivace sdílí spoleCný kód, liší se obsahem aktivaCního záznamu & Aktivacní záznam uložen na lokálním zásobníku Hana Rudová, Logické programování I, 13. kvetna 2011 258 Implementace Prologu Aktivacní záznam -í* Volání (=aktivace) procedury M Aktivace sdílí spolecný kód, liší se obsahem aktivacního záznamu & Aktivacní záznam uložen na lokálním zásobníku JS> Dopredný výpocet i> stav výpoctu v okamžiku volání procedury A aktuální parametry it lokální promenné & pomocné promenné ('a la registry) Hana Rudová, Logické programování I, 13. kvetna 2011 258 Implementace Prologu Aktivační záznam -í* Volání (=aktivace) procedury M Aktivace sdílí společný kód, liší se obsahem aktivačního záznamu & Aktivacní záznam uložen na lokálním zásobníku JS> Dopredný výpocet i> stav výpoctu v okamžiku volání procedury A aktuální parametry iľ lokální promenné pomocné promenné ('a la registry) -í* Zpetný výpocet (backtracking) -i- hodnoty parametrů v okamžiku zavolání procedury následující klauzule pro zpracování pri neúspechu Hana Rudová, Logické programování I, 13. kvetna 2011 258 Implementace Prologu AktivaCní záznam a roll-baCk Neúspěšná klauzule mohla nainstanciovat nelokální proměnné Hana Rudová, Logické programování I, 13. kvetna 2011 259 Implementace Prologu Aktivační záznam a roll-back Neúspešná klauzule mohla nainstanciovat nelokální promenné a(X) : - X = b(c,Y), Y = d. ?- W = b(Z,e), a(W). (viz instanciace Z) Hana Rudová, Logické programování I, 13. kvetna 2011 259 Implementace Prologu Aktivační záznam a roll-back Neúspěšná klauzule mohla nainstanciovat nelokální proměnné a(X) : - X = b(c,Y), Y = d. ?- W = b(Z,e), a(W). (viz instanciace Z) -í* Pri návratu je treba obnovit (roll-back) původní hodnoty promenných Využijeme vlastností logických promenných Jť instanciovat lze pouze volnou promennou iť jakmile promenná získá hodnotu, nelze ji zmenit jinak než návratem výpoctu => puvodní hodnoty všech promenných odpovídají volné promenné Hana Rudová, Logické programování I, 13. kvetna 2011 259 Implementace Prologu Aktivační záznam a roll-back Neúspešná klauzule mohla nainstanciovat nelokální proměnné a(X) : - X = b(c,Y), Y = d. ?- W = b(Z,e), a(W). (viz instanciace Z) -í* Pri návratu je treba obnovit (roll-back) původní hodnoty proměnných Využijeme vlastností logických promenných Jť instanciovat lze pouze volnou promennou iť jakmile promenná získá hodnotu, nelze ji zmenit jinak než návratem výpočtu => puvodní hodnoty všech promenných odpovídají volné promenné & Stopa (trail): zásobník s adresami instanciovaných promenných A ukazatel na aktuální vrchol zásobníku uchováván v aktivacním záznamu pri neúspechu jsou hodnoty promenných na stope v úseku mezi aktuálním a uloženým vrcholem zásobníku zmeneny na „volná" Hana Rudová, Logické programování I, 13. kvetna 2011 259 Implementace Prologu AktivaCní záznam a roll-baCk Neúspěšná klauzule mohla nainstanciovat nelokální proměnné a(X) : - X = b(c,Y), Y = d. ?- W = b(Z,e), a(W). (viz instanciace Z) -í* Pri návratu je treba obnovit (roll-baCk) puvodní hodnoty proměnných Využijeme vlastností logických proměnných Jť instanciovat lze pouze volnou proměnnou i* jakmile proměnná získá hodnotu, nelze ji změnit jinak než návratem výpočtu => puvodní hodnoty všech proměnných odpovídají volné proměnné & Stopa (trail): zásobník s adresami instanciovaných proměnných Jt ukazatel na aktuální vrchol zásobníku uchováván v aktivacním záznamu pri neúspěchu jsou hodnoty proměnných na stopě v úseku mezi aktuálním a uloženým vrcholem zásobníku změněny na „volná" & Globální zásobník: pro uložení složených termu S> ukazatel na aktuální vrchol zásobníku uchováván v aktivacním záznamu -i- pri neúspěchu vrchol zásobníku snížen podle uschované hodnoty v aktivacním záznamu Hana Rudová, Logické programování I, 13. května 2011 259 Implementace Prologu Okolí a bod volby Aktivacní záznam úspešne ukoncené procedury nelze odstranit z lokálního zásobníku => rozdelení aktivačního záznamu: JS> okolí (environment) - informace nutné pro dop r edný beh programu -í* bod volby (choice point) - informace nezbytné pro zotavení po neúspechu Hana Rudová, Logické programování I, 13. kvetna 2011 260 Implementace Prologu Okolí a bod volby Aktivacní záznam úspešne ukoncené procedury nelze odstranit z lokálního zásobníku => řozdelení aktivacního záznamu: JS> okolí (environment) - informace nutné pro dopredný beh programu -i* bod volby (choice point) - informace nezbytné pro zotavení po neúspechu & ukládány na lokální zásobník & samostatne provázány (odkaz na predchozí okolí resp. bod volby) Hana Rudová, Logické programování I, 13. kvetna 2011 260 Implementace Prologu Okolí a bod volby Aktivacní záznam úspešne ukoncené procedury nelze odstranit z lokálního zásobníku => rozdelení aktivačního záznamu: JS> okolí (environment) - informace nutné pro dopredný beh programu M bod volby (choice point) - informace nezbytné pro zotavení po neúspechu & ukládány na lokální zásobník -i* samostatne provázány (odkaz na předchozí okolí resp. bod volby) Důsledky: & samostatná práce s každou cástí aktivacního záznamu (optimalizace) Hana Rudová, Logické programování I, 13. kvetna 2011 260 Implementace Prologu Okolí a bod volby Aktivacní záznam úspešne ukoncené procedury nelze odstranit z lokálního zásobníku => rozdelení aktivaCního záznamu: JS> okolí (environment) - informace nutné pro dopredný beh programu -í* bod volby (choice point) - informace nezbytné pro zotavení po neúspechu & ukládány na lokální zásobník -i* samostatne provázány (odkaz na predchozí okolí resp. bod volby) Důsledky: & samostatná práce s každou cástí aktivacního záznamu (optimalizace) -í* alokace pouze okolí pro deterministické procedury Hana Rudová, Logické programování I, 13. kvetna 2011 260 Implementace Prologu Okolí a bod volby Aktivacní záznam úspešne ukoncené procedury nelze odstranit z lokálního zásobníku => rozdelení aktivačního záznamu: JS> okolí (environment) - informace nutné pro dop r edný beh programu -í* bod volby (choice point) - informace nezbytné pro zotavení po neúspechu & ukládány na lokální zásobník -i* samostatne provázány (odkaz na p r edchozí okolí resp. bod volby) Důsledky: & samostatná práce s každou cástí aktivacního záznamu (optimalizace) -í* alokace pouze okolí pro deterministické procedury & možnost odstranení okolí po úspešném vykonání (i nedeterministické) procedury (pokud okolí následuje po bodu volby dané procedury) pokud je okolí na vrcholu zásobníku Hana Rudová, Logické programování I, 13. kvetna 2011 260 Implementace Prologu Řez JS> Prostredek pro ovlivnení behu výpoctu programátorem a(X) :- b(X), !, c(X). a(3). b(1). b(2). c(1). c(2). Hana Rudová, Logické programování I, 13. kvetna 2011 261 Implementace Prologu Řez JS> Prostředek pro ovlivnění běhu výpočtu programátorem a(X) :- b(X), !, c(X). a(3). b(1). b(2). c(1). c(2). -í* Řez: neovlivňuje dopredný výpočet, má vliv pouze na zpětný výpočet -i* Odstranení alternativních vetví výpočtu => odstranení odpovídajících bodů volby A tj. odstranení bodu volby mezi současným vrcholem zásobníku a bodem volby procedury, která rez vyvolala (včetne bodu volby procedury s rezem) => zmena ukazatele na „nejmladší" bod volby Hana Řudová, Logické programování I, 13. kvetna 2011 261 Implementace Prologu Řez JS> Prostredek pro ovlivnení behu výpoctu programátorem a(X) :- b(X), !, c(X). a(3). b(1). b(2). c(1). c(2). -í* Rez: neovlivnuje dopredný výpocet, má vliv pouze na zpetný výpocet & Odstranení alternativních vetví výpoctu ^ odstranení odpovídajících bodů volby Jt tj. odstranení bodu volby mezi soucasným vrcholem zásobníku a bodem volby procedury, která rez vyvolala (vcetne bodu volby procedury s rezem) ^ zmena ukazatele na „nejmladší" bod volby ^ Vytvárení deterministických procedur => Optimalizace využití zásobníku Hana Rudová, Logické programování I, 13. kvetna 2011 261 Implementace Prologu Interpret Prologu Základní principy: JS> klauzule uloženy jako termy -i* programová databáze a pro uložení klauzulí Jr má charakter haldy & umožnuje modifikovatelnost prologovských programu za behu (assert) C klauzule zretezeny podle poradí nactení J* triviální zretezení Hana Rudová, Logické programování I, 13. kvetna 2011 262 Implementace Prologu Interpret Prologu Základní principy: JS> klauzule uloženy jako termy -i* programová databáze a pro uložení klauzulí Jr má charakter haldy & umožnuje modifikovatelnost prologovských programu za behu (assert) C klauzule zretezeny podle poradí nactení J* triviální zretezení Vyhodnocení dotazu: volání procedur rízené unifikací Hana Rudová, Logické programování I, 13. kvetna 2011 262 Implementace Prologu Interpret - Základní princip 1. Vyber redukovaný literal („první", tj. nejlevější literal cíle) 2. Lineárním průchodem od zaCátku databáze najdi klauzuli, jejíž hlava má stejný funktor a stejný poCet argumentů jako redukovaný literál 3. V prípade nalezení klauzule založ bod volby procedury 4. Založ dále okolí první klauzule (velikost odvozena od poCtu lokálních promenných v klauzuli) Hana Rudová, Logické programování I, 13. kvetna 2011 263 Implementace Prologu Interpret - Základní princip 1. Vyber redukovaný literál („první", tj. nejlevejší literál cíle) 2. Lineárním průchodem od zacátku databáze najdi klauzuli, jejíž hlava má stejný funktor a stejný pocet argumentů jako redukovaný literál 3. V prípade nalezení klauzule založ bod volby procedury 4. Založ dále okolí první klauzule (velikost odvozena od poctu lokálních promenných v klauzuli) 5. Proved' unifikaci literálu a hlavy klauzule 6. Úspech => pridej všechny literály klauzule k cíli („doleva", tj. na místo redukovaného literálu). Telo prázdné = výpocet se s úspechem vrací do klauzule, jejíž adresa je v aktuálním okolí. 7. Neúspech unifikace = z bodu volby se obnoví stav a pokracuje se v hledání další vhodné klauzule v databázi. Hana Rudová, Logické programování I, 13. kvetna 2011 263 Implementace Prologu Interpret - Základní princip 1. Vyber redukovaný literál („první", tj. nejlevejší literál cíle) 2. Lineárním průchodem od začátku databáze najdi klauzuli, jejíž hlava má stejný funktor a stejný počet argumentu jako redukovaný literál 3. V prípade nalezení klauzule založ bod volby procedury 4. Založ dále okolí první klauzule (velikost odvozena od počtu lokálních promenných v klauzuli) 5. Proved' unifikaci literálu a hlavy klauzule 6. Úspech == pridej všechny literály klauzule k cíli („doleva", tj. na místo redukovaného literálu). Telo prázdné == výpočet se s úspechem vrací do klauzule, jejíž adresa je v aktuálním okolí. 7. Neúspech unifikace == z bodu volby se obnoví stav a pokračuje se v hledání další vhodné klauzule v databázi. 8. Pokud není nalezena odpovídající klauzule, výpočet se vrací na predchozí bod volby (krátí se lokální i globální zásobník). 9. Výpočet končí neúspechem: neexistuje již bod volby, k nemuž by se výpočet mohl vrátit. 10. Výpočet končí úspechem, jsou-li úspešne redukovány všechny literály v cíli. Hana Řudová, Logické programování I, 13. kvetna 2011 263 Implementace Prologu Interpret - vlastnosti -í* Lokální i globální zásobník Jt pri dopredném výpoctu roste Jt pri zpětném výpoctu se zmenšuje Lokální zásobník se může zmenšit pri dopredném úspěšném výpoctu deterministické procedury. Hana Rudová, Logické programování I, 13. května 2011 264 Implementace Prologu Interpret - vlastnosti Lokální i globální zásobník pri dopredném výpoctu roste A pri zpetném výpoctu se zmenšuje Lokální zásobník se může zmenšit pri dopredném úspešném výpoctu deterministické procedury. Unifikace argumentů hlavy - obecný unifikacní algoritmus Soucasne poznací adresy instanciovaných promenných na stopu. Hana Rudová, Logické programování I, 13. kvetna 2011 264 Implementace Prologu Interpret - vlastnosti -í* Lokální i globální zásobník pri dopredném výpoctu roste A pri zpetném výpoctu se zmenšuje Lokální zásobník se může zmenšit pri dopredném úspešném výpoctu deterministické procedury. -í* Unifikace argumentů hlavy - obecný unifikacní algoritmus Soucasne poznací adresy instanciovaných promenných na stopu. -í* „Interpret": interpret(Query, Vars) call(Query), success(Query, Vars). interpret(_,_) failure. dotaz vsazen do kontextu této speciální nedeterministické procedury -** tato procedura odpovídá za korektní reakci systému v prípade úspechu i neúspechu Hana Rudová, Logické programování I, 13. kvetna 2011 264 Implementace Prologu Optimalizace: Indexace Zretezení klauzulí podle poradí nactení velmi neefektivní & Provázání klauzulí se stejným funktorem a aritou hlavy (tvorí jednu proceduru) a tj., indexace procedur J& Hash tabulka pro vyhledání první klauzule & Možno rozhodnout (parciálne) determinismus procedury Hana Rudová, Logické programování I, 13. kvetna 2011 265 Implementace Prologu Indexace argumentů a(1) :- q(1). a(a) :- b(X). a([A|T]) :- c(A,T). & Obecne nedeterministická -í* Pr i volání s alespon cástecne instanciovaným argumentem vždy deterministická (pouze jedna klauzule může uspet) Hana Rudová, Logické programování I, 13. kvetna 2011 266 Implementace Prologu IndexaCe argumentů a(1) q(1). a(a) b(X). a([A|T]) c(A,T). & Obecně nedeterministická -í* Pri volání s alespon cástecně instanciovaným argumentem vždy deterministická (pouze jedna klauzule může uspět) IndexaCe podle prvního argumentu Základní typy zřetězení: it podle poradí klauzulí (aktuální argument je volná proměnná) Jt dle konstant (aktuální je argument konstanta) it formální argument je seznam (aktuální argument je seznam) Jt dle struktur (aktuální argument je struktura) Hana Rudová, Logické programování I, 13. května 2011 266 Implementace Prologu Indexace argumentů II C Složitejší indexacní techniky a podle všech argumentů %> podle nejvíce diskriminujícího argumentu kombinace argumentu (indexové techniky z databází) zejména pro prístup k faktům Hana Rudová, Logické programování I, 13. kvetna 2011 267 Implementace Prologu Tail Recursion Optimization, TRO Iterace prováděna pomocí rekurze => lineární paměťová náročnost cyklů Hana Rudová, Logické programování I, 13. května 2011 268 Implementace Prologu Tail Recursion Optimization, TRO Iterace provádena pomocí rekurze = lineární pamet'ová nárocnost cyklů Optimalizace koncové rekurze (Tail Recursion Optimisation), TRO: Okolí se odstraní pred rekurzivním voláním posledního literálu klauzule, pokud je klauzule resp. její volání deterministické. Rízení se nemusí vracet: & v prípade úspechu se rovnou pokracuje JS> v prípade neúspechu se vrací na predchozí bod volby („nad" aktuální klauzulí) aktuální klauzule nemá dle predpokladu bod volby Rekurzivne volaná klauzule muže být volána prímo z kontextu volající klauzule. Hana Rudová, Logické programování I, 13. kvetna 2011 268 Implementace Prologu TRO - príklad Program: append([], L, L). append([A|X], L, [A|Y]) append(X, L, Y). Dotaz: ?- append([a,b,c], [x], L). Hana Rudová, Logické programování I, 13. kvetna 2011 269 Implementace Prologu TRO - príklad Program: append([], L, L). append([A|X], L, [A|Y]) :- append(X, L, Y). Dotaz: ?- append([a,b,c], [x], L). append volán rekurzivne 4krát £ bez TRO: 4 okolí, lineární paměťová nárocnost & s TRO: 1 okolí, konstatní paměťová nárocnost Hana Rudová, Logické programování I, 13. kvetna 2011 269 Implementace Prologu Optimalizace posledního volání TRO pouze speciální p rípad obecné optimalizace posledního volání (Last Call Optimization), LCO Hana Rudová, Logické programování I, 13. května 2011 270 Implementace Prologu Optimalizace posledního volání TRO pouze speciální případ obecné optimalizace posledního volání (Last Call Optimization), LCO Okolí (před redukcí posledního literálu) odstraňováno vždy, když leží na vrcholu zásobníku. Hana Rudová, Logické programování I, 13. kvetna 2011 270 Implementace Prologu Optimalizace posledního volání TRO pouze speciální p rípad obecné optimalizace posledního volání (Last Call Optimization), LCO Okolí (p r ed redukcí posledního literálu) odstranováno vždy, když leží na vrcholu zásobníku. Nutné úpravy interpretu JS> disciplina směrování ukazatelu -fc vždy „mladší" ukazuje na „starší" („mladší" budou odstraneny d r íve) -i- z lokálního do globálního zásobníku vyhneme se vzniku „visících odkazu" pri predcasném odstranení okolí Hana Rudová, Logické programování I, 13. kvetna 2011 270 Implementace Prologu Optimalizace posledního volání TRO pouze speciální prípad obecné optimalizace posledního volání (Last Call Optimization), LCO Okolí (pred redukcí posledního literálu) odstranováno vždy, když leží na vrcholu zásobníku. Nutné úpravy interpretu JS> disciplina směrování ukazatelu Jt vždy „mladší" ukazuje na „starší" („mladší" budou odstraneny dríve) -i- z lokálního do globálního zásobníku vyhneme se vzniku „visících odkazu" pri predcasném odstranení okolí „globalizace" lokálních promenných: lokální promenné posledního literálu A nutno presunout na globální zásobník i> pouze pro neinstanciované promenné Hana Rudová, Logické programování I, 13. kvetna 2011 270 Implementace Prologu Preklad Preklad Motivace: dosažení vyšší míry optimalizace i* kompaktní kód Jť částečná nezávislost na hardware Hana Řudová, Logické programování I, 13. kvetna 2011 272 Preklad Preklad -í* Motivace: dosažení vyšší míry optimalizace i* kompaktní kód Jť cástecná nezávislost na hardware Etapy prekladu: 1. zdrojový text == kód abstraktního pocítace 2. kód abstraktního pocítace == kód (instrukce) cílového pocítace Hana Rudová, Logické programování I, 13. kvetna 2011 272 Preklad Preklad -í* Motivace: dosažení vyšší míry optimalizace i* kompaktní kód Jť cástecná nezávislost na hardware Etapy prekladu: 1. zdrojový text == kód abstraktního pocítace 2. kód abstraktního pocítace == kód (instrukce) cílového pocítace & Výhody: -i- snazší prenos jazyka (nutno prepsat jen druhou cást) S> kód abstraktního pocítace možno navrhnout s ohledem na jednoduchost prekladu; prostor pro strojove nezávislou optimalizaci Hana Rudová, Logické programování I, 13. kvetna 2011 272 Preklad Preklad -í* Motivace: dosažení vyšší míry optimalizace i* kompaktní kód Jť cástecná nezávislost na hardware JS> Etapy prekladu: 1. zdrojový text == kód abstraktního pocítace 2. kód abstraktního pocítace == kód (instrukce) cílového pocítace & Výhody: -i- snazší prenos jazyka (nutno prepsat jen druhou cást) S> kód abstraktního pocítace možno navrhnout s ohledem na jednoduchost prekladu; prostor pro strojove nezávislou optimalizaci C Preklad Prologu založen na principu existence abstraktního pocítace V dalším se venujeme jeho odvození a vlastnostem Hana Rudová, Logické programování I, 13. kvetna 2011 272 Preklad Parciálni vyhodnocení & Jak navrhnout Warrenův abstraktní poCítaC? s* prostrednictvím parciálního vyhodnocení Parciální vyhodnocení a forma zpracování programu, tzv. transformace na úrovni zdrojového kódu a dosazení známých hodnot vstupních parametru a vyhodnocení všech operací nad nimi príklad: vyhodnocení aritmetických výrazu nad konstantami Hana Řudová, Logické programování I, 13. kvetna 2011 273 Preklad Parciální vyhodnocení - príklad a(X,Y) :- b(X), c(X,Y). a(X,Y) :- b(Y), c(Y,X). b(1). b(2). b(3). b(4). c(1,2). c(1,3). c(1,4). c(2,3). c(2,4). c(3,4). Dotaz ?- a(2,Z). Hana Rudová, Logické programování I, 13. kvetna 2011 274 Preklad ParCiální vyhodnoCení - príklad a(X,Y) b(X), c(X,Y). a(X,Y) b(Y), c(Y,X). b(1). b(2). b(3). b(4). c(1,2). c(1,3). c(1,4). c(2,3). c(2,4). c(3,4). Dotaz ?- a(2,Z). lze spolecně s uvedeným programem parciálně vyhodnotit na nový program a'(3). a'(4). a'(1). a nový dotaz ?- a'(Z). Hana Rudová, Logické programování I, 13. kvetna 2011 274 Preklad Parciální vyhodnocení - príklad a(X,Y) :- b(X), c(X,Y). a(X,Y) :- b(Y), c(Y,X). b(1). b(2). b(3). b(4). c(1,2). c(1,3). c(1,4). c(2,3). c(2,4). c(3,4). Dotaz ?- a(2,Z). lze spolecne s uvedeným programem parciálne vyhodnotit na nový program a'(3). a'(4). a'(1). a nový dotaz ?- a'(Z). Je evidentní, že dotaz nad parciálne vyhodnoceným programem bude zpracován mnohem rychleji (efektivneji) než v prípade původního programu. Hana Rudová, Logické programování I, 13. kvetna 2011 274 Preklad Parciální vyhodnocení II Konstrukce prekladaCe: parciálním vyhodnocením interpretu Problémy: & príliš složitá operace A vyhodnocení se musí provést vždy znovu pro každý nový program JS> výsledný program príliš rozsáhlý JS> nedostatecná dekompozice -fc zejména pri použití zdrojového jazyka jako implementacního jazyka interpretu Hana Rudová, Logické programování I, 13. kvetna 2011 275 Preklad Parciální vyhodnocení II Konstrukce prekladaCe: parciálním vyhodnocením interpretu Problémy: & príliš složitá operace A vyhodnocení se musí provést vždy znovu pro každý nový program JS> výsledný program príliš rozsáhlý JS> nedostatecná dekompozice -fc zejména pri použití zdrojového jazyka jako implementacního jazyka interpretu Vhodnejší: JS> využití („rucního") parciálního vyhodnocení pro návrh abstraktního pocítace 1. nalezení operací zdrojového jazyka, které lze dekomponovat do jednodušších operací 2. dekomponujeme tak dlouho, až jsou výsledné operace dostatecne jednoduché nebo již neexistují informace pro parciální vyhodnocení Hana Rudová, Logické programování I, 13. kvetna 2011 275 Preklad Parciální vyhodnocení Prologu Cílová operace: unifikace. Duvod: rízení výpočtu pomerne podrobné i v interpretu £ unifikace v interpretu atomickou operací & unifikace v interpretu nahrazuje radu podstatne jednodušších operací (testy, prirazení, predání a prevzetí parametrů ...) & vetšina unifikací nevyžaduje obecnou unifikaci a lze je nahradit jednoduššími operacemi Hana Řudová, Logické programování I, 13. kvetna 2011 276 Preklad Parciální vyhodnocení Prologu Cílová operace: unifikace. Duvod: rízení výpoctu pomerne podrobné i v interpretu £ unifikace v interpretu atomickou operací & unifikace v interpretu nahrazuje radu podstatne jednodušších operací (testy, prirazení, predání a prevzetí parametrů ...) & vetšina unifikací nevyžaduje obecnou unifikaci a lze je nahradit jednoduššími operacemi Zviditelnění unifikace: transformací zdrojového programu termy reprezentujeme kopírováním struktur na globálním zásobníku & parametry procedur jsou vždy umísteny na globální zásobník (predikátem put/2) a predávány jsou pouze adresy & formálním parametrem procedury jsou pouze volné promenné, které se v hlave vyskytují pouze jednou & všechny unifikace jsou explicitne zachyceny voláním predikátu unify/2 Hana Rudová, Logické programování I, 13. kvetna 2011 276 Preklad Explicitní unifikace Príklad: append/3 s explicitní unifikací: append(A1, A2, A3) :- unify(A1,[]), | append([],L,L). unify(A2,L), | unify(A3,L). Hana Rudová, Logické programování I, 13. kvetna 2011 277 Preklad Explicitní unifikace Príklad: append/3 s explicitní unifikací: append(A1, A2, A3) append(A1, A2, A3) :- unify(A1,[]), unify(A2,L), unify(A3,L). :- unify(A1,[A|X]), unify(A2,L), unify(A3,[A|Y]), put(X,B1), put(L,B2), put(Y,B3), append(B1,B2,B3). | append([],L,L). | append([A|X],L,[A|Y] :- append(X,L,Y). Hana Rudová, Logické programování I, 13. kvetna 2011 277 Preklad ExpliCitní unifikaCe Príklad: append/3 s explicitní unifikací: append(A1, A2, A3) append(A1, A2, A3) :- unify(A1,[]), unify(A2,L), unify(A3,L). :- unify(A1,[A|X]), unify(A2,L), unify(A3,[A|Y]), put(X,B1), put(L,B2), put(Y,B3), append(B1,B2,B3). | append([],L,L). | append([A|X],L,[A|Y] :- append(X,L,Y). Cíl: parciálně vyhodnotit predikáty unify/2 a put/2 Hana Rudová, Logické programování I, 13. května 2011 277 Preklad Pomocné termy a predikáty term $addr$(A) - odkaz na objekt s adresou A predikát is_addr(P,V) - je-li P ve tvaru $addr$(A), pak V se unifikuje s hodnotou slova na adrese A (jinak predikát selže) predikát : = (X,T) - priradí volné promenné X term T; X musí být volná promenná. Hana Rudová, Logické programování I, 1B. kvetna 2011 278 Preklad Pomocné termy a predikáty term $addr$(A) - odkaz na objekt s adresou A predikát is_addr(P,V) - je-li P ve tvaru $addr$(A), pak V se unifikuje s hodnotou slova na adrese A (jinak predikát selže) predikát : = (X,T) - priradí volné promenné X term T; X musí být volná promenná. predikát repres(A,Tag,V) - uloží do promenné Tag príznak a do promenné V hodnotu slova na adrese A. A musí být adresa na globálním zásobníku, Tag i V musí být volné promenné. & príznak: informace o strukture součástí objektu volná promenná FREE, konstanta CONST, celé číslo INT, odkaz REF, složený term FUNCT Hana Rudová, Logické programování I, 13. kvetna 2011 278 Preklad Pomocné termy a predikáty -í* term $addr$(A) - odkaz na objekt s adresou A & predikát is_addr(P,V) - je-li P ve tvaru $addr$(A), pak V se unifikuje s hodnotou slova na adrese A (jinak predikát selže) JS> predikát : = (X,T) - priradí volné promenné X term T; X musí být volná promenná. predikát repres(A,Tag,V) - uloží do promenné Tag príznak a do promenné V hodnotu slova na adrese A. A musí být adresa na globálním zásobníku, Tag i V musí být volné promenné. príznak: informace o strukture soucástí objektu volná promenná FREE, konstanta CONST, celé císlo INT, odkaz REF, složený term FUNCT -í* je-li A adresa a i celocíselná konstanta, pak výraz A+i reprezentuje adresu o i slov vyšší (ukazatelová aritmetika) Hana Rudová, Logické programování I, 13. kvetna 2011 278 Preklad unify pro volnou proměnnou unify(A,T) unifikuje term na adrese A (aktuální parametr) s termem T (formální parametr). Podle hodnoty T mohou nastat následující 4 prípady: 1) T je volná promenná: výsledkem je instanciace unify(A,T) :- var(T), ( var(A), create_var(A) ; true ), T := $addr$(A). Hana Řudová, Logické programování I, 13. kvetna 2011 279 Preklad unify pro volnou promennou unify(A,T) unifikuje term na adrese A (aktuální parametr) s termem T (formální parametr). Podle hodnoty T mohou nastat následující 4 prípady: 1) T je volná promenná: výsledkem je instanciace unify(A,T) :- var(T), ( var(A), create_var(A) ; true ), T := $addr$(A). Disjunkce garantuje, že A je korektní adresa na globálním zásobníku: nutný run-time test, tedy nelze využít pri parc. prekladu. Lze proto prepsat na unify(A,T) :- var(T), unify_var(A,T). kde unify_var/2 vloží do T odkaz nebo založí novou promennou. Hana Rudová, Logické programování I, 1B. kvetna 2011 279 Preklad unify pro konstantu 2) T je konstanta: výsledkem je test nebo přiřazení unify(A,T) :-atomic(T), ( ( var(A), create_var(A), instantiate_const(A,T) ) ; ( repres(A,Tag,Value), Tag == 'FREE', instantiate_const(A,T) ; Tag == 'CONST', Value == T ) )■ kde instantiate_const/2 uloží do slova s adresou A hodnotu T. Hana Rudová, Logické programování I, 13. kvetna 2011 280 Preklad unify pro konstantu 2) T je konstanta: výsledkem je test nebo přiřazení unify(A,T) :-atomic(T), ( ( var(A), create_var(A), instantiate_const(A,T) ) ; ( repres(A,Tag,Value), Tag == 'FREE', instantiate_const(A,T) ; Tag == 'CONST', Value == T ) )■ kde instantiate_const/2 uloží do slova s adresou A hodnotu T. Opet možno přepsat do kompaktního tvaru unify(A,T) :-atomic(T), unify_const(A,T). kde unify_const/2 provede příslušný test nebo přiřazení. Hana Rudová, Logické přogřamování I, 13. kvetna 2011 280 Překlad unify pro složený term 3) T je složený term: dvoufázové zpracování, v první fázi test nebo založení funktoru, v druhé rekurzivní unifikace argumentu unify(A,T) :-struct(T), functor(T,F,N), unify_struct(F,N,A), T =.. [_|Tl], unify_args(Tl,A+1). Predikát unify_struct/3 je analogický výše použitým predikátum unify_var/2 a unify_const/2. Hana Rudová, Logické programování I, 13. kvetna 2011 281 Preklad unify pro složený term 3) T je složený term: dvoufázové zpracování, v první fázi test nebo založení funktoru, v druhé rekurzivní unifikace argumentu unify(A,T) :-struct(T), functor(T,F,N), unify_struct(F,N,A), T =.. [_|Tl], unify_args(Tl,A+1). Predikát unify_struct/3 je analogický výše použitým predikátum unify_var/2 a unify_const/2. Druhá fáze: unify_args([],_). unify_args([T|Tl], A) :-unify(A,T), unify_args(Tl,A+1). Hana Rudová, Logické programování I, 13. května 2011 281 Preklad unify pro odkaz 4) T je odkazem: nutno použít obecnou unifikaci (není žádná informace pro parciální vyhodnocení) unify(A,T) :- is_addr(T,P), unification(A,P). Hana Řudová, Logické programování I, 13. kvetna 2011 282 Preklad put Parametry procedur jsou vždy umísteny na globální zásobník predikátem put/2 a predávány jsou pouze adresy. Predikát put/2 je jednodušší (nikdy nepotrebuje unifikaci) put(T,B) :- is_addr(T,B). %Tje odkaz put(T,B) :- var(T), %Tje promenná create_var(B), T := $addr$(B). put(T,B) :- atomic(T), %T je konstanta create_const(B,T). put(T,B) :- struct(T), %Tje struktura create_struct(B,T). Hana Rudová, Logické programování I, 13. kvetna 2011 283 Preklad První klauzule append/3 Parciální vyhodnocení první klauzule programu append/3 append(A1, A2, A3) :- unify(A1,[]), | append([],L,L). unify(A2,L), | unify(A3,L). | upraví unify(A1,[]) na unify_const(A1,[]) unify(A2,L) na L:=$addr$(A2) unify(A3,L) na is_addr(L,T), unification(T,A3) Hana Rudová, Logické programování I, 13. kvetna 2011 284 Preklad První klauzule append/3 Parciální vyhodnocení první klauzule programu append/3 append(A1, A2, A3) :- unify(A1,[]), | append([],L,L). unify(A2,L), | unify(A3,L). | upraví unify(A1,[]) na unify_const(A1,[]) unify(A2,L) na L:=$addr$(A2) unify(A3,L) na is_addr(L,T), unification(T,A3) posloupnost L:=$addr$(A2), is_addr(L,T) odpovídá prejmenování T na A2 Hana Rudová, Logické programování I, 13. kvetna 2011 284 Preklad První klauzule append/3 Parciální vyhodnocení první klauzule programu append/3 append(A1, A2, A3) :- unify(A1,[]), | append([],L,L). unify(A2,L), | unify(A3,L). | upraví unify(A1,[]) na unify_const(A1,[]) unify(A2,L) na L:=$addr$(A2) unify(A3,L) na is_addr(L,T), unification(T,A3) posloupnost L:=$addr$(A2), is_addr(L,T) odpovídá prejmenování T na A2 => není nutné vytváret novou proměnnout T => stací provést unification(A2,A3) Hana Rudová, Logické programování I, 13. kvetna 2011 284 Preklad Výsledný tvar append/3 append(A1, A2, A3) :- append(A1, A2, A3) :- unify_const(A1,[]), unify(A1,[]), unification(A2,A3). unify(A2,L), unify(A3,L). append(A1, A2, A3) :- append(A1, A2, A3) :- unify_struct('.',2,A1), unify(A1,[A|X]), unify_var(A,A1+1), unify_var(X,A1+2), unify_var(L,A2), unify(A2,L), unify_struct('.',2,A3), unify(A3,[A|Y]), unification(A1+1,A3+1), unify_var(Y,A3+2), put(X,B1), put(L,B2), put(Y,B3), append(A1+2,A2,A3+2). append(B1,B2,B3). Vetšina původních unifikací prevedena na jednodušší operace; unifikace v posledním kroku je nezbytná (důsledkem dvojího výskytu promenné) Hana Rudová, Logické programování I, 13. kvetna 2011 285 Preklad Jiný příklad a(c,s(f),d,X) :- g(X). Procedurální pseudokód (testy a přiřazení) a kód abstraktního počítače: procedure a(X,Y,Z,A) is | if ( X == 'c' && | ( is_struct(Y,'s',1) && | first_arg(Y) == f ) && | Z == 'ď ) | then | call g(A) | else | a(A1, A2, A3, A4) :-unify_const(c,A1), unify_struct(s,1,A2), unify_const(f,A2+1), unify_const(d,A3), unify_var(A,A4), g(A4). call fail I end procedure tj. posloupnost testů jako v procedurálním jazyce Hana Rudová, Logické programování I, 13. kvetna 2011 286 Preklad Jiný příklad a(c,s(f),d,X) :- g(X). Procedurální pseudokód (testy a přiřazení) a kód abstraktního počítače: proceduře a(X,Y,Z,A) is | if ( X == 'c' && | ( is_struct(Y,'s',1) && | first_arg(Y) == f ) && | Z == 'ď ) | then | call g(A) | else | a(A1, A2, A3, A4) :-unify_const(c,A1), unify_struct(s,1,A2), unify_const(f,A2+1), unify_const(d,A3), unify_var(A,A4), g(A4). call fail | end procedure tj. posloupnost testů jako v procedurálním jazyce Vyzkoušejte si: de1ete(X, [YjT], [Y|T1]) :- de1ete(X, T, T1). Hana Rudová, Logické programování I, 13. kvetna 2011 286 Preklad Warrenův abstraktní poCítaC, WAM I. Navržen D.H.D. Warrenem v roce 1983, modifikace do druhé poloviny 80. let Datové oblasti: & Oblast kódu (programová databáze) separátní oblasti pro uživatelský kód (modifikovatelný) a vestavené predikátý (nemení se) -i- obsahuje rovnež všechny statické objekty (texty atomu a funktoru apod.) JS> Lokální zásobník (Stack) & Stopa (Trail) JS> Globální zásobník n. halda(Heap) JS> Pomocný zásobník (Push Down List, PDL) pracovní pamet' abstraktního pocítace -i- použitý v unifikaci, syntaktické analýze apod. Hana Rudová, Logické programování I, 13. kvetna 2011 287 Preklad Rozmístení datových oblastí Príklad konfigurace Halda Stopa Zásobník PDL Oblast kodu Ý A Halda i lokální zásobník musí mst stejným smerem -i- lze jednoduše porovnat stárí dvou promenných srovnáním adres využívá se pri zabránení vzniku visících odkazu Hana Rudová, Logické programování I, 13. kvetna 2011 288 Preklad Registry WAMu JS> Stavové registry: P citac adres (Program counter) CP adresa návratu (Continuation Pointer) E ukazatel na nejmladší okolí (Environment) B ukazatel na nejmladší bod volby (Backtrack point) TR vrchol stopy (TRail) H vrchol haldy (Heap) HB vrchol haldy v okamžiku založení posledního bodu volby (Heap on Backtrack point) S ukazatel, používaný pri analýze složených termu (Structure pointer) CUT ukazatel na bod volby, na který se rezem zarízne zásobník Argumentové registry: A1,A2,... (pri predávání parametru n. pracovní registry) Registry pro lokální promenné: Y1,Y2,... abstraktní znázornení lok. promenných na zásobníku Hana Rudová, Logické programování I, 13. kvetna 2011 289 Preklad Typy instrukcí WAMu & put instrukce - príprava argumentů pred voláním podcíle A žádná z techto instrukcí nevolá obecný unifikacní algoritmus & get instrukce - unifikace aktuálních a formálních parametru -i- vykonávají cinnost analogickou instrukcím unify u parc. vyhodnocení -fc obecná unifikace pouze pri get_value & unify instrukce - zpracování složených termů jednoargumentové instrukce, používají registr S jako druhý argument pocátecní hodnota S je odkaz na 1. argument J* volání instrukce unify zvetší hodnotu S o jednicku 3 obecná unifikace pouze pri unify_value a unify_local_value Indexacní instrukce - indexace klauzulí a manipulace s body volby & Instrukce rízení behu - predávání rízení a explicitní manipulace s okolím Hana Rudová, Logické programování I, 13. kvetna 2011 290 Preklad Instrukce put a get: príklad Príklad: a(X,Y,Z) :- b(f,X,Y,Z). get_var A1,A5 get_var A2,A6 get_var A3,A7 put_const Alf put_value A2,A5 put_value A3,A6 put_value A4,A7 execute b/4 Hana Rudová, Logické programování I, 13. kvetna 2011 291 Preklad WAM - optimalizace 1. Indexace klauzulí 2. Generování optimální posloupnosti instrukcí WAMu 3. Odstranění redundancí pri generování cílového kódu. Hana Rudová, Logické programování I, 13. kvetna 2011 292 Preklad WAM - optimalizace 1. Indexace klauzulí 2. Geneřování optimální posloupnosti instřukcí WAMu 3. Odstřanení ředundancí při geneřování cílového kódu. & Příklad: a(X,Y,Z) :- b(f,X,Y,Z). naivní kód (vytvoří kompilátoř přacující střiktne zleva dopřava) vs. optimalizovaný kód (pocet řegistřů a tedy i pocet instřukcí/přesunů v pameti snížen): get_var A1,A5 | get_var A3,A4 get_var A2,A6 | get_var A2,A3 get_var A3,A7 | get_var A1,A2 put_const Alf | put_const A1,f put_value A2,A5 | execute b/4 put_value A3,A6 put_value A4,A7 execute b/4 Hana Rudová, Logické přogřamování I, 13. kvetna 2011 292 Překlad Instrukce WAMu get instrukce put instrukce unify instrukce get_var Ai,Y put_var Ai,Y unify_var Y get_va1ue Ai,Y put_va1ue Ai,Y unify_va1ue Y get_const Ai,C put_unsafe_va1ue Ai,Y unify_1oca1_va1ue Y get_ni1 Ai put_const Ai,C unify_const C get_struct Ai,F/N put_ni1 Ai unify_ni1 get_1ist Ai put_struct Ai,F/N unify_void N put_1ist Ai instrukce rízení a11ocate dea11ocate ca11 Proc/N,A execute Proc/N proceed indexacní instrukce try_me_e1se Next retry_me_e1se Next trust_me_e1se fai1 try Next retry Next trust fai1 cut_1ast save_cut Y 1oad_cut Y switch_on_term Var,Const,List,Struct switch_on_const Tab1e switch_on_struct Tab1e Hana Rudová, Logické programování I, 1B. kvetna 2011 29B Preklad WAM - indexaCe Provázání klauzulí: instrukce XX_me_else: M první klauzule: try_me_else; založí bod volby i> poslední klauzule: trust_me_else; zruší nejmladší bod volby a ostatní klauzule: retry_me_else; znovu použije nejmladší bod volby po neúspěchu Hana Rudová, Logické programování I, 13. kvetna 2011 294 Preklad WAM - indexace Provázání klauzulí: instrukce XX_me_else: M první klauzule: try_me_else; založí bod volby i> poslední klauzule: trust_me_else; zruší nejmladší bod volby a ostatní klauzule: retry_me_else; znovu použije nejmladší bod volby po neúspechu JS> Provázání podmnožiny klauzulí (podle argumentu): S try retry -i- trust Hana Rudová, Logické programování I, 13. kvetna 2011 294 Preklad WAM - indexace Provázání klauzulí: instrukce XX_me_e1se: M první klauzule: try_me_e1se; založí bod volby it poslední klauzule: trust_me_e1se; zruší nejmladší bod volby it ostatní klauzule: retry_me_e1se; znovu použije nejmladší bod volby po neúspechu ii> Provázání podmnožiny klauzulí (podle argumentu): it try it retry it trust „Rozskokové" instrukce (dle typu a hodnoty argumentu): switch_on_term Var, Const, List, Struct výpoCet následuje uvedeným návestím podle typu prvního argumentu it switch_on_YY: hashovací tabulka pro konkrétní typ (konstanta, struktura) Hana Rudová, Logické programování I, 13. kvetna 2011 294 Preklad Příklad indexace instrukcí Přoceduře a(atom) :- bodyl. a(1) :- body2. a(2) :- body3. a([X|Y]) :- body4. a([X|Y]) :- body5. a(s(N)) :- body6. a(f(N)) :- body7. odpovídají instřukce a: switch_on_term L1, L2, L3, L4 L5a: body2 L2: switch_on_const atom :L1a L6: retry_me_else L7 1 :L5a L6a: body3 2 :L6a L7: retry_me_else L8 L3: try L7a L7a: body4 trust L8a L8: retry_me_else L9 L4: switch_on_struct s/1 :L9a L8a: body5 f/1 :L10a L9: retry_me_else L10 L1: try_me_else L5 L9a: body6 L1a: body1 L10: trust_me_else fail L5: retry_me_else L6 L10a: body7 Hana Rudová, Logické přogřamování I, 13. kvetna 2011 295 Překlad WAM - rízení výpoctu & execute Proc: ekvivalentní príkazu goto Hana Rudová, Logické programování I, 13. kvetna 2011 296 Preklad WAM - rízení výpoctu & execute Proc: ekvivalentní príkazu goto J5> proceed: zpracování faktu Hana Rudová, Logické programování I, 13. kvetna 2011 296 Preklad WAM - řízení výpočtu & execute Proc: ekvivalentní príkazu goto J5> proceed: zpracování faktU M allocate: alokuje okolí (pro některé klauzule netreba, proto explicitne generováno) Hana Rudová, Logické programování I, 13. kvetna 2011 296 Preklad WAM - řízení výpočtu & execute Proc: ekvivalentní príkazu goto J5> proceed: zpracování faktU M allocate: alokuje okolí (pro některé klauzule netreba, proto explicitne generováno) & deallocate: uvolní okolí (je-li to možné, tedy leží-li na vrcholu zásobníku) & call Proc,N: zavolá Proc, N udává poCet lok. promenných (odpovídá velikosti zásobníku) Hana Rudová, Logické programování I, 13. kvetna 2011 296 Preklad WAM - rízení výpočtu & execute Proc: ekvivalentní příkazu goto J5> proceed: zpracování faktu M allocate: alokuje okolí (pro nekteré klauzule netreba, proto explicitne generováno) & deallocate: uvolní okolí (je-li to možné, tedy leží-li na vrcholu zásobníku) & call Proc,N: zavolá Proc, N udává pocet lok. promenných (odpovídá velikosti zásobníku) Možná optimalizace: vhodným usporádáním promenných lze dosáhnout postupného zkracování lokálního zásobníku a(A,B,C,D) :- b(D), c(A,C), d(B), e(A), f. generujeme instrukce allocate call b/1,4 call c/2,3 call d/1,2 call e/1,1 deallocate execute f/0 Hana Rudová, Logické programování I, 13. kvetna 2011 296 Preklad