IB013 Logické programování I Hana Rudová jaro 2012 Hodnocení předmětu JS> Průběžná písemná přáce: až 30 bodů (základy programování v Prologu) ± pro každého jediný termín: 22.března .0 alternativní termín pouze v prípadech závažných důvodů pro neúčast i> vzor písemky na webu predmetu & ZáveřeCná písemná přáce: až 150 bodů -fc vzor písemky na webu predmetu -i- opravný termín možný jako ústní zkouška & ZápoCtový projekt: celkem až 40 bodu C- Hodnocení: součet bodu za projekt a za obe písemky j* známka A za cca 175 bodu, známka F za cca 110 bodu -i- známka bude zapsána pouze tem, kterí dostanou zápocet za projekt -i* Ukoncení predmetu zápoctem: zápocet udelen za zápoctový projekt Hana Rudová, Logické programování I, 18. kvetna 2012 2 Organizace predmetu Základní informace Přednáška: úcast není povinná, nicméně ... CviCení: úCast povinná individuální dopinující příklady za zmeškaná cviCení nelze při vysoké neúCasti na cviCení &> skupina 01, sudý pátek, první cvicení 24.února a skupina 02, lichý pátek, první cvicení 2.března Web predmetu: interaktivní osnova v ISu & průsvitky dostupné postupne v průbehu semestru a harmonogram výuky, predbežný obsah výuky pro jednotlivé prednášky behem semestru a elektronicky dostupné materiály informace o zápoctových projektech Hana Rudová, Logické programování I, 18. kvetna 2012 3 Organizace predmetu Rámcový obsah předmětu Obsah přednášky & základy programování v jazyce Prolog JS> teorie logického programováni logické programování s omezujícími podmínkami -í* implementace logického programováni Obsah cviCení -í* zaměřeno na praktické aspekty, u pocítacu programování v Prologu & logické programování a DCG gramatiky s> logické programování s omezujícími podmínkami Hana Rudová, Logické programování I, 18. kvetna 2012 4 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, 18. kvetna 2012 s 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, 18. kvetna 2012 6 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ůběžné písemné práce na webu Hana Rudová, Logické programování I, 18. května 2012 6 Organizace předmětu Zápočtové projekty -í* Týmová práce na projektech, až 3 řešitelé -i- zápoCtové projekty dostupné přes web predmetu & Podrobné pokyny k zápočtovým projektům na webu predmetu Jť bodování, obsah predbežné zprávy a projektu & typ projektu: LP, CLP, DCG CLP a LP: Adriana Strejčkova DCG: Miloš Jakubíček, Vojtech Kovár -í* Predbežná zpráva podrobné zadání -i- v jakém rozsahu chcete úlohu rešit které vstupní informace bude program používat a co bude výstupem programu -i- scénáre použití programu (tj. ukázky dvojic konkrétních vstupu a výstupu) Hana Rudová, Logické programování I, 18. kvetna 2012 7 Organizace predmetu Casový harmonogram k projektům -í* Zverejnení zadání (vetšiny) projektů: 27. února Zahájení registrace rešitelU projektu: 7. brezna, 19:00 & Predbežná analýza řešeného problému: 13. dubna & Termín pro odevzdání projektů: 18. kvetna & Predvádení projektů (po registraci): 21.kvetna - 22.Cervna Hana Rudová, Logické programování I, 18. kvetna 2012 8 Organizace p redmetu Software: SICStus Prolog C Doporučovaná implementace Prologu & Dokumentace: http://www.fi.muni.cz/~hanka/sicstus/doc/html JS> Komerční produkt it licence pro instalace na domácí počítače studentů C Nové IDE pro SICStus Prolog SPIDER Jt dostupné až od verze SICStus 4.1.3 http://www.sics.se/sicstus/spider it používá Eclipse SDK $ Podrobné informace dostupné pres web predmetu it stažení SICStus Prologu (sw + licencní klíce) it pokyny k instalaci (SICStus Prolog, Eclipse, Spider) Hana Rudová, Logické programování I, 18. kvetna 2012 9 Organizace predmetu SICStus IDE SPIDER Hana Rudová, Logické programování I, IS. kvetna 2012 10 prevzato z http://www.sics.se/sicstus/spider Organizace p redmetu Úvod do Prologu Prolog -í* PROgramming in LOGic a Část predikátové logiky prvního rádu ii> Deklarativní programování -i- specifikační jazyk, jasná sémantika, nevhodné pro procedurální postupy & Co delat namísto Jak delat JS> Základní mechanismy j* unifikace, stromové datové struktury, automatický backtracking Hana Rudová, Logické programování I, 18. kvetna 2012 12 Ú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. Theory and Practice of Logic Programming, 12 (1-2): 35-66, 2012. http://arxiv.org/abs/1011.5640. Hana Rudová, Logické programování I, 18. kvetna 2012 13 Ú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í (obousmerný) 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, 18. kvetna 2012 14 Ú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, 18. kvetna 2012 14 Úvod do Prologu Komentáre k syntaxi C Klauzule ukonceny teckou & Základní príklady argumentu -i- konstanty: (tomas, anna) ... zacínají malým písmenem i* promenné X, Y ... zacínají velkým písmenem _, _A, _B ... zacínají podtržítkem (nezajímá nás vracená hodnota) -í* Psaní komentárů clovek( novak, 18, student ). % komentár na konci rádku clovek( novotny, 30, ucitel ). /* komentár */ Hana Rudová, Logické programování I, 18. kvetna 2012 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 Hana Rudová, Logické programování I, 18. května 2012 16 Úvod do Prologu Dotaz Dotaz: uživatel se ptá programu, zda jsou veci pravdivé ?- studuje( novak ). ?- studuje( novotny ). Odpoved' 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 přomenných v dotazu A dosud nenainstanciovaná promenná: volná přomenná Hana Rudová, Logické programování I, 18. kvetna 2012 16 Ú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, 18. kvetna 2012 16 Úvod do Prologu Klauzule = fakt, pravidlo, dotaz Klauzule se skláda z hlavy a tela & Telo je seznam cílů oddelených čá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, 18. kvetna 2012 17 Úvod do Prologu Rekurzivní pravidla predek( X, Z ) rodic( X, Z). % (1) predek( X, Z ) rodic( X, Y ), % (2) rodic( Y, Z). Hana Rudová, Logické programování I, 18. kvetna 2012 18 Úvod do Prologu 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 Rudová, Logické programování I, 18. kvetna 2012 18 Úvod do Prologu Pří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, 18. kvetna 2012 19 Úvod do Prologu VýpoCet 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, 18. kvetna 2012 20 Úvod do Prologu VýpoCet odpovedi 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, 18. kvetna 2012 21 Úvod do Prologu Odpoved' na dotaz s promennou 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(petr,Potomek) --> ??? Hana Rudová, Logické programování I, 18. kvetna 2012 22 Úvod do Prologu Odpoved' na dotaz s promennou 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(petr,Potomek) --> ??? Potomek=jirka Hana Rudová, Logické programování I, 18. kvetna 2012 22 Úvod do Prologu Odpoved' na dotaz s přomennou 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(petr,Potomek) --> ??? predek(robert,P) --> ??? Hana Rudová, Logické programování I, 18. kvetna 2012 22 Potomek=jirka Úvod do Prologu Odpověď na dotaz s proměnnou 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(petr,Potomek) --> ??? predek(robert,P) --> ??? Hana Rudová, Logické programování I, 18. kvetna 2012 22 Potomek=jirka 1. P=anna, 2. P=petr, 3. P=jirka Úvod do Prologu 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á Čísla: 0, -1056, 0.35 & Promenná Jt 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, 18. kvetna 2012 24 Syntaxe a význam Prologovských programu Teřmy M Teřm - datové objekty v Prologu: datum( 1, kveten, 2003 ) a funktoř: datum Jt argumenty: 1, kveten, 2003 ± ařita - pocet argumentů: 3 M Všechny strukturované objekty v Prologu jsou střomy trojuhe1nik( bod(4,2), bod(6,4), bod(7,1) ) -í* Hlavní funktoř termu - funktor v korenu stromu odpovídající termu it trojuhelnikje hlavní funktor v trojuhe1nik( bod(4,2), bod(6,4), bod(7,1) ) Hana Rudová, Logické programování I, 18. kvetna 2012 25 Syntaxe a význam Prologovských programu 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 Hana Rudová, Logické programování I, 18. kvetna 2012 26 Syntaxe a význam Prologovských programu 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 JS> 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, 18. kvetna 2012 26 Syntaxe a význam Prologovských programu 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) opeřátoř = D1 =1, M1 = M2, Y2 = 2003 JS> Hledáme nejobecnejší unifikátoř (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. & 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, 18. kvetna 2012 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, Hana Rudová, Logické programování I, 18. kvetna 2012 27 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, k1 = k2 ... no, A = k(2,3) ... yes, k(s,a,l(1)) = A ... yes Hana Rudová, Logické programování I, 18. kvetna 2012 27 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, 18. kvetna 2012 27 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, 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, 18. kvetna 2012 27 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))... no s(sss(A),4,ss(3)) = s(sss(2),4,ss(A))... Hana Rudová, Logické programování I, 18. kvetna 2012 27 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é 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))... no s(sss(A),4,ss(3)) = s(sss(2),4,ss(A))... no Hana Rudová, Logické programování I, 18. kvetna 2012 27 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, k1 = k2 ... no, A = k(2,3) ... yes, k(s,a,1(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 Rudová, Logické programování I, 18. kvetna 2012 27 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é JÍ* výsledná substituce je urcena unifikací argumentu 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 s(sss(A),4,ss(C)) = s(sss(t(B)),4,ss(A))... A=t(B),C=t(B)... yes Hana Rudová, Logické programování I, lS. kvetna ZClZ Syntaxe a význam Prologovských programu 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 Hana Rudová, Logické programování I, 18. kvetna 2012 28 Syntaxe a význam Prologovských programu 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 vyrešíme tak, že nejprve vyrešíme q a pak r => krome logických relací je významné i poradí cílu 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, 18. kvetna 2012 28 Syntaxe a význam Prologovských programu Deklarativní význam programu Instance klauzule: promenné v klauzuli jsou substituovány termem ma_dite(X) :- rodic( X, Y ). % klauzule ma_dite(petr) :- rodic( petr, Z ). % instance klauzule Máme-li program a cíl G, pak deklarativní význam ríká: cíl G je splnitelný práve tehdy, když cíl ?- ma_dite(petr). existuje klauzule C v programu taková, že existuje instance I klauzule C taková, že hlava I je identická s G a všechny cíle v tele I jsou pravdivé. Hana Rudová, Logické programování I, 18. kvetna 2012 29 Syntaxe a význam Prologovských programu Konjunce "," vs. disjunkce ";" cílů Konjunce = nutné splnení všech cílů p :- q, r. JS> Disjunkce = stací splnení libovolného cíle p :- q; r. p :- q. p :- r. a priorita středníku je vyšší (viz ekvivalentní zápisy): 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, 18. kvetna 2012 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). Hana Rudová, Logické programování I, 18. kvetna 2012 31 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, 18. kvetna 2012 31 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, 18. kvetna 2012 31 Syntaxe a význam Prologovských programu Poradí klauzulí a cílu (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: nekonečný cyklus (c) a(X) :- b(X,Y), c(Y). ?- a(X). b(1,1). c(2). c(1). Hana Rudová, Logické programování I, 18. kvetna 2012 31 Syntaxe a význam Prologovských programu Pořadí klauzulí a cílu (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, 18. kvetna 2012 31 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 prípadech stejný deklarativní ale odlišný procedurální význam Hana Rudová, Logické programování I, 18. kvetna 2012 31 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 Rudová, Logické programování I, 18. kvetna 2012 32 Syntaxe a význam Prologovských programu 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, 18. kvetna 2012 32 Syntaxe a význam Prologovských programu Cvicení: průbeh výpoctu a :- b,c,d. b :- e,c,f,g. b :- g,h. c. d. e :- i. e :- h. gh. i. Jak vypadá průbeh výpoctu pro dotaz ?- a. Hana Rudová, Logické programování I, 18. kvetna 2012 33 Syntaxe a význam Prologovských programu Operátory, aritmetika Operátory -í* Infixová notace: 2*a + b*c JS> Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 ± prefixovou notaci lze získat predikátem display/1 :- display((a:-s(0),b,c)). :-(a, ,(s(0), ,(b,c))) M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor Hana Rudová, Logické programování I, 1S. kvetna 2012 35 Operátory, aritmetika Operátory -í* Infixová notace: 2*a + b*c & Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 ± prefixovou notaci lze získat predikátem display/1 :- display((a:-s(0),b,c)). :-(a, ,(s(0), ,(b,c))) M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor -í* Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). JS> Definice operátoru: :- op( 600, xfx, zna ). priorita: 1..1200 Hana Rudová, Logické programování I, 18. kvetna 2012 35 Operátory, aritmetika Opeřátořy Infixová notace: 2*a + b*c Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 ± prefixovou notaci lze získat predikátem display/1 :- display((a:-s(0),b,c)). :-(a, ,(s(0), ,(b,c))) Přiořita opeřátořů: 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 :- 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, 18. kvetna 2012 35 Operátory, aritmetika Opeřátořy -í* Infixová notace: 2*a + b*c JS> Prefixová notace: +( *(2,a), *(b,c) ) priorita +: 500, priorita *: 400 ± prefixovou notaci lze získat predikátem display/1 :- disp1ay((a:-s(0),b,c)). :-(a, ,(s(0), ,(b,c))) M Přiořita opeřátořU: 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 Jt :- 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 & Definice operátoru není spojena s datovými manipulacemi (krome spec. prípadu) Hana Rudová, Logické programování I, 18. kvetna 2012 35 Operátory, aritmetika Typy operátorů Typy operátoru pr. xfx = yfx pr. fx ?- fy -i- infixové operátory: xfx, xfy, yfx prefixové operátory: fx, fy a postfixové operátory: xf, yf x a y urcují prioritu argumentu x reprezentuje argument, jehož priorita musí být striktne menší než u operátoru y reprezentuje argument, jehož priorita je menší nebo rovna operátoru a-b-c odpovídá (a-b)-c a ne a-(b-c): „-" odpovídá yfx chybně správně priorita: 0 priorita: 0 priorita: 500 priorita: 500 Hana Rudová, Logické programování I, 18. kvetna 2012 36 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 Hana Rudová, Logické programování I, 18. kvetna 2012 37 Operátory, aritmetika Aritmetika JS> Preddefinované operátory + , -i *i A ** mocnina, // celocíselné dělení, mod zbytek po delení Jfc ?- 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, 18. kvetna 2012 37 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 J ?- 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) Jt pravá strana musí být vyhodnotitelný výraz (bez promenné) Jt výraz na pravé strane je nejdríve aritmeticky vyhodnocen a pak unifikován s levou stranou volání ?- X is Y + 1. zpusobí chybu Hana Rudová, Logické programování I, 18. kvetna 2012 37 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) pravá strana musí být vyhodnotitelný výraz (bez promenné) a výraz na pravé strane je nejdríve aritmeticky vyhodnocen a pak unifikován s levou stranou volání ?- X is Y + 1. způsobí 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, 18. kvetna 2012 37 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) pravá strana musí být vyhodnotitelný výraz (bez promenné) a výraz na pravé strane je nejdríve aritmeticky vyhodnocen a pak unifikován s levou stranou volání ?- X is Y + 1. způsobí chybu JS> Další speciální preddefinované operátory >, <, >=, =<, =:= aritmetická rovnost, =\= aritmetická nerovnost -i- porovnej: 1+2 =:= 2+1 1+2 = 2+1 -fc obe strany musí být vyhodnotitelný výraz: volání ?- 1 < A + 2. způsobí chybu Hana Rudová, Logické programování I, 18. kvetna 2012 37 Operátory, aritmetika Ruzné 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, 18. kvetna 2012 38 Operátory, aritmetika Ruzné typy řovností 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, 18. kvetna 2012 38 Operátory, aritmetika Různé typy řovností 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, 18. kvetna 2012 38 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é Xa 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, 18. kvetna 2012 38 Operátory, aritmetika X=Y X \= Y X == Y X \== Y X is Y X =:= Y X =\= Y X < Y X @< Y Ruzné 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, 18. kvetna 2012 38 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 @< 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 (=<, >, >=) 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 ?- f( pavel, g(b)) @< f( pavel, h(a)). ... yes Hana Rudová, Logické programování I, 18. kvetna 2012 38 Operátory, aritmetika Řez, negace Řez a upnutí f(X,0) :- X < 3 . f(X,2) :- 3 =< X, X < 6 . f(X,4) :- 6 =< X. pridání operátoru rezu ,,!'' y 4 2 ?- f(1,Y), Y>2. j— J_L -© J_L 3 6 x Hana Rudová, Logické programování I, 18. kvetna 2012 40 Řez, negace Řez a upnutí f(X,0) :- X < 3, I. f(X,2) :- 3 =< X, X < 6, I. f(X,4) :- 6 =< X. pndá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, 18. kvetna 2012 40 Rez, negace Rez a upnutí f(X,0) :- X < 3, I. f(X,2) :- 3 =< X, X < 6, I. f(X,4) :- 6 =< X. pridání opeřátořu řezu 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, 18. kvetna 2012 40 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í opeřátořu řezu ,,!'' 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, 18. kvetna 2012 40 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, 18. kvetna 2012 41 Řez, 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, 18. kvetna 2012 41 Řez, 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, 18. kvetna 2012 41 Řez, 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(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ílu pred rezem se už neuvažuje další možné splnení techto podcílu Smazání rezu zmení chování programu Hana Rudová, Logické programování I, 18. kvetna 2012 41 Rez, negace Chování operátoru rezu Predpokládejme, že klauzule H :- T1, T2, Tm, !, ...Tn. je aktivována voláním cíle G, který je unifikovatelný s H. G=h(X,Y) V momente, kdy je nalezen rez, existuje rešení cílu T1, ..., Tm X=1,Y=1 Ořezání: pri provádení rezu se už další možné splnení cílu T1, ..., Tm nehledá a všechny ostatní alternativy jsou odstraneny 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), !. 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 rezání) / Hana Rudová, Logické programování I, 18. kvetna 2012 42 Rez, negace Řez: návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: návřat na řodice ?- a(X). a(x) (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: návrat na rodice ?- a(X). a(x) (1) a(X) :- h(X,Y). (2) a(X) :- d. h(X,Y) (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). Hana Rudová, Logické programování I, 18. kvŘetna 2012 43 RŘez, negace Rez: návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace a(x) h(X,Y) X/1 t1(Y),!,e'(X') Řez: návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 b,!,e(X') Hana Rudová, Logické programování I, 18. kvŘetna 2012 43 RŘez, negace Rez: návřat na řodiCe ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 b,!,e(X') c,!,e(X') Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), (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). a(x) h(X,Y) X/1 !, e(X). t1(Y),!,e'(X') Y/1 b,!,e(X') c,!,e(X') no Hana Rudová, Logické programování I, 18. kvŘetna 2012 43 RŘez, negace Řez: návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, e(X). (4) h(2,Y) :- a. (5) t1(1) :- b. (6) t1(2) :- c. (7) b :- c. no (8) b :- d. (9) d. (10) e(1) . (11) e(2). Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 / b,!,e(X') c,!,e(X') d,!,e(X') Rez: návřat na řodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 / b,!,e(X') c,!,e(X') d,!,e(X') no !,e(X') Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: návřat na řodiCe ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 / b,!,e(X') c,!,e(X') d,!,e(X') no !,e(X') e(X') Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 / b,!,e(X') c,!,e(X') d,!,e(X') no !,e(X') e(X') X'/1 □ Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: návrat na rodice ?- 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). a(x) h(X,Y) X/1 t1(Y),!,e'(X') Y/1 / b,!,e(X') c,!,e(X') d,!,e(X') no !,e(X') e(X') X'/l y \ X'/2 Hana Rudová, Logické programování I, 18. kvŘetna 2012 43 RŘez, negace Řez: návrat na rodice ?- 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). a(x) híX/Y) X/1y \^ t1(Y),!,e(X') upnutí Y/1 / \ b,!,e(X') ořezání c,!,e(X') d,!,e(X') no !,e(X') e(X') X'/l y \ X'/2 Po zpracování klauzule s rezem se vracím až na rodice této klauzule, tj. a(X) Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: návrat na rodice ?- 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). a(x) h(X/Y) X/1y \^ t1(Y),!,e(Xl) upnutí Y/1 / \ b,!,e(X') ořezání c,!,e(X') d,!,e(X') no !,e(X') e(X') X'/l y \ X'/2 d Po zpracování klauzule s rezem se vracím až na rodice této klauzule, tj. a(X) Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Řez: návrat na rodice ?- a(X). (1) a(X) :- h(X,Y). (2) a(X) :- d. (3) h(1,Y) :- t1(Y), I, 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). a(x) h(X,Y) x/iX \ t1(Y),!,e(Xl) upnutí Y/1 / \ b,!,e(X') ořezání c,!,e(X') d,!,e(X') no !,e(X') e(X') X'/l y \ X'/2 d Po zpracování klauzule s rezem se vracím až na rodice této klauzule, tj. a(X) Hana Rudová, Logické programování I, 18. kvetna 2012 43 Rez, negace Rez: příklad c(X) :- p(X). c(X) :- v(X). p(1). p(2). v(2). ?- c(2). Hana Rudová, Logické programování I, 18. kvetna 2012 44 Rez, negace c(X) :- p(X). c(X) :- v(X). Rez: příklad p(1). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c(X). Hana Rudová, Logické programování I, 18. kvetna 2012 44 Rez, negace Řez: prí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, 18. kvetna 2012 44 Rez, 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, 18. května 2012 44 Ř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, 18. května 2012 44 Řez, negace Rez: príklad c(X) i- p(X). cl(X) i- p(X), I. c(X) i- v(X). cl(X) i- v(X). p(l). p(2). v(2). ľ- c(2). true ľ ; %p(2) true ľ ; %v(2) no ľ- cl(2). true ľ ; %p(2) no ľ- c(X). X = 1 ľ ; %p(l) X = 2 ľ ; %p(2) X = 2 ľ ; %v(2) no ľ- cl(X). X = 1 ľ ; %p(l) no Hana Rudová, Logické programování I, 1S. kvetna 44 Rez, negace Řez: cvičení 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),!. 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. 2. Napište predikát pro výpocet maxima max( X, Y, Max ) Hana Rudová, Logické programování I, 18. kvetna 2012 45 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. Hana Rudová, Logické programování I, 18. kvetna 2012 46 Rez, negace Typy řezu Zlepšení efektivity programu: urcíme, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X ocekávám císlo Zelený řez: 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 Hana Rudová, Logické programování I, 18. kvetna 2012 46 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. Hana Rudová, Logické programování I, 18. kvetna 2012 46 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 Modrý rez: odstraní redundantní r ešení f(X,1) :- X >= 0, !. f(0,1). f(X,-1) :- X < 0. bez rezu vrací f(0,1) 2x Hana Rudová, Logické programování I, 18. kvetna 2012 46 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, 18. kvetna 2012 46 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 Modrý rez: odstraní redundantní r ešení f(X,1) :- X >= 0, !. 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, !. f(_X,-1). bez r ezu uspeje 2. klauzule pro nezáporná císla Hana Rudová, Logické programování I, 18. kvetna 2012 46 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, 18. kvetna 2012 47 Řez, negace Negace jako neúspěch: operátor \+ ďifferent(XfY) :-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 opačném prípade \+ P uspeje \+(_). Hana Rudová, Logické programování I, 18. kvetna 2012 48 Rez, negace Negace jako neúspěch: operátor \+ M different(X,Y) :- X = Y, I, fail. muz(X) :- zena(X), I, fail. different(_X,_Y). muz(_X). JS> Unární operátor \+ P & jestliže P uspeje, potom \+ P neuspeje \+(P) :- P, I, fail. it v opačném p rípade \+ P uspeje \+(_). C different( X, Y ) :- \+ X=Y. -í* muz( X ) :- \+ zena( X ). & Pozor: takto definovaná negace \+P vyžaduje koneCné odvození P Hana Rudová, Logické programování I, 18. kvetna 2012 48 Rez, negace Negace a promenné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). Hana Rudová, Logické programování I, 18. kvetna 2012 49 Rez, negace Negace a promenné \+(P) :- P, !, 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, 18. kvetna 2012 49 Rez, negace Negace a promenne \+(P) :- P' !' fail- % (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é programování I, 18. kvetna 2012 49 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) Hana Rudová, Logické programování I, 18. kvetna 2012 49 Rez, negace 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) Hana Rudová, Logické programování I, 18. května 2012 49 Rez, negace Negace a promenné \+(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á, Logické programování I, 18. kvetna 2012 49 Rez, negace 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 Rudová, Logické programování I, 18. kvetna 2012 49 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, 18. kvetna 2012 49 no Rez, negace Negace a promenné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). Hana Rudová, Logické programování I, 18. kvetna 2012 50 Rez, negace Negace a promenne \+(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, 18. kvetna 2012 50 Rez, negace Negace a promenné rozumne(X), dobre(X) \+(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, 18. kvetna 2012 50 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 ). přomenné rozumne(X), dobre(X) dle (4) \+ drahe(X), dobre(X) Hana Rudová, Logické programování I, 18. kvetna 2012 50 Rez, negace \+(P) :- P, !, 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, 18. kvetna 2012 50 Rez, negace Negace a \+(P) :- P, !, 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, 18. kvetna 2012 50 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, 18. kvetna 2012 50 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) 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é programování I, 18. kvetna 2012 promenne 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 0 Rez, negace Bezpečný cíl C ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no JS> ?- rozumne( citroen ). yes ?- rozumne( X ). no JS> \+ P je bezpečný: proměnné 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, 18. kvetna 2012 51 Řez, negace Chování negace -í* ?- \+ 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, 18. kvetna 2012 52 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 ) Hana Rudová, Logické programování I, 18. kvetna 2012 52 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, 18. kvetna 2012 52 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, 18. kvetna 2012 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. once(P): vrátí pouze jedno řešení cíle P once(P) :- P, I. Hana Rudová, Logické programování I, 18. kvetna 2012 53 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, !, fail; true. once(P): vrátí pouze jedno rešení cíle P once(P) :- P, !. Vyjád rení podmínky: P -> Q ; R J* jestliže platí P tak Q (P -> Q ; R) :- P, !, 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, 18. kvetna 2012 53 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, !, fail; true. once(P): vrátí pouze jedno rešení cíle P once(P) :- P, !. Vyjádrení podmínky: P -> Q ; R J* jestliže platí P tak Q (P -> Q ; R) :- P, !, 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, 18. kvetna 2012 53 Rez, negace Predikáty na r ízení behu programu I. M 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. M P -> Q -i- odpovídá: (P -> Q; fail) S> príklad: zaporne(X) :- number(X) -> X < 0. Hana Rudová, Logické programování I, 18. kvetna 2012 53 Rez, negace Predikáty na r í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, 18. kvetna 2012 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. klasické použití: generuj akci X, proved'ji a otestuj, zda neskonat Hlava :- ... u1oz_stav( StaryStav ), repeat, generuj( X ), % deterministické: generuj, provadej, testuj provadej( X ), testuj( X ), I ■ > obnov_stav( StaryStav ), Hana Rudová, Logické programování I, 18. kvetna 2012 54 Rez, negace Seznamy Repřezentace seznamu & 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 ] = [ajTelo] Hana Rudová, Logické programování I, 18. kvetna 2012 56 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, 18. kvetna 2012 56 Seznamy Repřezentace 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] pred "|"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, 18. kvetna 2012 56 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] -i* p r ed "|"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, 18. kvetna 2012 56 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] pred "|"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] ] & Seznam jako neúplná datová struktura: [a,b,c|T] a Seznam = [a,b,c|T], T = [d,e|S], Seznam = [a,b,c,d,e|S] Hana Rudová, Logické programování I, 18. kvetna 2012 56 Seznamy Prvek seznamu iS> 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, 18. kvetna 2012 57 Seznamy Přvek 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, 18. kvetna 2012 57 Seznamy Prvek seznamu member(1,[2,1,3,1,4]) iS> 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, 18. kvetna 2012 57 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]) Hana Rudová, Logické programování I, 18. kvetna 2012 57 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, 18. kvetna 2012 57 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 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, 18. kvetna 2012 57 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, 18. kvetna 2012 57 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, 18. kvetna 2012 57 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, 18. kvetna 2012 57 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, 18. kvetna 2012 58 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] ) -í* 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, 18. kvetna 2012 58 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] ) Definice: -i- pokud je 1. argument prázdný seznam, pak 2. a 3. argument jsou stejné seznamy: append( [], S, S ). j* pokud je 1. argument neprázdný seznam, pak má 3. argument stejnou hlavu jako 1.: append( [X|S1], S2, [X|S3] ) :- append( S1, S2, S3). X S1 S2 S3 Hana Rudová, Logické programování I, 18. kvetna 2012 58 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á, Logické programování I, 18. kvetna 2012 59 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, 18. kvetna 2012 59 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, 18. kvetna 2012 59 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] Hana Rudová, Logické programování I, 18. kvetna 2012 59 Seznamy Cvicení: append/2 append( [], S, S ). % (1) append( [X|S1], S2, [X|S3] ) :- append( Sl, 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, 18. kvetna 2012 59 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). I (2) I A=[1|B] I :- append([2],[3,4],B). I (2) | B=[2|C] => A=[1,2|C] I :- append([],[3,4],C). I (1) | C=[3,4] => A=[1,2,3,4], I yes Hana Řudová, Logické programování I, 18. kvetna 2012 59 Seznamy Optimalizace posledního volání Last Call Optimization (LCO) Implementacní technika snižující nároky na pamet' Mnoho vnorených rekurzivních volání je nárocné na pamet' Použití LCO umožnuje vnorenou rekurzi s konstantními pametovými nároky Typický prí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 predcházející tomuto rekurzivnímu volání musí být deteřministické -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 řekuřze lze převést na iteřaci Hana Rudová, Logické programování I, 18. kvetna 2012 60 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, 18. kvetna 2012 61 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. -í* Upravená procedura, tak aby umožnila LCO: % 1ength( Seznam, ZapocitanaDelka, CelkovaDelka ): % CelkovaDelka = ZapocitanaDelka + ,,pocet prvků v Seznam'' Hana Rudová, Logické programování I, 18. kvetna 2012 61 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. -í* Upravená procedura, tak aby umožnila LCO: % 1ength( Seznam, ZapocitanaDe1ka, Ce1kovaDe1ka ): % Ce1kovaDe1ka = ZapocitanaDe1ka + ,,pocet prvků v Seznam'' 1ength( Seznam, De1ka ) :- 1ength( Seznam, 0, De1ka ). % pomocný predikát 1ength( [], De1ka, De1ka ). % celková délka = zapocítaná délka 1ength( [ H | T ], A, De1ka ) :- A0 is A + 1, 1ength( T, A0, De1ka ). -í* Prídavný argument se nazývá akumulátor Hana Rudová, Logické programování I, 18. kvetna 2012 61 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á, Logické programování I, 18. kvetna 2012 62 Seznamy max_list s akumulátorem Výpocet 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 ). max_list([H|T],Max) :- max_list(T,H,Max). max_list([], Max, Max). max_list([H|T], CastecnyMax, Max) :-( H > CastecnyMax, !, max_list(T, H, Max ) max_list(T, CastecnyMax, Max) ). Hana Rudová, Logické programování I, 18. kvetna 2012 62 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, 18. kvetna 2012 63 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, 18. kvetna 2012 63 Seznamy Akumulátor jako seznam Nalezení seznamu, ve kterém jsou prvky v opacném po radí 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 p r ídáním prvků ze Seznam do Akumulator v opacnem poradi Hana Rudová, Logické programování I, 18. kvetna 2012 63 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, 18. kvetna 2012 63 Seznamy Akumulátor jako seznam JS> Nalezení seznamu, ve kterém jsou prvky v opačném po radí 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 p r í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 ). % p r idání H do akumulátoru zpetná konstrukce seznamu (srovnej s p r edchozí dop rednou konstrukcí, nap r . append) Hana Rudová, Logické programování I, 18. kvetna 2012 63 Seznamy čvičení reverse( Seznam, OpacnySeznam ) :- % (1) reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). % (2) reverse( [ H | T ], A, Opacny ) :- % (3) reverse( T, [ H | A ], Opacny ). ? - reverse([1,2,3],O). reverse([1,2,3],O) -► Hana Rudová, Logické programování I, 18. kvetna 2012 64 Seznamy cvicení reverse( Seznam, OpacnySeznam ) i- % (1) reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). % (2) reverse( [ H | T ], A, Opacny ) i- % (S) reverse( T, [H j A ], Opacny ). ľ - reverse([l,2,5],O). reverse([l,2,5],O) - (1) reverse([l,2,5], [], O) - Hana Rudová, Logické programování I, 18. kvetna 2012 64 Seznamy cvičení reverse( Seznam, OpacnySeznam ) :- % (1) reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). % (2) reverse( [ H | T ], A, Opacny ) :- % (3) reverse( T, [ H | A ], Opacny ). ? - reverse([1,2,3],O). reverse([1,2,3],O) - (1) reverse([1,2,3], [], O) - (3) reverse([2,3], [1], O) - Hana Rudová, Logické programování I, 18. kvetna 2012 64 Seznamy čvičení reverse( Seznam, OpacnySeznam ) :- % (1) reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). % (2) reverse( [ H | T ], A, Opacny ) :- % (3) reverse( T, [ H | A ], Opacny ). ? - reverse([1,2,3],O). reverse([1,2,3],O) - (1) reverse([1,2,3], [], O) - (3) reverse([2,3], [1], O) - (3) reverse([3], [2,1], O) - Hana Rudová, Logické programování I, 18. kvetna 2012 64 Seznamy cvicení reverse( Seznam, OpacnySeznam ) :- % (1) reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). % (2) reverse( [ H | T ], A, Opacny ) :- % (3) reverse( T, [ H | A ], Opacny ). ? - reverse([1,2,3],O). reverse([1,2,3],O) - (1) reverse([1,2,3], [], O) - (3) reverse([2,3], [1], O) - (3) reverse([3], [2,1], O) - (3) reverse([], [3,2,1], O) - Hana Rudová, Logické programování I, 18. kvetna 2012 64 Seznamy cvičení reverse( Seznam, OpacnySeznam ) :- % (1) reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). % (2) reverse( [ H | T ], A, Opacny ) :- % (3) reverse( T, [ H | A ], Opacny ). ? - reverse([1,2,3],O). reverse([1,2,3],O) - (1) reverse([1,2,3], [], O) - (3) reverse([2,3], [1], O) - (3) reverse([3], [2,1], O) - (3) reverse([], [3,2,1], O) - (2) yes O=[3,2,1] Hana Rudová, Logické programování I, 18. kvetna 2012 64 Seznamy Neefektivita p ř 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, 18. kvetna 2012 65 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 ). Hana Rudová, Logické programování I, 18. kvetna 2012 65 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, 18. kvetna 2012 65 Seznamy pri spojování seznamů C Sjednocení dvou seznamu & 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'' ) C Vždy je nutné projít celý první seznam Hana Rudová, Logické programování I, 18. kvetna 2012 65 Seznamy Rozdílové seznamy Zapamatování konce a p r ipojení na konec: rozdílové seznamy Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 v 1 L1 L2 \ append( A1-Z1, Z1-Z2, A1-Z2 ). L1 L2 L3 L3 Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 v 1 L1 L2 \ 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,1|Z2]-Z2 L3 Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 v 1 L1 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,1|Z2]-Z2 ?- append( [2,3|Z1]-Z1, [1|Z2]-Z2, S ). S = Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 v 1 L1 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,1|Z2]-Z2 ?- append( [2,3|Z1]-Z1, [1|Z2]-Z2, S ). S = A1 - Z2 = Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 A1 Z1 A2 Z2 v 1 L1 L2 \ append( Al-Zl, Z1-Z2, A1-Z2 ). Ll L2 LS [2,5] [1] [2^,1] [2fB|Z1]-Z1 [1|Z2]-Z2 [2,S,1|Z2]-Z2 L3 ľ- append( [2,3|Z1]-Z1, [1|Z2]-Z2, S ). S = Al - Z2 = [2,S|Zl] - Z2 = Hana Rudová, Logické programování I, 1S. kvetna 66 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 v 1 L1 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,1|Z2]-Z2 ?- append( [2,3|Z1]-Z1, [1|Z2]-Z2, S ). S = A1 - Z2 = [2,3|Z1] - Z2 = [2,3| [1|Z2] ] Z2 Hana Rudová, Logické programování I, 18. kvetna 2012 66 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 v 1 L1 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,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, 18. kvetna 2012 66 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í) Hana Rudová, Logické programování I, 18. kvetna 2012 67 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, 18. kvetna 2012 67 Seznamy Akumuiátor vs. rozdíiové 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, pridání na konec, odebrání ze zacátku Hana Rudová, Logické programování I, 18. kvetna 2012 67 Seznamy Vestavené predikáty Vestavené predikáty -í* Predikáty pro rízení behu programu a fail, 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, 18. kvetna 2012 69 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( K1auzu1e ) pr idání K1auzu1e do programu asserta( K1auzu1e ) p r idání na zacátek assertz( K1auzu1e ) p r idání na konec retract( K1auzu1e ) smazání klauzule unifikovatelné s K1auzu1e Pozor: nadmerné použití techto operací snižuje srozumitelnost programu Hana Rudová, Logické programování I, 18. kvetna 2012 70 Vestavené predikáty Príklad: databázové operace -í* Caching: odpovedi na dotazy jsou pridány do programové databáze Hana Rudová, Logické programování I, 18. kvetna 2012 71 Vestavené 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) ). J* :- dynamic solve/2. % nezbytné při použití v SICStus Prologu Hana Rudová, Logické programování I, 18. května 2012 71 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, 18. května 2012 71 Vestavěné 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) ). 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, 18. května 2012 71 Vestavěné predikáty Vstup a výstup program muže císt data ze vstupního proudu (input stream) program může zapisovat data do výstupního proudu (output stream) dva aktivní proudy & aktivní vstupní proůd -i- aktivní výstupní proůd uživatelský terminál - user Jť datový vstůp z terminálů user chápán jako jeden ze vstupních proudů datový výstup na terminál chápán jako jeden z výstupních proudu soubor 1 soubor 2 user vstupni proudy soubor 3 soubor 4 vystupni proudy Hana Růdová, Logické programování I, 18. května 2012 72 Vestavěné predikáty Vstupní a výstupní přoudy: vestavené přediká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> uzavření aktivního vstupního/výstupního proudu: seen/told Hana Rudová, Logické programování I, 18. kvetna 2012 73 Vestavené predikáty Vstupní a výstupní proudy: vestavené predikáty zmena (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> uzavrení aktivního vstupního/výstupního proudu: seen/told & zjištení aktivního vstupního/výstupního proudu: seeing(S)/telling(S) cteni( Soubor ) :- seeing( StarySoubor ), see( Soubor ), cteni_ze_souboru( Informace ), seen, see( StarySoubor ). Hana Rudová, Logické programování I, 18. kvetna 2012 73 Vestavené predikáty Sekvenční přístup k textovým souborům čtení dalšího termu: read(Term) j* pri ctení jsou termy oddeieny teckou | ?- read(A), read( ahoj(B) ), read( [C,D] ). Hana Rudová, Logické programování I, 18. kvetna 2012 74 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, 18. května 2012 74 Vestavěné predikáty Sekvenční přístup k textovým souborům čtení dalšího termu: read(Term) j* pri 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_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, 18. kvetna 2012 74 Vestavené predikáty Sekvenční přístup k textovým soubomm čtení dalšího teřmu: 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 teřmu: write(Term) ?- write( ahoj ). ?- write( 'Ahoj Petre!' ). nový rádek na výstup: nl 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, 18. kvetna 2012 74 Vestavené predikáty Príklad Ctení ze souboru process_file( Soubor ) :- seeing( StarySoubor ), see( Soubor ), repeat, read( Term ), process_term( Term ), Term == end_of_file, i ■ j seen see( StarySoubor ). % zjištěni aktivniho proudu % otěvrěni souboru Soubor % ctěni těrmu Těrm % manipulace s těrměm % jě koněc souboru? % uzavrěni souboru % aktivace puvodniho proudu repeat. % opakování repeat :- repeat. Hana Rudová, Logické programování I, 18. kvetna 2012 75 Vestavené predikáty Ctení programu ze souboru JS> Interpretování kódu programu a ?- consu1t(program). a ?- consu1t('program.p1'). a ?- consu1t( [program1, 'program2.p1'] ). -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, 18. kvetna 2012 76 Vestavené predikáty Všechna řešení Backtracking vrací pouze jedno řeš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, 18. kvetna 2012 77 Vestavené predikáty Všechna řešení Backtracking vrací pouze jedno rešení po druhém Všechna reš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, 18. kvetna 2012 77 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 ] Volné promenné v cíli P jsou všeobecne kvantifikovány ?- bagof( Dite, vek( Dite, Vek ), Seznam ). Hana Rudová, Logické programování I, 18. kvetna 2012 77 Vestavené predikáty Všechna rešení Backtracking vrací pouze jedno řeš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, 18. kvetna 2012 77 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, 18. kvetna 2012 78 Vestavené predikáty vr vr 'II reseni 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í: X je term ?- bagof( Dite-Vek, vek( Dite, Vek ), Seznam ). Seznam = [petr-7,anna-5,tomas-5] Hana Rudová, Logické programování I, 18. kvetna 2012 78 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 ). Hana Rudová, Logické programování I, 18. kvetna 2012 79 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, 18. května 2012 79 Vestavěné 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] Anonymní proměnné jsou všeobecně 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, 18. kvetna 2012 79 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 ). 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] Pred 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, 18. kvetna 2012 79 Vestavené predikáty reš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 Hana Rudová, Logické programování I, 18. kvetna 2012 80 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 Mš finda11( X, P, S ): rozdíly od bagof všechny proměnné jsou existenCne kvantifikovány ?- findall( Dite, vek( Dite, Vek ), Seznam ). Hana Rudová, Logické programování I, 18. kvetna 2012 80 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 Mš 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á r ešení == findall uspeje p r esne jednou Hana Rudová, Logické programování I, 18. kvetna 2012 80 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, 18. kvetna 2012 80 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, 18. kvetna 2012 80 Vestavené predikáty reSení 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 JS> 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, 18. kvetna 2012 80 Vestavené predikáty Testování typu termu var(X) X je volná promenná nonvar(X) X není promenná Hana Rudová, Logické programování I, 18. kvetna 2012 81 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, 18. kvetna 2012 81 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, 18. kvetna 2012 81 Vestavené predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) Hana Rudová, Logické programování I, 18. kvetna 2012 82 Vestavené predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). Hana Rudová, Logické programování I, 18. kvetna 2012 82 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, 18. kvetna 2012 82 Vestavené predikáty Uřčení počtu výskytů přvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, N1 is NO + 1, count( X, S, N1, N). Hana Rudová, Logické programování I, 18. kvetna 2012 82 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) :- !, 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, 18. kvetna 2012 82 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, 18. května 2012 82 Vestavěné predikáty Uřčení počtu výskytů přvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, N1 is NO + 1, count( X, S, N1, N). count( X, [_|S], NO, N) :- count( X, S, NO, N). :-? count( a, [a,b,a,a], N ) :-? count( a, [a,b,X,Y], N). N=3 Hana Rudová, Logické programování I, 18. kvetna 2012 82 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) :- !, 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 Hana Rudová, Logické programování I, 18. kvetna 2012 82 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 ) :-? 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, 18. května 2012 82 Vestavěné predikáty Konstrukce a dekompozice atomu JS> 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 Hana Rudová, Logické programování I, 18. kvetna 2012 83 Vestavené predikáty KonstrukCe a dekompozke atomu 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 Řetězec znaků 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, 18. kvetna 2012 83 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ů: +, <->, ===> A ř 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, 18. kvetna 2012 83 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, 18. kvetna 2012 84 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 ) Hana Rudová, Logické programování I, 18. května 2012 84 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 Hana Rudová, Logické programování I, 18. kvetna 2012 84 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] Hana Rudová, Logické programování I, 18. kvetna 2012 84 Vestavené predikáty Konstrukce a dekompozice termu -í* Konstrukce a dekompozice termu Term =.. [ Funktor j SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor j SeznamArgumentu ], ca11( 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 ) Hana Rudová, Logické programování I, 18. kvetna 2012 84 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, 18. kvetna 2012 84 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, 18. kvetna 2012 84 Vestavené predikáty Rekuřzivní řozklad teřmu Term je promenná (var/1), atom nebo císlo (atomic/1) => konec rozkladu Hana Rudová, Logické programování I, 18. kvetna 2012 85 Vestavené predikáty Rekurzivní rozklad termu Term je promenná (var/1), atom nebo Čí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, 18. kvetna 2012 85 Vestavené predikáty Rekurzivní rozklad termu 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 Hana Rudová, Logické programování I, 18. kvetna 2012 85 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, 18. kvetna 2012 85 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, 18. kvetna 2012 85 Vestavené predikáty Rekurzivní rozklad 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, 18. kvetna 2012 85 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, 18. kvetna 2012 85 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), !. ground(Term) :- var(Term), !, fail. ground([H|T]) :- !, ground(H), ground(T). ground(Term) :- Term =.. [ _Funktor | Argumenty ], ground( Argumenty ). Hana Rudová, Logické programování I, 18. kvetna 2012 85 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([H|T]) :- !, ground(H), ground(T). ground(Term) :- Term =.. [ _Funktor | 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, 18. kvetna 2012 85 Vestavené predikáty Příklad: dekompoziče teřmu I. count_term( Integer, Term, N ) urc pocet výskytů celého císla v termu Hana Rudová, Logické programování I, 18. kvetna 2012 86 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, 18. kvetna 2012 86 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). Hana Rudová, Logické programování I, 18. kvetna 2012 86 Vestavené predikáty Příklad: dekompoziče teřmu I. count_term( Integer, Term, N ) unií 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, O, N). count_term( X, T, NO, N ) :- integer(T), X = T, !, N is NO + 1. Hana Rudová, Logické programování I, 18. kvetna 2012 86 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), !. Hana Rudová, Logické programování I, 18. kvetna 2012 86 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, 18. kvetna 2012 86 Vestavené predikáty Příklad: dekompoziče teřmu I. M count_term( Integer, Term, N ) ura 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, O, 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 L Hana Rudová, Logické programování I, 18. kvetna 2012 86 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, !, 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, 18. kvetna 2012 86 Vestavené predikáty P r í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, 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 ). Hana Rudová, Logické programování I, 18. kvetna 2012 86 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, !, 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), Hana Rudová, Logické programování I, 18. kvetna 2012 86 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), N2 is N0 + N1, Hana Rudová, Logické programování I, 18. kvetna 2012 86 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, !, 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, count_arg( X, T, N2, N ). Hana Rudová, Logické programování I, 18. kvetna 2012 86 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, !, 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, count_arg( X, T, N2, N ). ?- count_term( 1, [a,2,[b,c],[d,[e,f],Y]], N ). Hana Rudová, Logické programování I, 18. kvetna 2012 86 Vestavené predikáty Prí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, 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řidáme pred poslední klauzuli count_term/4 Hana Rudová, Logické programování I, 18. kvetna 2012 86 Vestavené predikáty Cvičení: dekompozice 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 & Pr edpokládejte, že Term a Podterm jsou termy bez promenných & ?- substitute( sin(x), 2*sin(x)*f(sin(x)), t, F ). F=2*t*f(t) Hana Rudová, Logické programování I, 18. kvetna 2012 87 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, 18. kvetna 2012 89 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í Hana Rudová, Logické programování I, 18. kvetna 2012 90 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, 18. kvetna 2012 90 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ř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řípady psát př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řed výstupními Hana Rudová, Logické programování I, 18. kvetna 2012 90 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, 18. kvetna 2012 90 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, 18. kvetna 2012 91 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, 18. kvetna 2012 91 Technika a styl programování v Prologu Správný styl programování -í* konstrukce setrídeného seznamu Seznam3 ze setrídený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í Hana Rudová, Logické programování I, 18. kvetna 2012 91 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, 18. kvetna 2012 91 Technika a styl programování vPrologu Správný styl programování -í* konstrukce setříděného seznamu Seznam3 ze setříděných seznamů Seznaml, Seznam2: meřge( Seznaml, Seznam2, Seznam3 ) M meřge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) JS> meřge( [], Seznam, Seznam ) :- I. % prevence redundantních řešení meřge( Seznam, [], Seznam ). meřge( [XjTelol], [Y|Te1o2], [X|Te1o3] ) :- Hana Rudová, Logické programování I, 18. kvetna 2012 91 Technika a styl programování vPrologu 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, 18. kvetna 2012 91 Technika a styl programování v Prologu Správný styl programování -í* konstrukce setřídeného seznamu Seznam3 ze setřídených seznamů Seznamí, Seznam2: merge( Seznamí, 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|Te1o1], [Y|Te1o2], [X|Te1o3] ) :-X < Y, I, merge( Te1o1, [Y|Te1o2], Te1o3 ). Hana Rudová, Logické programování I, 18. kvetna 2012 91 Technika a styl programování vPrologu Správný styl programování -í* konstrukce setřídeného seznamu Seznam3 ze setřídených seznamů Seznaml, Seznam2: meřge( Seznaml, Seznam2, Seznam3 ) M meřge( [2,4,7], [l,3,4,8], [l,2,3,4,4,7,8] ) & meřge( [], Seznam, Seznam ) :- I. % prevence redundantních ř ešení meřge( Seznam, [], Seznam ). meřge( [XjTelol], [Y|Te1o2], [X|Te1o3] ) :-X < Y, I, meřge( Telol, [Y|Te1o2], Te1o3 ). meřge( Seznaml, [Y|Te1o2], [Y|Te1o3] ) :- Hana Rudová, Logické programování I, 18. kvetna 2012 91 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] ) :-merge( Seznaml, Te1o2, Te1o3 ). Hana Rudová, Logické programování I, 18. kvetna 2012 91 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, 18. kvetna 2012 92 Technika a styl programování v Prologu Styl programování v Prologu II. & Stredník „;" muže způsobit nesrozumitelnost klauzule a nedávat st r edník na konec rá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, 18. kvetna 2012 93 Technika a styl programování v Prologu Styl programování v Prologu II. & Strední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, 18. kvetna 2012 93 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 & Opatrné používání negace „\+" a negace jako neúspech: negace není ekvivalentní negaci v matematické logice Hana Rudová, Logické programování I, 18. kvetna 2012 93 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 -> Cill ; Cil2 \ + P Hana Rudová, Logické programování I, 18. kvetna 2012 93 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, 18. kvetna 2012 94 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), p ríklad použití -í* které predikáty jsou hlavní (top-level) Hana Rudová, Logické programování I, 18. kvetna 2012 94 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, 18. kvetna 2012 94 Technika a styl programování vPrologu 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 Hana Rudová, Logické programování I, 18. kvetna 2012 94 Technika a styl programování v Prologu Dokumentače 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 Hana Rudová, Logické programování I, 18. kvetna 2012 94 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 Hana Rudová, Logické programování I, 18. kvetna 2012 94 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 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 Hana Rudová, Logické programování I, 18. kvetna 2012 94 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 pameť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 algoritmické a implementacní podrobnosti Hana Rudová, Logické programování I, 18. kvetna 2012 94 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, 18. kvetna 2012 95 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 .0 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, 18. kvetna 2012 95 Technika a styl programování v Prologu Krabickový (4-branový) model Vizualizace ří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 p redchozímu rešení __________________________________________ Call j -----------------> + predek( X, Z ) i- rodic( X, Z ). j j predek( X, Z ) i- rodic( X, Y ), j Exit <----------------- + Fai1 j predek( Y, Z). + --------- > j j + <--------- j Redo __________________________________________ Hana Rudová, Logické programování I, 18. kvetna 2012 96 Technika a styl programování v Prologu Příklad: trasovaní a(X) :- nonvar(X). a(X) :- c(X). a(X) :- d(X). c(1). d(2). __________________/* Call | | Exit ------> + a(X) :- nonvar(X).| ------> | a(X) :- c(X). | <------+ a(X) :- d(X). + <------ Fail | | Redo ___________________/* Hana Rudová, Logické programování I, 18. kvetna 2012 97 Technika a styl programování vPrologu Příklad: třasování a(X) i- nonvar(X). a(X) i- c(X). a(X) i- d(X). c(1). d(2). I ľ- a(X). 1 2 2 1 Calli a(_463) ľ 2 Calli nonvar(_463) ľ 2 Faili nonvar(_463) ľ __________________/\ 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 ___________________/\ Hana Rudová, Logické programování I, 1S. kvetna 2C12 97 Technika a styl programování v Prologu Pr íklad: trasování a(X) i- nonvar(X). | ľ- a(X). a(X) i- c(X). X X Calli a(_463) ľ a(X) i- d(X). 2 2 Calli nonvar(_463) ľ c(X). 2 2 Faili nonvar(_463) ľ d(2). 3 2 Calli c(_463) ľ 3 2 Exiti c(X) ľ ľX X Exiti a(X) ľ Ca11 j j Exit ------> + a(X) i- nonvar(X).| ------> | a(X) i- c(X). | <------+ a(X) i- d(X). + <------ Fai1 j j Redo ___________________/\ X = X ľ Hana Rudová, Logické programování I, 18. kvetna 2012 97 Technika a styl programování v Prologu Pr íklad: trasování a(X) :- nonvar(X). | ľ- 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 | | Exit X = 1 ľ; > ------ > + a(X) :- nonvar(X).| ------> 1 1 Redo: a(1) ľ | a(X) :- c(X). | 4 2 Call: d(_463) ľ <------+ a(X) :- d(X). + <------ Fai1 | | Redo ___________________/\ Hana Rudová, Logické programování I, 18. kvetna 2012 97 Technika a styl programování v Prologu Příklad: trasovaní a(X) :- nonvar(X). | ?- 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 || Exit X = 1 ? ■ > ------ > + a(X) :- nonvar(X).| ------> 1 1 Redo: a(1) ? | a(X) :- c(X). | 4 2 Call: d(_463) ? <------ + a(X) :- d(X). + <------ 4 2 Exit: d(2) ? Fail || Redo 1 1 Exit: a(2) ? X = 2 ? ■ > no % trace | ?- Hana Rudová, Logické programování I, 18. kvetna 2012 97 Technika a styl programování vPrologu 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, 18. kvetna 2012 98 Technika a styl programování v Prologu Efektivita -í* Cas výpoctu, pameť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 pri prohledávání odstranení zbytecného backtrackingu zrušení provádení zbytecných alternativ co nejdříve a návrh vhodnejších datových struktur, které umožní efektivnejší operace s objekty Hana Rudová, Logické programování I, 18. kvetna 2012 98 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ýsledků do programové databáze Hana Rudová, Logické programování I, 18. kvetna 2012 99 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 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( Prijmeni, KrestniJmeno, Oddeleni, ...) -i- seznamy( [], ...) :- ... . seznamy( [HjT], ...) :- ... . Hana Rudová, Logické programování I, 18. kvetna 2012 99 Technika a styl programování vPrologu Zlepšení efektivity: základní techniky Optimalizace posledního volání (LCO) a akumulátory & Rozdílové seznamy pri spojování seznamů JS> 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, Odděleni, ...) -i- seznamy( [], ...) :- ... . seznamy( [H|T], ...) :- ... . Determinismus: j* rozhodnout, které klauzule mají uspet vícekrát, overit požadovaný determinismus Hana Rudová, Logické programování I, 18. kvetna 2012 99 Technika a styl programování v Prologu Predikátová logika l.řá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, 18. kvetna 2012 101 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, 18. kvetna 2012 101 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, ... -i* 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, 18. kvetna 2012 101 Teorie logického programování Predikátová logika I. rádu (PL1) Abeceda A jazyka L PLI se skládá ze symbolu: JS> promenné X, Y, ... oznacují libovolný objekt z daného oboru Hana Rudová, Logické programování I, 18. kvetna 2012 102 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 argumentů, n-ární symbol, znacíme f/n nulární funkcní symboly - konstanty: oznacují význacné objekty (p r íklad: 0, 1, ...) Hana Rudová, Logické programování I, 18. kvetna 2012 102 Predikátová logika Predikátová logika I. rádu (PLl) Abeceda A jazyka L PL1 se skládá ze symbolu: -i* 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 Hana Rudová, Logické programování I, 18. kvetna 2012 102 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 argumentů, 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 & logičké spojky a, v, =>, = Hana Rudová, Logické programování I, 18. kvetna 2012 102 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 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 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) v logice 1. rádu nelze: v R : V A c R, Vf : R - R Hana Rudová, Logické programování I, 18. kvetna 2012 102 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 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, 18. kvetna 2012 102 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, 18. kvetna 2012 103 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 „=" Příklady C jazyk teorie uspo rádání j* jazyk s =, binární prediátový symbol < Hana Rudová, Logické programování I, 18. kvetna 2012 103 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 usporádání j* jazyk s =, binární prediátový symbol < JS* jazyk teorie množin -i- jazyk s =, binární predikátový symbol g Hana Rudová, Logické programování I, 18. kvetna 2012 103 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řá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, 18. kvetna 2012 103 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, 18. kvetna 2012 104 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í prechozí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) Hana Rudová, Logické programování I, 18. kvetna 2012 104 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, 18. kvetna 2012 104 Predikátová logika Interpretače Interpretače 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í operači nad D každému predikátovému symbolu p/n g A p r i radí n-ární relači nad D Hana Rudová, Logické programování I, 18. kvetna 2012 105 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 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 Príklad: uspo rá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, 18. kvetna 2012 105 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, 18. kvetna 2012 105 Predikátová logika Sémantika formulí Ohodnocení pramenné 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)) = Hana Rudová, Logické programování I, 18. kvetna 2012 106 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) = Hana Rudová, Logické programování I, 18. kvetna 2012 106 Predikátová logika Sémantika formulí Ohodnočení promenné q(X): každé promenné X je p r i razen prvek |1| Hodnota termu 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)) + qp(X) = (1 + qp(zero)) + 0 = Hana Rudová, Logické programování I, 18. kvetna 2012 106 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 + op(zero)) + 0 = (1 + 0) + 0 = 1 Hana Rudová, Logické programování I, 18. kvetna 2012 106 Predikátová logika Sémantika formulí Ohodnocení pramenné 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 Nepravdivá formule I Q: formule Q oznacena nepravda Hana Rudová, Logické programování I, 18. kvetna 2012 106 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 Nepravdivá 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)) Hana Rudová, Logické programování I, 18. kvetna 2012 106 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á 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 Nepravdivá 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, 18. kvetna 2012 106 Predikátová logika Sémantika formulí Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek |1| Hodnota termu op(t): každému termu je přiřazen prvek univerza prí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é strukture a interpretaci Pravdivá formule I Nq q: formule Q oznaCena pravda Nepravdivá formule I Nq q: formule Q oznaCena nepravda -fc prí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 Hana Rudová, Logické programování I, 18. kvetna 2012 106 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 Nepravdivá formule I Nq 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, 18. kvetna 2012 106 Predikátová logika Sémantika formulí Ohodnocení promenné q(X): každé promenné X je p r i razen prvek |1| Hodnota termu 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á 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 Nepravdivá formule I Nq Q: formule Q oznacena nepravda -fc p r íklad: p/i predikátový symbol, tj. p c |i| 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 iff (q(zero)) g p a ((i + q(zero)) g p iff (0) g p a (i) g p (i) g p ale (0) G p, tedy formule je nepravdivá v I Hana Rudová, Logické programování I, 18. kvetna 2012 106 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 Hana Rudová, Logické programování I, 18. kvetna 2012 107 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 Hana Rudová, Logické programování I, 18. kvetna 2012 107 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 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, 18. kvetna 2012 107 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řiřazení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 ří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, 18. kvetna 2012 107 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 JS> 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 i= F: pravdivá v každém z modelu 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 ccísel JS> Logicky pravdivá formule = 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, 18. kvetna 2012 107 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 odvozovačíčh pravidel Hana Rudová, Logické programování I, 18. kvetna 2012 108 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 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, 18. kvetna 2012 108 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 —* 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 Hana Rudová, Logické programování I, 18. kvetna 2012 108 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 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 & F je dokazatelná z formulí A1f • • • ,An A1t • • • ,An h F existuje-li dukaz F z A1, • • • ,An Hana Rudová, Logické programování I, 18. kvetna 2012 108 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 předchozí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 & F je dokazatelná z formulí Ai, • • • ,An Ai, • • • ,An h F existuje-li důkaz F z Ai, • • • ,An & Dokazatelné formule v teorii T nazýváme teorémy teorie T Hana Rudová, Logické programování I, 18. kvetna 2012 108 Predikátová logika Korektnost a úplnost Uzavrená formule: neobsahuje volnou promennou (bez kvantifikace) VY ((0 < Y) a ( 3X (X < Y))) je uzavr ená formule iľ ( 3X (X < Y)) není uzavrená formule Hana Rudová, Logické programování I, 18. kvetna 2012 109 Predikátová logika Korektnost a úplnost Uzavrená 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, 18. kvetna 2012 109 Predikátová logika Korektnost a úplnost Uzavřená formule: neobsahuje volnou promennou (bez kvantifikace) VY ((0 < Y) a ( 3X (X < Y))) je uzavřená formule iľ ( 3X (X < Y)) není uzavřená formule M Množina odvozovacích pravidel se nazývá korektní, jestliže pro každou množinu uzavřených formulí P a každou uzavř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é) Hana Rudová, Logické programování I, 18. kvetna 2012 109 Predikátová logika Korektnost a úplnost Uzavrená 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í) 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, 18. kvetna 2012 109 Predikátová logika RezoluCe v predikátové logke 1. 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, 18. kvetna 2012 111 Rezoluce vPL1 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, 18. kvetna 2012 111 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, 18. kvetna 2012 112 Rezoluce vPL1 Formule literál l J» pozitivní literál = atomická formule p(ti, • • • ,tn) s* negativní literál = negace atomické formule -p(ti, • • • ,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, 18. kvetna 2012 112 Rezoluce vPL1 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) & formule F = množina klauzulí reprezentující jejich konjunkci formule je v tzv. konjuktivní normální forme (konjunkce disjunkcí) J* p rí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, 18. kvetna 2012 112 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}} 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, 18. kvetna 2012 112 Rezoluce v PL1 Formule literál l s* pozitivní literál = atomická formule p(t1, • • • ,tn) s* negativní literál = negace atomické formule -p(ti, • • • ,tn) & klauzule C = konecná množina literálů reprezentující jejich disjunkci pří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í) pří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é 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, 18. kvetna 2012 112 Rezoluce v PL1 Splnitelnost [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 ?i: D = Z, a := 1,b := -1,f := " + " Hana Rudová, Logické programování I, 18. kvetna 2012 113 Rezoluce v PL1 Splnitelnost [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 ?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é ± príklad (pokrač): F je splnitelná (je pravdivá v I1) Hana Rudová, Logické programování I, 18. kvetna 2012 113 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 ?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é ± príklad (pokrac.): F je splnitelná (je pravdivá v I1) & Formule je nesplnitelná, neexistuje-li interpretace, pro kterou je pravdivá tj. formule je ve všech iterpretacích nepravdivá -i- tj. neexistuje interpretace, ve které by byly všechny klauzule pravdivé j* prí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, 18. kvetna 2012 113 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-l} u C2 klauzuli C1 u C2 Ci u {l} {-l} u C2 Ci u C2 & C1 u C2 se ňazývá rezolventou původních klauzulí Hana Rudová, Logické programování I, 18. kvetna 2012 114 Rezoluce v PL1 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} j—r,s} (p v r) a (—r v s) jp,s} p v s Hana Rudová, Logické programování I, 18. kvetna 2012 114 Rezoluce vPL1 Rezolucní princip ve výrokové logice Rezolucní princip = pravidlo, které umožnuje odvodit z klauzulí Ci u {l} a {-l} u C2 klauzuli Ci u C2 Ci u {l} {-l} u C2 Ci u C2 Ci u C2 se nazývá rezolventou puvodních klauzulí p r í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, 18. kvetna 2012 114 Rezoluce vPL1 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, 18. kvetna 2012 115 Rezoluce vPL1 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, 18. kvetna 2012 115 Rezoluce v PL1 Rezolucní důkaz rezolucní 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}} Ci = {p,r} klauzule z F Hana Rudová, Logické programování I, 18. kvetna 2012 115 Rezoluce v PL1 Rezoluční důkaz rezoluční 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. & p rí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 Hana Rudová, Logické programování I, 18. kvetna 2012 115 Rezoluce vPL1 Rezolucní důkaz rezolucní 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. & p ríklad: rezolucní důkaz {p} z formule F = {{p,r}, {q, -r}, {-q}} Ci = {p,r} klauzule z F C2 = {q, -r} klauzule z F C3 = {p, q} rezolventa Ci a C2 Hana Rudová, Logické programování I, 18. kvetna 2012 115 Rezoluce vPL1 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, 18. kvetna 2012 115 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 C3 = {p, q} rezolventa C a C2 C4 = {—q} klauzule z F C5 = {p} = C rezolventa C3 a C4 Hana Rudová, Logické programování I, 18. kvetna 2012 115 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, 18. kvetna 2012 116 Rezoluce v PL1 Rezoluční vyvrácení důkaz pravdivosti formule F spocívá v demonstraci nesplnitelnosti — F j* —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, 18. kvetna 2012 116 Rezoluce vPL1 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á —* 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... -a v a -F.. .a a -a -F... {{a}, {-a}} Hana Rudová, Logické programování I, 18. kvetna 2012 116 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 uplatnováním rezolucního principu dospet k prázdné klauzuli □ C Príklad: F... -a v a -F.. .a a -a -F... {{a}, {-a}} Ci = {a}, C2 = {-a} rezolventa Ci a C2 je □, tj. F je vždy pravdivá & rezolucní důkaz □ z formule G se nazývá rezolucní vyvrácení formule G -i- a tedy G je nepravdivá ve všech interpretacích, tj. G je nesplnitelná Hana Rudová, Logické programování I, 18. kvetna 2012 116 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, 18. kvetna 2012 117 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, 18. kvetna 2012 117 Rezoluce v PL1 Formule literál í J» pozitivní literál = atomická formule p(t1, • • • ,tn) & negativní literál = negace atomické formule -p(t1, • • • ,tn) Hana Rudová, Logické programování I, lS. kvetna ZClZ llS Rezoluce v PLl Formule literál í J» pozitivní literál = atomická formule p(t1, • • • ,tn) & 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í D a je vždy nepravdivá (neexistuje v ní pravdivý literál) Hana Rudová, Logické programování I, lS. kvetna ZClZ llS Rezoluce v PLl 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 pří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í) pří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, 18. kvetna 2012 118 Rezoluce vPL1 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ý 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, 18. kvetna 2012 118 Rezoluce vPL1 Formule literál l s* pozitivní literál = atomická formule p(t1, • • • ,tn) s* negativní literá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 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}} A formule je pravdivá <=> všechny klauzule jsou pravdivé 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, 18. kvetna 2012 118 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-l} u C2 klauzuli C1 u C2 Ci u jl} {-l} u C2 Ci u C2 & C1 u C2 se ňazývá rezolventou původních klauzulí Hana Rudová, Logické programování I, 18. kvetna 2012 119 Rezoluce vPL1 Rezoluční princip ve výrokové logice Rezoluční princip = pravidlo, které umožňuje odvodit z klauzulí C1 u jí} a { —l} u C2 klauzuli C1 u C2 Ci u jl} { —l} u C2 Ci u C2 C1 u C2 se ňazývá rezolventou puvodňích klauzulí příklad: jp,r} j—r,s} (p v r) a (—r v 5) p v 5 Hana Rudová, Logické programování I, 18. kvetna 2012 119 Rezoluce v PL1 Rezolucní princip ve výrokové logice Rezolucní princip = pravidlo, které umožnuje odvodit z klauzulí Cl u {í} a {-í} u C2 klauzuli Cl u C2 Cl u {í} {-í} u C2 Cl u C2 Cl 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, lS. kvetna 2Cl2 ll9 Rezoluce v PLl 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, 18. kvetna 2012 120 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, lS. kvetna 2Cl2 l2C Rezoluce vPLl Rezoluční důkaz rezoluční důkaz klauzule C z formule F je konečná posloupnost C\,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezoluční dukaz {p} z formule F = {{p,r}, {q, -r}, {-q}} C\ = {p,r} klauzule z F Hana Rudová, Logičké programování I, 18. kvetna 2012 120 Rezoluče 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. & pří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 Hana Rudová, Logické programování I, 18. kvetna 2012 120 Rezoluce vPL1 Rezolucní důkaz rezolucní 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}} Ci = {p,r} klauzule z F C2 = {q, -r} klauzule z F C3 = {p, q} rezolventa Ci a C2 Hana Rudová, Logické programování I, 18. kvetna 2012 120 Rezoluce vPL1 Rezoluční důkaz rezoluční 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, 18. kvetna 2012 120 Rezoluce v PL1 Rezoluční důkaz rezoluční důkaz klauzule C z formule F je konečná posloupnost C\,...,Cn = C klauzulí taková, že Ci je bud' klauzule z F nebo rezolventa Cj, Ck pro k,j < i. & príklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, -r}, {-q}} C\ = {p,r} klauzule z F C2 = {q, -r} klauzule z F C3 = {p, q} rezolventa C\ a C2 C4 = {-q} klauzule z F C5 = {p} = C rezolventa C3 a C4 Hana Rudová, Logičké programování I, 18. kvetna 2012 120 Rezoluče 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, 18. kvetna 2012 121 Rezoluce v PL1 Substituce 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 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 "E)i substituované termy príklad: p(X)[X/f(a)] = p(f(a)) Hana Rudová, Logické programování I, 18. kvetna 2012 121 Rezoluce v PL1 Substituce JS> čo 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 -i* substituče je libovolná funkče 9 zobrazujíčí 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ý funkční symbol f -i* 9(p(E1, • • • ,En)) = p(9(E1), • • • , 9(En)) pro libovolný predik. symbol p JS> substituče je tedy homomorfismus výrazů, který začhová vše krome promennýčh - ty lze nahradit čímkoliv -i* substituče 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)) & přejmenování promennýčh: spečiální náhrada promennýčh promennými príklad: p(X)[X/Y] = p(Y) Hana Rudová, Logičké programování I, 18. kvetna 2012 121 Rezoluče 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, 18. kvetna 2012 122 Rezoluce vPL1 Unifikace Ztotožnení dvou literálu p, q pomocí vhodné substituce a takové, že pa = qa nazýváme unifikací a příslušnou substituci unifikátorem. & Unifikátorem množiny S literál u nazýváme substituce 0 takovou, že množina se = {t0it g s} má jediný prvek. pří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, 18. kvetna 2012 122 Rezoluce 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ál u 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 ) } & 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, 18. kvetna 2012 122 Rezoluce v PL1 Unifikace C 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 ) } & 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. a príklad (pokrac.): nejobecnejší unifikátor a = [D1/1, Y2/2003, M1/M2], Hana Rudová, Logické programování I, 18. kvetna 2012 122 Rezoluce v PL1 Unifikace 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ál u 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. príklad (pokrač.): nejobečnejší unifikátor a = [D1/1, Y2/2003, M1/M2], A=[M2/2] Hana Rudová, Logičké programování I, 18. kvetna 2012 122 Rezoluče v PL1 Rezolucní princip v PL1 základ: & rezolucní princip ve výrokové logice----- Ci u C2 Jť substituce, unifikátor, nejobecnejší unifikátor Hana Rudová, Logické programování I, 18. kvetna 2012 123 Rezoluce vPL1 Rezolucní princip v PL1 základ: & rezolucní princip ve výrokové logice----- Ci 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 Hana Rudová, Logické programování I, 18. kvetna 2012 123 Rezoluce v PL1 Rezolucní princip v PL1 základ: Ä l.....i- li C1 u{l} {—l}u C2 & 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, 18. kvetna 2012 123 Rezoluce v PL1 Príklad: rezoluce v PL1 C príklad: C = {p(X,Y), q(Y)} C2 = {—q(a), s(X,W)} Hana Rudová, Logické programování I, 18. kvetna 2012 124 Rezoluce vPL1 Príklad: rezoluce v PLI příklad: C1 = {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)} Hana Rudová, Logické programování I, 18. kvetna 2012 124 Rezoluce vPL1 Príklad: rezoluce v PLI příklad: C1 = {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)} Hana Rudová, Logické programování I, 18. kvetna 2012 124 Rezoluce vPL1 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)} 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)} Hana Rudová, Logické programování I, 18. kvetna 2012 124 Rezoluce v PL1 Príklad: rezoluce v PLI 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)} 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, 18. kvetna 2012 124 Rezoluce v PL1 Rezoluce v PL1 Obecný rezolucní princip v PL1 Ci u {Ai, • • • ,Am} {—Bi, • • • , —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} Hana Rudová, Logické programování I, 18. kvetna 2012 125 Rezoluce v PL1 Rezoluce v PLI 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 Hana Rudová, Logické programování I, 18. kvetna 2012 125 Rezoluce v PL1 Rezoluce v PLI Obecný rezoluCní princip v PL1 Ci u {Ai, • • • ,Am} {-Bi, • • • , -Bn} u C2 Cipa 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 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, 18. kvetna 2012 125 Rezoluce v PL1 Zefektivnení rezoluče 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 Hana Rudová, Logičké programování I, 18. kvetna 2012 126 Rezoluče v PL1 Zefektivnení rezoluče 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, 18. kvetna 2012 126 Rezoluče vPL1 Zefektivnení rezoluce C rezoluce je intuitivne efektivnejší než axiomatické systémy a axiomatické systémy: který z axiomu a pravidel použít? a rezoluce: pouze jedno pravidlo stále ale príliš mnoho možností, jak hledat dukaz v prohledávacím prostoru C- problém SAT= {S|S je splnitelná } NP úplný, nicméne: menší prohledávací prostor vede k rychlejšímu nalezení rešení & strategie pro zefektivnení prohledávání => varianty rezolucní metody & vylepšení prohledávání a zastavit prohledávání cest, které nejsou slibné & specifikace poradí, jak procházíme alternativními cestami Hana Rudová, Logické programování I, 18. kvetna 2012 126 Rezoluce 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, 18. kvetna 2012 127 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á Hana Rudová, Logičké programování I, 18. kvetna 2012 127 Rezoluče 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á 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, 18. kvetna 2012 127 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á 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 vstupní (input) rezoluče: neúplná alespon jedna z klauzulí, použitá pri rezoluči, je z výčhozí vstupní množiny S Hana Rudová, Logičké programování I, 18. kvetna 2012 127 Rezoluče 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 neporrmže ukázat, že formule je nesplnitelná JS> 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 JS> vstupní (input) rezoluce: neúplná alespon jedna z klauzulí, použitá pri rezoluci, je z výchozí vstupní množiny S {{p,q}, {—p,q}, {p, —q}, {—p, —q}} existuje rezolucní vyvrácení neexistuje rezolucní vyvrácení pomocí vstupní rezoluce Hana Rudová, Logické programování I, 18. kvetna 2012 127 Rezoluce v PL1 Rezoluče a logičké 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 bezprostredne predcházející rezolventu a k tomu bud' nekterou z klauzulí vstupní množiny S nebo nekterou z predcházejících rezolvent c0^b0 c2 b2 c Hana Rudová, Logické programování I, 18. kvetna 2012 129 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 Pravidlo: jeden pozitivní a alespon jeden negativní literál Prolog: H : - T1, ■ ■ ■ ,Tn. Hana Rudová, Logické programování I, 18. kvetna 2012 131 Rezoluce a logické programování Prologovská notace -i* Klauzule v matematické logice {Hl, ■■■ ,Hm, —Tl, ■■■ , —Tn} Hl 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 — Tl v ■ ■ ■ v — Tn H —Tl v ■ ■ ■ v — Tn Pravidlo: jeden pozitivní a alespon jeden negativní literál & Prolog: H : - Tl, ■ ■ ■ ,Tn. Matematická logika: H <= Tl a ■ ■ ■ a Tn Hana Rudová, Logické programování I, 18. kvetna 2012 131 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice {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 -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál j* Prolog: H : - Ti, ■ ■ ■ ,Tn. Matematická logika: H <= Ti a ■ ■ ■ a Tn H <= T Hana Rudová, Logické programování I, 18. kvetna 2012 131 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 Hana Rudová, Logické programování I, 18. kvetna 2012 131 Rezoluce a logické programování Prologovská notace & Klauzule v matematické logice {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 -i* Pravidlo: jeden pozitivní a alespon jeden negativní literál j* Prolog: H : - Ti, ■ ■ ■ ,Tn. Matematická logika: H <= Ti a ■ ■ ■ a Tn m» H <= T H V-T H v -Ti v ■ ■ ■ v-Tn Hana Rudová, Logické programování I, 18. kvetna 2012 131 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} Hana Rudová, Logické programování I, 18. kvetna 2012 131 Rezoluce a logické programování Prologovská notaCe -i* Klauzule v matematické logice {Hl, - ,Hm,-Tl, - ,-Tn} Hl v--- v Hm v -Tl v - - - v - Tn ü> Hornova klauzule: nejvýše jeden pozitivní literál {H,-Ti,...,-Tn} {H} {-Ti,...,-Tn} a H v -Tl v - - - v -Tn H -Tl v - - - v -Tn Pravidlo: jeden pozitivní a alespon jeden negativní literál & Prolog: H : - Tl, - - - ,Tn. Matematická logika: H <= Tl a - - - a Tn m» H <= T H v-T H v -Tl v - - - v-Tn Klauzule: {H,-Tl,..., -Tn} Fakt: pouze jeden pozitivní literál Prolog: H. Matematická logika: H Klauzule: {H} Hana Rudová, Logické programování I, 18. kvetna 2012 131 Rezoluce a logické programování Prologovská notače & Klauzule v matematičké logiče {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 JS> Pravidlo: jeden pozitivní a alespon jeden negativní literál j* Prolog: H : - T1, • • • ,Tn. Matematičká logika: H <= T1 a • • • a Tn m» H <= T H v-T H v-T1 v • • • v -Tn Klauzule: {H,-T1,..., -Tn} -í* Fakt: pouze jeden pozitivní literál Prolog: H. Matematičká logika: H Klauzule: {H} & Cílová klauzule: žádný pozitivní literál j* Prolog: : - T1,... Tn. Matematičká logika: -T1 v • • • v -Tn Klauzule: {-T1, • • • -Tn} Hana Rudová, Logičké programování I, 18. kvetna 2012 131 Rezoluče a logičké 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, 18. kvetna 2012 132 Rezoluce a logické programování Logický program Programová klauzule: práve jeden pozitivní literál (fakt nebo pravidlo) Logičký program: konečná množina programovýčh klauzulí Príklad: a logičký program jako množina klauzulí: P = {Pl,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, 18. května 2012 132 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule & Zacneme s cílovou klauzulí: Co = G ií> Bocní klauzule vybíráme z programových klauzulí P M G = {-q,-p} P ={Pi,P2,P3} : Pi = {p}, P2 = {p, -q}, P3 = {q} : -q, p. p. p : -q, q. Hana Rudová, Logické programování I, 18. kvetna 2012 133 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule St Zacneme s cílovou klauzulí: Co = G St Bocní klauzule vybíráme z programových klauzulí P 3 G = {-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, 18. kvetna 2012 133 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule Zacneme s cílovou klauzulí: C0 = G Bocní klauzule vybíráme z programových klauzulí P G = {-q,-p} P = {Pi,P2,Pb} : Pi = {p}, P2 = {p, -q}, P3 = {q} : -q,p. p. p: -q, q. {^p} {p} {^q} {q} □ □ Hana Rudová, Logické programování I, 18. kvetna 2012 133 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, 18. kvetna 2012 133 Rezoluce a logické programování Lineární vstupní rezoluce Vstupní rezoluce 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í: C0 = G & bocní klauzule jsou vždy z P (tj. jsou to programové klauzule) Hana Rudová, Logické programování I, 18. kvetna 2012 134 Rezoluce a logické programování Lineární vstupní rezoluce Vstupní rezoluce na P u {G} -i* (opakování:) alespoň jedna z klauzulí použitá př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) (Opakování:) Lineární rezolucní dukaz C z P je posloupnost dvojic (Co,Bo>, ... (Cn,Bn) taková, že C = Cn+i a k 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 Hana Rudová, Logické programování I, 18. kvetna 2012 134 Rezoluce a logické programování Lineární vstupní rezoluce & Vstupní rezoluce 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 s* bocní klauzule jsou vždy z P (tj. jsou to programové klauzule) JS* (Opakování:) Lineární rezolucní dukaz C z P je posloupnost dvojic (Co,Bo>, ... (Cn,Bn) taková, že C = Cn+1 a k C0 a každá Bi jsou prvky P nebo nekteré Cj,j < i S» každá Ci+1, i < n je rezolventa Ci a Bi Lineární vstupní (Linear Input) rezoluce (LI-rezoluce) C z P u {G} posloupnost dvojic (C0,B0>, ... (Cn,Bn> taková, že C = Cn+1 a a C0 = G a každá Bi jsou prvky P lineární rezoluce + vstupní rezoluce a každá Ci+1, i < n je rezolventa Q a Bi Hana Rudová, Logické programování I, 18. kvetna 2012 134 Rezoluce a logické programování Cíle a fakta pri lineární rezoluči 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, 18. kvetna 2012 135 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, 18. kvetna 2012 135 Rezoluce a logické 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 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, 18. kvetna 2012 135 Rezoluce a logické programování Cíle a fakta p ř i lineární rezoluci & Veta: Je-li S nesplnitelná množina Hornových klauzulí, pak S obsahuje alespoň 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 & 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 -fc 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, 18. kvetna 2012 135 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, 18. kvetna 2012 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í! Hana Rudová, Logičké programování I, 18. kvetna 2012 136 Rezoluče a logičké 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í! & Význam LI-rezoluce pro Hornovy klauzule: i* P = {P1, . . . , Pn}, G = {G1 ,...,Gm} iľ LI-rezolucí ukážeme nesplnitelnost P1 a ■ ■ ■ a Pn a (-G1 v ■ ■ ■ v -Gm) Hana Rudová, Logické programování I, 18. kvetna 2012 136 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í! & Význam LI-rezoluce pro Hornovy 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 předpoklá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, 18. kvetna 2012 136 Rezoluce a logické programování Uspo rádané klauzule (definite clauses) JS> Klauzule = množina literálu JS> Usporádáná klauzule (definite clause) = posloupnost literálů it nelze volne menit poradí literálu ü> Rezolucní princip pro uspo rádané klauzule: _{— Ao,—An}_{B, —Bo,— Bm}_ {—Ao,—Ai-l, —Bop,—Bmp,—Ai+l,—An}a M uspo rádaná rezolventa: {—Ao,—Ai-l, —Bop,—Bmp,—Ai+l,—An}a it p je prejmenování promenných takové, že klauzule {Ao,.. .,An} a {B,Bo,.. .,Bm}p nemají spolecné promenné & a je nejobecnejší unifikátor pro Ai a Bp Hana Rudová, Logické programování I, 18. kvetna 2012 137 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,—At+i,—An}v M uspořádaná řezolventa: {-Aq, -Ai-1, -B0p,—Bmp,—Ai+1,-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 -í* řezoluceje řealizována na liteřálech —Aia a Bpa je dodržováno poradí literálu, tj. {-B0p,—Bmp}a jde do uspořádané řezolventy přesne na pozici —Aia Hana Rudová, Logické programování I, 18. kvetna 2012 137 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},(Gn, Cn) taková, že a Gí,Cíjsou usporádané klauzule G = Go Gn+ 1 = n a Gi je usporádaná cílová klauzule Jt Ci je prejmenování klauzule z P Ci neobsahuje promenné, které jsou v Gj, j < i nebo v Ck,k < i J» Gi+1,0 < i < n je usporádaná rezolventa Gi a Ci Hana Rudová, Logické programování I, 18. kvetna 2012 139 Rezoluce a logické programování LD-rezoluče -í* LD-rezoluční vyvráčení množiny usporádanýčh klauzulí P u {G} je posloupnost (Go, C0),(Gn, Cn) taková, že a Gi,Cijsou uspořádané klauzule G = Go a Gi je usporádaná čílová klauzule a Ci je prejmenování klauzule z P Ct neobsahuje promenné, které jsou v Gj, j < i nebo v Ck,k < i J» Gi+i, 0 < i < n je usporádaná rezolventa Gt a Ct & LD-rezoluče: korektní a úplná Hana Rudová, Logičké programování I, 18. kvetna 2012 139 Rezoluče a logičké programování SLD-rezoluce * Lineární rezoluce se selekCním pravidlem = SLD-rezoluce (Selected Linear resolution for Definite clauses) J» rezoluce & SelekCní pravidlo J* Lineární rezoluce a Definite (uspořádané) klauzule a vstupní rezoluce Hana Rudová, Logické programování I, 18. května 2012 140 Rezoluce a logické programování SLD-rezoluce * Lineární rezoluce se selekCním pravidlem = SLD-rezoluce (Selected Linear resolution for Definite clauses) J» rezoluce & SelekCní pravidlo J* Lineární rezoluce a Definite (uspořádané) klauzule a vstupní rezoluce -i* SelekCní pravidlo R je funkce, která každé neprázdné klauzuli C prirazuje nejaký z jejích literal u R(C) g C -i- pri rezoluci vybírám z klauzule literal urcený selekcním pravidlem Hana Rudová, Logické programování I, 18. kvetna 2012 140 Rezoluce a logické programování SLD-rezoluce JS> 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 & Pokud se R neuvádí, pak se predpokládá výber nejlevejšího literálu nejlevejší literál vybírá i Prolog Hana Rudová, Logické programování I, 18. kvetna 2012 140 Rezoluce a logické programování Lineární rezoluče se selekčním pravidlem p = {{p}, {p, -q}, {q}}, g = {-q,-p} {^q,^pj {q} {^q,^p} (pI výber j výber | y/ nejlevejšího {^P} Jp} nejpravejšího Jq} literálu ' / literálu ' ^ □ □ Hana Rudová, Logičké programování I, 18. kvetna 2012 141 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 ' ^ □ □ SLD-rezolucní vyvrácení P u {G} pomocí selekcního pravidla R je LD-rezolucní vyvrácení (G0,C0>,(Gn,Cn> takové, že G = G0,Gn+1 = □ a R(Gi) je literál rezolvovaný v kroku i Hana Rudová, Logické programování I, 18. kvetna 2012 141 Rezoluce a logické programování Lineární rezoluce se selekcním pravidlem JS> SLD-rezolucní vyvrácení P u {G} pomocí selekcního pravidla R je LD-rezolucní vyvrácení (G0,C0>,(Gn,Cn> takové, že G = G0,Gn+1 = □ 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, 18. kvetna 2012 141 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, 18. května 2012 142 Rezoluce a logické programování Strom výpoctu (SLD-strom) SLD-strom 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, 18. kvetna 2012 143 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 logického programu P vzhledem k cíli G korenem stromu je cílová klauzule G v uzlech stromu jsou rezolventy (rodiče uzlu a programové klauzule) & císlo vybrané programové klauzule pro rezoluci je v príkladu uvedeno jako ohodnocení hrany listy jsou dvojího druhu: a oznacené prázdnou klauzulí - jedná se o úspešné uzly (succes nodes) *> oznacené neprázdnou klauzulí - jedná se o neúspešné uzly (failure nodes) Hana Rudová, Logické programování I, 18. kvetna 2012 143 Rezoluce a logické programování Strom výpočtu (SLD-strom) SLD-strom je strom tvorený všemi možnými výpocetními posloupnostmi logického programu P vzhledem k cíli G korenem stromu je cílová klauzule G v uzlech stromu jsou rezolventy (rodice uzlu a programové klauzule) Jt císlo vybrané programové klauzule pro rezoluci je v príkladu uvedeno jako ohodnocení hrany listy jsou dvojího druhu: Jt oznacené prázdnou klauzulí - jedná se o úspešné uzly (succes nodes) *> 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, 18. kvetna 2012 143 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, 18. května 2012 144 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/1] a [Z/2] nezajímá me substituce [Y/2] Hana Rudová, Logické programování I, 18. kvetna 2012 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] Hana Rudová, Logické programování I, 18. kvetna 2012 145 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árí novou unifikacní substituci Qi ^ potenciální instanciace promenné ve vstupní cílové klauzuli & Výsledná substituce (answer substitution) Q = QqQi • • • Qn složení unifikací Hana Rudová, Logické programování I, 18. kvetna 2012 145 Rezoluce a logické programování Význam SLD-rezolučního vyvráčení P u {G} M Množina P programových klauzulí, cílová klauzule G & Dokazujeme nesplnitelnost (1) P A (VX)(-Gi(X) v -Gz(X) v - -- v -Gn(X)) kde G = { — Gi, —G2, - - - , — Gn} a X je vektor proměnných v G Hana Rudová, Logické programování I, 18. kvetna 2012 146 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 proměnný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, 18. kvetna 2012 146 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)(-Gi(X) v -Gz(X) v ■ ■ ■ v -Gn(X)) kde G = {-Gi, — 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)(Gi(X) a —a Gn(XÍ)) a jedná se tak o dukaz existence vhodných objektu, které na základe vlastností množiny P splnují konjunkci literálů v cílové klauzuli Hana Rudová, Logické programování I, 18. kvetna 2012 146 Rezoluce a logické programování Význam SLD-rezolučního vyvráčení P u {G} M Množina P programových klauzulí, cílová klauzule G & Dokazujeme nesplnitelnost (1) P a (VX)(—Gi(X) v —G2(X) v - - - v —Gn(X)) kde G = { — Gi, —G2, - - - , — Gn} a X je vektor proměnných v G nesplnitelnost (1) je ekvivalentní tvrzení (2) a (3) (2) P v- —G (3) P v (3X)(Gi(X) A--- A Gn(X)) a jedná se tak o dukaz existenče vhodnýčh objektů, které na základe vlastností množiny P splnují konjunkci literálů v cílové klauzuli Dukaz nesplnitelnosti P u {G} znamená nalezení protipríkladu ten pomocí SLD-stromu konstruuje termy (odpoveď) splnující konjunkci v (3) Hana Rudová, Logické programování I, 18. kvetna 2012 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 Hana Rudová, Logičké programování I, 18. kvetna 2012 147 Rezoluče a logičké 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, 18. kvetna 2012 147 Rezoluče a logičké programování Výpocetní strategie Korektní výpocetní strategie 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 = prohledávání stromu do šírky & exponenciální pamet'ová nárocnost a složité rídící struktury JS> Použitelná výpocetní strategie = prohledávání stromu 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, 18. kvetna 2012 147 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, 18. kvetna 2012 148 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)). by vedl k: [B/X], [X/f(X)] Unifikátor pro g(X1, ...,Xn) a g(f(Xo,Xo),f(X1,Xx),.. .,f(Xn-1,Xn-1)) X1 = f(Xo,Xo), X2 = f(X1,X\),..., 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, 18. kvetna 2012 149 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)). by vedl k: [B/X], [X/f(X)] & Unifikátor pro g(Xi, ...,Xn) a g(f(Xo,Xo),f(Xl,Xl),.. .,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á => exponenčiální složitost na overení kontroly výskytu & Test výskytu se pri unifikači 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, 18. kvetna 2012 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í Hana Rudová, Logické programování I, 18. kvetna 2012 150 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). : -t. p(X,f(X)). yes dokazovací systém nehledá unifikátor pro X a f(X) Hana Rudová, Logické programování I, 18. kvetna 2012 150 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(Xf(X)). yes dokazovačí systém nehledá unifikátor pro X a f(X) ii> Rešení: problém typu (2) prevést na problém typu (1) ? Hana Rudová, Logičké programování I, 18. kvetna 2012 150 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) p(X,f(X)). : -t. yes dokazovací systém nehledá unifikátor pro X a f(X) Řeš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 Řudová, Logické programování I, 18. kvetna 2012 150 Řezoluce a logické programování SLD-rezoluce v Prologu: korektnost Implementace SLD-rezoluce v Prologu nepoužívá při 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) 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. a optimalizace v kompilátoru mohou způsobit opet odpoved' „yes" Hana Řudová, Logické programování I, 18. kvetna 2012 150 Řezoluce 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, 18. kvetna 2012 151 Rezoluce a logické programování Řízení implementace: rez řez 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 => přeskocím řez a pokracuji jako by tam řez 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, 18. kvetna 2012 151 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 neuspeji (a tedy i pri backtrackingu) a vracím se pres rez => vracím se až na rodice : -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 orezání Hana Rudová, Logické programování I, 18. kvetna 2012 151 Rezoluce a logické programování Príklad: rez t: -p,r. t: -s. p : -q(X), \,v, p : -u,w. q(a). q(b). s. u. (1) (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, 18. kvetna 2012 152 Rezoluce a logické programování a(X) : -b(X, Y),\,c(Y) a(X) : -c(X). b(2, 3). b(1,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, 18. kvetna 2012 153 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, 18. kvetna 2012 154 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 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. Hana Rudová, Logické programování I, 18. kvetna 2012 156 Sémantiky Operační sémantika Operační sémantikou logičkého programu P rozumíme množinu O(P) všečh atomičkýčh formulí bez promennýčh, které lze pro nejaký číl g1 odvodit nejakým rezolučním dukazem ze vstupní množiny P u {g}. Hímto výrazem jsou míneny všečhny číle, pro než zmínený rezoluční dukaz existuje. iS* Deklarativní sémantika logičkého programu P ??? Hana Rudová, Logičké programování I, 18. kvetna 2012 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 := " + " Hana Rudová, Logické programování I, 18. kvetna 2012 157 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 := " + " 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, 18. kvetna 2012 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 Hana Rudová, Logické programování I, 18. kvetna 2012 158 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 Herbrandovo univerzum: množina všech termů bez promenný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 ti, • • • ,tn priradí term f(tl, • • • ,tn) J* predikátovým symbolům libovolnou funkci z Herbrand. univerza do pravdivostních hodnot Hana Řudová, Logické programování I, 18. kvetna 2012 158 Sémantiky Herbrandovy interpretače Omezení na obor skládajíčí se ze symboličkýčh výrazu tvorenýčh z predikátovýčh a funkčníčh symbolu daného jazyka iť pri zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretačemi JS> Herbrandovo univerzum: množina všečh termů bez promennýčh, které mohou být tvoreny funkčními symboly a konstantami daného jazyka i* promenným prvky Herbrandova univerza Jť konstantám sebe samé & funkčním symbolům funkče, které symbolu f pro argumenty t\, • • • ,tn priradí term f(t\, • • • ,tn) J* predikátovým symbolům libovolnou funkči z Herbrand. univerza do pravdivostníčh hodnot & Herbranduv model množiny uzavrenýčh formulí P: Herbrandova interpretače taková, že každá formule z P je v ní pravdivá. prirazuje Hana Rudová, Logičké programování I, 18. kvetna 2012 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 Hana Rudová, Logičké programování I, 18. kvetna 2012 159 Sémantiky Specifikace Herbrandova modelu C Herbrandovy interpretace mají preddefinovaný význam funktom 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, 18. kvetna 2012 159 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 11 = 0 není model (1) Hana Rudová, Logické programování I, 18. kvetna 2012 159 Sémantiky Spečifikače 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 1\ = 0 není model (1) a 12 = {lichy(s(0))} není model (2) Hana Rudová, Logické programování I, 18. kvetna 2012 159 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) i3 = {lichy(s(0)), lichy(s(s(s(0))))} není model (2) Hana Řudová, Logické programování I, 18. kvetna 2012 159 Sémantiky Specifikace Herbrandova modelu C Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant -í* Pro specifikaci Herbrandovy interpretace tedy stací zadat relace pro každý predikátový symbol & Příklad: Herbrandova interpretace a Herbranduv model množiny formulí 1ichy(s(0)). % (1) 1ichy(s(s(X))) :- lichy(X). % (2) a ii = 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 {i, 3, 5, 7,...}} Herbranduv model (1) i (2) Hana Rudová, Logické programování I, 18. kvetna 2012 159 Sémantiky Specifikace Herbrandova modelu Herbrandovy interpretace mají preddefinovaný význam funktom 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(G)). % (1) 1ichy(s(s(X))) i- 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, S, Z,...}} Herbranduv model (1) i (2) is = (lichy(sn(0))\n g N}} Herbranduv model (1) i (2) Hana Rudová, Logické programování I, 18. kvetna 2012 159 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 Řudová, Logické programování I, 18. kvetna 2012 160 Sémantiky Prí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í Cvicení: Napište minimální Herbranduv model pro následující logický program. muz(petr). muz(pavel). zena(olga). zena(jitka). pary(X,Y) :- zena(X), muz(Y). Uved'te další model tohoto programu, který není minimální. Hana Rudová, Logické programování I, 18. kvetna 2012 160 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 prunik techto modelu je opet Herbrandův model množiny S. JS> Dusledek: Existuje nejmenší Herbranduv model množiny S, který znacíme M(S). Hana Řudová, Logické programování I, 18. kvetna 2012 161 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 Rudová, Logické programování I, 18. kvetna 2012 161 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í Herbranduv model M(P). & Pripomenutí: 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. Hana Řudová, Logické programování I, 18. kvetna 2012 161 Sémantiky a operační sémantika ii> Je-li S množina programovýčh klauzulí a M libovolná množina Herbrandovýčh modelu S, pak prunik tečhto modelu je opet Herbrandův model množiny S. JS> Dusledek: Existuje nejmenší Herbranduv model množiny S, který značíme M(S). -á* Deklarativní sémantikou logičkého programu P rozumíme jeho minimální Herbrandův model M(P). & Pripomenutí: Operační sémantikou logičkého programu P rozumíme množinu O(P) všečh atomičkýčh formulí bez promennýčh, které lze pro nejaký číl G1 odvodit nejakým rezolučním dukazem ze vstupní množiny P u {Q}. Hímto výrazem jsou míneny všečhny číle, pro než zmínený rezoluční důkaz existuje. -i* Pro libovolný logičký program P platí M(P) = O(P) Hana Rudová, Logičké programování I, 18. kvetna 2012 161 Sémantiky Negace v logickém programování Negativní znalost JS> logické programy vyjadrují pozitivní znalost negativní literá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, 18. kvetna 2012 163 Negace v logickém programování Negativní znalost JS> logické programy vyjadřují pozitivní znalost negativní literá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 & relace vyjádřeny 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ší Herbranduv model: {na(b,a),na(c, b),nad(b,a),nad(c, b),nad(c,a)} Hana Rudová, Logické programování I, 18. kvetna 2012 163 Negace v logickém programování Negativní znalost JS> logické programy vyjadrují pozitivní znalost negativní literály: pozice urcena definicí Hornových klauzulí => nelze vyvodit negativní informaci z logického programu j> 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 it 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 S* a není nad c, a není na c Jt i v realite je negativní informace vyjadrena explicitne zrídka, napr. jízdní rád Hana Rudová, Logické programování I, 18. kvetna 2012 163 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, 18. kvetna 2012 164 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) —A pro SLD-rezoluci: P ^ nad(a,c), tedy lze podle CWA odvodit —nad(a,c) Hana Rudová, Logické programování I, 18. kvetna 2012 164 Negace v logickém programování Předpoklad uzavřeného světa C neexistence informace chápána jako opak: předpoklad uzavřeného světa (closed world assumption, CWA) -í* převzato 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, 18. kvetna 2012 164 Negace v logickém programování Negace jako neúspech (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) normální cíl: cíl obsahující i negativní literály -í* : -nad(c,a), -nad(b,c). Hana Rudová, Logické programování I, 18. kvetna 2012 165 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ý A existuje odvození cíle podle CWA, protože neexistuje vyvrácení: -nad(b,c) Hana Rudová, Logické programování I, 18. kvetna 2012 165 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á definitivne (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 3 rešení: definovat programy tak, aby jejich dusledkem byly i negativní literály zúplnení logického programu Hana Rudová, Logické programování I, 18. kvetna 2012 165 Negace v logickém programování Podstata zúplnení logičkého programu prevod všečh if príkazů v logičké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á, Logičké programování I, 18. kvetna 2012 166 Negače v logičkém programování Podstata zúplnení logického programu převod všech if pří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 Hana Rudová, Logické programování I, 18. kvetna 2012 166 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). J* 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)). S» X je nad Y práve tehdy, když alespon jedna z podmínek platí Jt 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) : -X1 = c,X2 = b. na(X1,X2) : -X1 = b,X2 = a. J* zúplnení: na(X1,X2) (X1 = c,X2 = b) v (X1 = b,X2 = a). Hana Rudová, Logické programování I, 18. kvetna 2012 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 Hana Rudová, Logické programování I, 18. kvetna 2012 167 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 přidá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, 18. kvetna 2012 167 Negace v logickém programování IF(q, P) na(Xi,X2) : -3Y(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é" proměnné, 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 oznacme E(C) výraz 3Y1,Yk(X1 = t1,...,Xn = tn,L1,... ,Lm) kde Y1,...,Yk jsou všechny proměnné v C. Hana Rudová, Logické programování I, 18. kvetna 2012 168 Negace v logickém programování IF(q, P) na(X1,X2) : -3 YX = c,X2 = b, f (Y)) v X = 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, 18. kvetna 2012 168 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: Xl = Yl a • • • a Xm = Ym - /(Xi,...,Xm) = f(Yl,...,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(Xif... ,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 Řudová, Logické programování I, 18. kvetna 2012 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)) Hana Rudová, Logické programování I, 18. kvetna 2012 170 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 Jt 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, 18. kvetna 2012 170 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á definitivne 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 např. v Prologu: muže existovat konecné odvození, ale program přesto 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, 18. kvetna 2012 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 Jt p : -—p. zúplnení: p — —p M rozdelení programu na vrstvy j* vynucují použití negace relace pouze tehdy pokud je relace úplne definovaná Hana Rudová, Logické programování I, 18. kvetna 2012 171 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, 18. kvetna 2012 171 Negače v logičké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ý Hana Rudová, Logické programování I, 18. kvetna 2012 171 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 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ý & 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 a p(...) : - ..., —q(...),... g P, p g Sk => q g S0 u ... u Sk-1 Hana Rudová, Logické programování I, 18. kvetna 2012 171 Negace v logickém programování Stratifikované programy II program je m-stratifikovaný <^> m je nejmenší index takový, že So 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, 18. kvetna 2012 172 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. Jt p : - — p. nemá Herbrandův model Jt p : - — p. ale není stratifikovaný & stratifikované programy nemusí mít jedinecný 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á, Logické programování I, 18. května 2012 172 Negace v logickém programování SLDNF rezoluce: úspešné 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 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, 18. kvetna 2012 173 Negace v logickém programování C NF pravidlo: -í* 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 konečne neúspešný), pak je odvození G (i —C) čelkove ú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 => úspešné odvození Hana Rudová, Logické programování I, 18. května 2012 173 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, 18. kvetna 2012 174 Negace v logickém programování JS> 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 konečně úspěš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, 18. kvetna 2012 174 Negace v logickém programování SLDNF rezoluce: 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 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) : - — blokovany(X). blokovany(X) : -na(Y,X). na(a, b). Hana Rudová, Logické programování I, 18. kvetna 2012 175 Negace v logickém programování SLDNF rezoluče: uvázlé odvození C NF pravidlo: : - C. má konečne neúspešný SLD-strom ——C -í* Pokud máme negativní podčíl —C v dotazu G, pak hledáme dukaz pro C & Pokud existuje vyvráčení C s neprázdnou substitučí (strom pro C je konečne ú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á, Logičké programování I, 18. kvetna 2012 175 Negače v logičkém programování Cvičení: SLDNF odvození Napište množinu SLDNF odvození pro uvedený dotaz. :- a(B). a(X) :- b(X), \+ c(X). a(X) :- d(X), Y is X+1, \+ c(Y), b(X). b(1). c(A) :- d(A). d(1). Hana Rudová, Logické programování I, 18. kvetna 2012 176 Negace v logickém programování SLD+ odvození P je normální program, Go normální cíl, R selekční pravidlo: SLD+-odvození G0 je bud' konečná posloupnost (Go;Co),..., (Gí-iiCf-i),Gi nebo nekonečná posloupnost (Go;Co), (Gi;Ci), (G2;C2),... kde v každém kroku m + i (m > o), R vybírá pozitivní literal v Gm a dospívá k Gm+i obvyklým způsobem. Hana Rudová, Logické programování I, 18. kvetna 2012 177 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 (Go; Co),..., (Gí-i; Ct-i), 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 zpusobem. muže být: 2. neúspešné 3. blokované: Gt je negativní (např. -A) Hana Rudová, Logické programování I, 18. kvetna 2012 177 Negace v logické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 tvarů -A blokují SLD+-odvození G0, je k ±> nekonečná úroven Hana Růdová, Logické programování I, 18. kvetna 2012 178 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, 18. kvetna 2012 178 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, 18. kvetna 2012 179 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 : - L\,..., Lm-i, —A, Lm+i,... ,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, 18. kvetna 2012 179 Negace v logickém programování SLDNF rezoluče P normální program, G0 normální cíl, R selekcní pravidlo: množina SLDNF odvození a podmnožina neúspešnýčh 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), ...,Gi blokováno na —A tj. Gi je tvaru : - L\,..., Lm-i, —A, Lm+i,... ,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í & je-li každé úplné SLDNF odvození: -A (pod R) neúspešné pak {G0; Co)i . . . ■> {Gii č)i (: - Lli . . . ■> Lm-li Lm+1> . . . ■> Ln) je (úspešné) SLDNF odvození číle G0 e oznacuje prázdnou cílovou substituci Hana Rudová, Logické programování I, 18. kvetna 2012 179 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, 18. kvetna 2012 180 Negace v logickém programování Korektnost a úplnost SLDNF odvození -í* korektnost SLDNF-odvození: P normální program, : -G normální cíl a R je selekční 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, 18. kvetna 2012 181 Negace v logické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 dusledkem comp(P) S implementace SLDNF v Prologu není korektní Prolog neřeší uvázlé SLDNF-odvození (neprázdná substituce) -i- použití bezpecných cílu (negace neobsahuje promenné) Hana Rudová, Logické programování I, 18. kvetna 2012 181 Negace v logické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 dusledkem comp(P) S implementace SLDNF v Prologu není korektní Jt Prolog nereší uvázlé SLDNF-odvození (neprázdná substituce) -i- použití bezpecných cílu (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, 18. kvetna 2012 181 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, 18. května 2012 183 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íčími podmínkami Hana Rudová, Logičké programování I, 18. kvetna 2012 184 Logičké programování s omezujíčími podmínkami Probírané oblasti M Obsah úvod: od LP k CLP & základy programování a základní algoritmy pro r ešení problémů s omezujícími podmínkami -í* Príbuzné p r ednáš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 r ešení rozvrhovacích problémů Hana Rudová, Logické programování I, 18. kvetna 2012 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 a omezuje hodnoty, kterých mohou promenné nabývat soucasne Hana Rudová, Logické programování I, 18. kvetna 2012 185 Logické programování s omezujícími podmínkami Omezení (constraint) JS> Dána a množina (doménových) promenných Y = ... koneCná množina hodnot (doména) D = {Di,... ,D^} Omezení c na Y je podmnožina Di x ... x a omezuje hodnoty, kterých mohou promenné nabývat soucasne Příklad: proměnné: A,B domény: {0,1} pro A {1,2} pro B omezení: nebo (A,B) G {(0,1),(0,2),(1,2)} Hana Rudová, Logické programování I, 18. kvetna 2012 185 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 a 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í ... dk) g c -i- príklad (pokracování): omezení splneno pro (0, i), (0, 2), (i, 2), není splneno pro (i, i) Hana Rudová, Logické programování I, 18. kvetna 2012 185 Logické programování s omezujícími podmínkami Problém splňování podmínek (CSP) C Dána it konečná množina proměnných X = {x1?... ,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) Hana Rudová, Logické programování I, 18. kvetna 2012 186 Logické programování s omezujícími podmínkami Problém splňování podmínek (CSP) C Dána it konečná množina proměnných X = [x\,... ,xn} it konečná množina hodnot (doména) D = [D\,... ,Dn} it konečná množina omezení C = [c\,cm} omezení je definováno na podmnožině X Problém splňová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, 18. kvetna 2012 186 Logické programování s omezujícími podmínkami Řešení CSP Řástečné ohodnočení promennýčh (di,dk),k < n s» nekteré promenné mají prirazenu hodnotu Úplné ohodnočení promennýčh (d1,dn) & všečhny promenné mají prirazenu hodnotu Hana Rudová, Logičké programování I, 18. kvetna 2012 187 Logičké programování s omezujíčími podmínkami Řešení CSP Cástecné ohodnocení promenných (d1,dk),k < n s* nekteré promenné mají prirazenu hodnotu Úplné ohodnocení promenných (di,dn) Jt všechny promenné mají prirazenu hodnotu Řešení CSP Jt úplné ohodnocení promenných, které splnuje všechna omezení s (d1dn) g D1 x ... x Dn je rešení (X, D, C) pro každé c g C na xii,...xik platí (dii,...dik) g a Hana Rudová, Logické programování I, 18. kvetna 2012 187 Logické programování s omezujícími podmínkami Řešení CSP ■v CásteCné ohodnocení promenných (di,dk),k < n s* nekteré promenné mají p ř i řazenu hodnotu Úplné ohodnocení promenných (di,dn) & všechny promenné mají p ř i řazenu hodnotu Řešení CSP -fc úplné ohodnocení promenných, které splnuje všechna omezení s (didn) g Di x ... x Dn je rešení (X, D, C) pro každé ci g C na xii,...xik platí (dii,...dik) g ci Hledáme: jedno nebo všechna řešení nebo optimální ř ešení (vzhledem k objektivní funkci) Hana Rudová, Logické programování I, 18. kvetna 2012 187 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í: all_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, 18. května 2012 188 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 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, 18. kvetna 2012 188 Logické programování s omezujícími podmínkami Príklad: jednoduchý školní rozvrh promenné: 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, 18. kvetna 2012 188 Logické programování s omezujícími podmínkami Prí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 nejd rí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, 18. kvetna 2012 188 Logické programování s omezujícími podmínkami Prí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 nejdrí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, 18. kvetna 2012 188 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í r ešení Hana Rudová, Logické programování I, 18. kvetna 2012 189 Logické programování s omezujícími podmínkami 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í & (1) a (2) deklarativní cást modelování problému a vyjádrení problému splnování podmínek Hana Rudová, Logické programování I, 18. kvetna 2012 189 Logické programování s omezující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 modelování problému a vyjád rení problému splnování podmínek (3) r ídící cást & prohledávání stavového prostoru r ešení a procedura pro hledání r ešení (enumeraci) se nazývá labeling a umožní nalézt jedno, všechna nebo optimální řešení Hana Rudová, Logické programování I, 18. kvetna 2012 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 ), domain([Jan],3,6], ... Hana Rudová, Logičké programování I, 18. kvetna 2G12 19G Logičké programování s omezujíčími podmínkami Kód CLP(FD) programu % základní struktura CLP programu solve( Variables ) :- dec1are_variab1es( Variables ), post_constraints( Variables ), domain([Jan],3,6], ... all_distinct([Jan,Petr,...]) Hana Rudová, Logické programování I, 18. kvetna 2012 190 Logické programování s omezujícími podmínkami Kód CLPCFD) programu % základní struktura CLP programu solve( Variables ) :- dec1are_variab1es( Variables ), domain([Jan],3,6], ... post_constraints( Variables ), a11_distinct([Jan,Petr,...]) labelingC Variables ). Hana Rudová, Logické programování I, 18. května 2012 190 Logické programování s omezujícími podmínkami Kód CLP(FD) programu % základní struktura CLP programu solve( Variables ) :- dec1are_variab1es( Variables ), domain([Jan],3,6], ... post_constraints( Variables ), all_distinct([Ilan,Petr,...]) labelingC Variables ). % triviální labeling labelingC [] )■ labelingC [VarjRest] ) i-fd_min(Var,Min), C Var#=Min, labelingC Rest ) % výber nejmenší hodnoty z domény Hana Rudová, Logické programování I, lS. kvetna 2Cl2 19C 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], ... 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, 18. kvetna 2012 190 Logické programování s omezujícími podmínkami Príklad: algebrogram Přiřaď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 Hana Rudová, Logické programování I, 18. kvetna 2012 191 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 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) Hana Rudová, Logické programování I, 18. kvetna 2012 191 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 Hana Rudová, Logické programování I, 18. kvetna 2012 191 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 all_distinct( [S,E,N,D,M,0,R,Y] ) Hana Rudová, Logické programování I, 18. kvetna 2012 191 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 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 a11_distinct( [S,E,N,D,M,0,R,Y] ) 1abe1ing( [S,E,N,D,M,0,R,Y] ) Hana Rudová, Logické programování I, 18. kvetna 2012 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 Hana Rudová, Logické programování I, 18. kvetna 2012 192 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 Hana Rudová, Logické programování I, 18. kvetna 2012 192 Logické programování s omezujícími podmínkami Od LP k CLP I. -í* CLP: rozšír ení 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 M Cíl ± využít syntaktické a výrazové p rednosti LP dosáhnout vetší efektivity Unifikace v LP je nahrazena splnováním podmínek & 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 Rudová, Logické programování I, 18. kvetna 2012 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 A consistency techniques, propagace omezení (constraint propagation) £> omezení: A in 0..2, B in 0..2, B #< A Hana Rudová, Logické programování I, 18. kvetna 2012 193 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 Hana Rudová, Logické programování I, 18. kvetna 2012 193 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 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky Hana Rudová, Logické programování I, 18. kvetna 2012 193 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 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, 18. kvetna 2012 193 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) 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 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 -fc po provedení A #=1 se z B #< A se odvodí: B #= 0 Hana Rudová, Logické programování I, 18. kvetna 2012 193 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 Hana Rudová, Logické programování I, 18. kvetna 2012 193 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 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 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, Hana Rudová, Logické programování I, 18. kvetna 2012 193 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) 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 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 reš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, B #< A Hana Rudová, Logické programování I, 18. kvetna 2012 193 Logické programování s omezujícími podmínkami Syntaxe CLP Výběr jazyka omezení CLP klauzule jako LP klauzule, ale její tělo mUže obsahovat omezení daného jazyka p(X,Y) X #< Y+1, q(X), r(X,Y,Z). Rezoluční 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 řešičů: unifikace + rešič omezení Hana Rudová, Logické programování I, 18. kvetna 2012 194 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ádeny 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 ešice p r i neúspechu se vyvolá backtracking p r i úspechu se podmínky v NewStore zjednoduší propagací omezení Jt zbývající cíle jsou provádeny s upraveným NewStore CLP výpocet cíle G je úspešný, pokud se dostaneme z iniciálního stavu (G, 0) do stavu (G',Store), kde G' je prázdný cíl a Store je splnitelná. Hana Rudová, Logické programování I, 18. kvetna 2012 195 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, 18. kvetna 2012 197 CLP(FD) v SICStus Prologu Systémy a jazyky pro CP J* 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 silná CLP(FL)) knihovna, komercní i akademické použití Hana Rudová, Logické programování I, 18. kvetna 2012 197 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á CLPCFD) knihovna, komercní i akademické použití IC-PARC, Imperial College London, Cisco Systems: ECL*PSe 1984 it široké možnosti kooperace mezi ruznými r ešicemi: konecné domény, reálná císla, repair Jt 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, 18. kvetna 2012 197 CLPCFD) 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(FD) 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, 18. kvetna 2012 197 CLP(FD) v SICStus Prologu CLP(FD) v SICStus Prologu & Vestavené predikáty jsou dostupné v separátním modulu (knihovne) :- use_modu1e(1ibrary(c1pfd)). Obecné principy platné všude nicméne standarty jsou nedostatecné a stejné/podobné vestavené predikáty existují i jinde s CLP knihovny v SWI Prologu i ECLiPSe se liší Hana Rudová, Logické programování I, 18. kvetna 2012 198 CLPCFD) 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 Hana Rudová, Logické programování I, 18. kvetna 2012 199 CLP(fd) v SICStus Prologu Príslušnost k doméne: Range termy -i* ?- domain( [A,B], l,3). domain( +Variab1es, +Min, +Max) A in l..3 B in l..3 B ?- a in l..8, A #\= 4. ?X in +Min..+Max A in (l..3) \/ C5..8) Hana Rudová, Logičké programování I, l8. kvetna 2Gl2 199 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 ccí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, 18. kvetna 2012 199 CLP(FD) v SICStus Prologu Příslušnost k doméne: Range termy ifc ?- domain( [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1..3 B in 1..3 Jfc ?- 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) \/ (5..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, 18. kvetna 2012 199 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 Jfc ?- 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, 18. kvetna 2012 199 CLP(FD) v SICStus Prologu Príslušnost k doméne: Range termy i& ?- domain( [A,B], 1,3). domain( +Variables, +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, 18. kvetna 2012 199 CLP(FD) v SICStus Prologu P r íslušnost k doméne: FDSet termy C FDSet term: reprezentace závislá na implementaci 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á, Logické programování I, 18. kvetna 2012 200 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, lS. kvetna 2Cl2 2CC CLPCFD) 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) & FDSet termy predstavují nízko-úrovnovou implementaci FDSet termy nedoporuceny v programech -fc používat pouze predikáty pro manipulaci s nimi -i- omezit použití A in_set [[1|2],[6|9]] & Range termy preferovány Hana Rudová, Logické programování I, 18. kvetna 2012 200 CLP(FD) v SICStus Prologu Další fd_... predikáty fdset_to_1ist(+FDset, -List) vrací do seznamu prvky FDset & 1ist_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 Rudová, Logické programování I, 18. kvetna 2012 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 Jt POZOR: neplést #=< a #>= s operátory pro implikaci: #<= #=> Hana Rudová, Logické programování I, 18. kvetna 2012 202 CLPCFD) v SICStus Prologu Aritmetická omezení J* Expr RelOp Expr RelOp -> #= j #\= j #< j #=< j #> j #>= A A + B #=< 3, A #\= (C - 4) * C D - S), 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) it Variab1es i Suma musí být doménové promenné nebo celá císla Hana Rudová, Logické programování I, 18. kvetna 2012 202 CLP(FD) v SICStus Prologu Aritmetická omezení J* Expr RelOp Expr RelOp -> #= | #\= | #< | #=< | #> | #>= A A + B #=< 3, A #\= (C - 4) * (D - 5), A/2 #= 4 it 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) it Variables 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 it POZOR na poradí 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, 18. kvetna 2012 202 CLP(FD) v SICStus Prologu Základní globální omezení all_distinct(l_ist) M všechny proměnné různé cumulative(...) disjunktivní a kumulativní rozvrhování cumulatives(...) 3» kumulativní rozvrhování na více zdrojů Hana Rudová, Logické programování I, 18. kvetna 2012 203 CLP(FD) v SICStus Prologu promenné různé all_distinct(Variables), all_different(Variables) iS> Promenné v seznamu Variables jsou různé all_distinct a all_different se liší úrovní propagace a all_distinct má úplnou propagaci all_different má slabší (neúplnou) propagaci Hana Rudová, Logické programování I, 18. kvetna 2012 204 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, 18. kvetna 2012 204 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, 18. kvetna 2012 204 CLP(FD) v SICStus Prologu Všechny proměnné různé all_distinct(Variables), all_different(Variables) Proměnné v seznamu Variables jsou různé all_distinct a all_different se liší úrovní propagace a all_distinct má úplnou propagaci a all_different má slabší (neúplnou) propagaci Príklad: uCitelé musí uCit v mzné hodiny all_distinct([Jan,Petr,Anna,Ota,Eva,Marie]) Jan = 6, Ota = 2, Anna = 5, Marie = 1, Petr in 3..4, Eva in 3..4 3 all_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 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, 18. kvetna 2012 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 Hana Rudová, Logické programování I, 18. kvetna 2012 205 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 it 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, 18. kvetna 2012 205 CLPCFD) 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, 18. kvetna 2012 205 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování (unární zdroj) -í* cumulative([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 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 ó ± příklad: vytvoření rozvrhu, za předpokladu, že doba trvání hodin není stejná JanE#= Jan+3, PetrE#= Petr+1, AnnaE#= Anna+2, ... cumulative(taskOan,3,JanE,1,1),task(Petr,1,PetrE,1,2),task(Anna,2,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, 18. kvetna 2012 205 CLP(FD) v SICStus Prologu Kumulativní rozvrhování JS> cumulative([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 neprekrývaly a aby celková kapacita zdroje nikdy neprekrocila Limit Hana Rudová, Logické programování I, 18. kvetna 2012 206 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 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, 18. kvetna 2012 ^ 206 ^ ^ ° 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 (Machineld) Zdroje zadány identifikátorem (Id) a kapacitou (Limit) Hana Rudová, Logické programování I, 18. kvetna 2012 207 CLP(FD) v SICStus Prologu Kumulativní rozvrhování s více zdroji & Rozvržení úloh tak, aby se neprekrývaly a daná kapacita zdroju nebyla prekrocena (limit zdroje chápán jako horní mez - bound(upper)) & cumulatives([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) JS> Zdroje zadány identifikátorem (Id) a kapacitou (Limit) M Príklad: ?- domain([B,C],1,2), cumulatives([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 Rudová, Logické programování I, 18. kvetna 2012 207 CLP(FD) v SICStus Prologu Príklad: kumulativní rozvrhování C Vytvorte rozvrh pro následující úlohy, tak aby nebyla prekrocena 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, 18. kvetna 2012 208 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedu1e(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? Hana Rudová, Logické programování I, 18. kvetna 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedu1e(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedu1e(l_imit, Ds, Rs, MaxCas, Ss, End) :- Hana Rudová, Logické programování I, 18. kvetna 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(Limit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, Hana Rudová, Logické programování I, 18. května 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(Limit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_ulohy(Ss,Ds,Rs,1,Tasks), Hana Rudová, Logické programování I, lS. kvetna 2Cl2 2C9 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(Limit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_ulohy(Ss,Ds,Rs,1,Tasks), cumulative(Tasks, [limit(Limit)]), Hana Rudová, Logické programování I, 18. kvetna 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(Lirrnt, Ds, Rs, MaxCas, Ss, End) domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_ulohy(Ss,Ds,Rs,1,Tasks), cumulative(Tasks, [limit(Limit)]), after(Ss, Ds, End), % koncový Cas Hana Rudová, Logické programování I, 18. května 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(l_imit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_ulohy(Ss,Ds,Rs,1,Tasks), cumulative(Tasks, [limit(Limit)]), after(Ss, Ds, End), % koncový Cas append(Ss, [End], Vars), Hana Rudová, Logické programování I, 18. kvetna 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(Limit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_ulohy(Ss,Ds,Rs,1,Tasks), cumulative(Tasks, [limit(Limit)]), after(Ss, Ds, End), % koncovýCas append(Ss, [End], Vars), labeling([minimize(End)],Vars). Hana Rudová, Logické programování I, 18. května 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedule(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedule(Limit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_ulohy(Ss,Ds,Rs,1,Tasks), cumulative(Tasks, [limit(Limit)]), after(Ss, Ds, End), % koncovýCas append(Ss, [End], Vars), labeling([minimize(End)],Vars). vytvor_ulohy([],[],[],_Id,[]). vytvor_ulohy([S|Ss], [D|Ds], [R|Rs], Id, [task(S,D,E,R,Id)|Tasks]):-NewId is Id+1, E #= S+D, vytvor_ulohy(Ss,Ds,Rs, NewId,Tasks). Hana Rudová, Logické programování I, 18. kvetna 2012 209 CLP(FD) v SICStus Prologu Řešení: kumulativní rozvrhování | ?- schedu1e(13, [16,6,13,7,5,18,4], [2,9,3,7,10,1,11], 69, Ss, End). Ss = [0,16,9,9,4,4,0], End = 22 ? schedu1e(Limit, Ds, Rs, MaxCas, Ss, End) :-domain(Ss, 0, MaxCas), End in 0..MaxCas, vytvor_u1ohy(Ss,Ds,Rs,1,Tasks), cumu1ative(Tasks, [limit(Limit)]), after(Ss, Ds, End), % koncovýcas append(Ss, [End], Vars), 1abe1ing([minimize(End)],Vars). vytvor_u1ohy([],[],[],_Id,[]). vytvor_u1ohy([S|Ss], [D|Ds], [R|Rs], Id, [task(S,D,E,R,Id)|Tasks]):-NewId is Id+1, E #= S+D, vytvor_u1ohy(Ss,Ds,Rs, NewId,Tasks). after([], [], _). after([S|Ss], [D|Ds], End) :- E #>= S+D, after(Ss, Ds, End). Hana Rudová, Logické programování I, 18. kvetna 2012 209 CLP(FD) v SICStus Prologu Vestavěné predikáty pro labeling Instanciace promenné Variable hodnotami v její 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, 18. kvetna 2012 210 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 ? 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, 18. kvetna 2012 210 CLP(FD) v SICStus Prologu Vestavené predikáty pro labeling Instanciace promenné Variable hodnotami v její 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 ? 1abe1ing( [] ). 1abe1ing( [Var|Rest] ) :-indomain( Var ), 1abe1ing( Rest ). % výber nejlevejší promenné k instanciaci % výber hodnot ve vzmstajícím poradí M 1abe1ing( Options, Variab1es ) ?- A in 0..2, B in 0..2, B#< A, 1abe1ing([], [A,B]). Hana Rudová, Logické programování I, 18. kvetna 2012 210 CLP(FD) v SICStus Prologu Uspo rádání hodnot a proměnných Pri prohledávání je rozhodující uspo rádání hodnot a proměnných Určují 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), Hana Rudová, Logické programování I, 18. kvetna 2012 211 CLP(FD) v SICStus Prologu Usporádání hodnot a proměnných iS» Pri prohledávání je rozhodující usporádání hodnot a promenných Urcujíje heuristiky výberu hodnot a výberu promenných labeling( [] ). labeling( Variables ) :- select_variable(Variables,Var,Rest), select_value(Var,Value), ( Var #= Value, labeling( Rest ) Hana Rudová, Logické programování I, 18. kvetna 2012 211 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 1abe1ing( [] ). 1abe1ing( Variables ) :- se1ect_variab1e(Variab1es,Var,Rest), se1ect_va1ue(Var,Va1ue), ( Var #= Value, 1abe1ing( Rest ) Var #\= Value , % nemusí dojít k instanciaci Var 1abe1ing( Variables ) % proto pokracujeme se všemi promennými vcetne Var Hana Rudová, Logické programování I, 18. kvetna 2012 211 CLP(FD) v SICStus Prologu Uspořádání hodnot a proměnných & Pr i 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 1abe1ing( [] ). 1abe1ing( Variables ) :- se1ect_variab1e(Variab1es,Var,Rest), se1ect_va1ue(Var,Va1ue), ( Var #= Value, 1abe1ing( Rest ) Var #\= Value , % nemusí dojít k instanciaci Var 1abe1ing( Variables ) % proto pokracujeme se všemi promennými vcetne Var & Statické usporádání: urceno už p red prohledáváním JS> Dynamické usporádání: pocítá se behem prohledávání Hana Rudová, Logické programování I, 18. kvetna 2012 211 CLP(FD) v SICStus Prologu Výber hodnoty JS> Obecný princip výberu hodnoty: první úspech (succeed first) j* volíme poradí tak, abychom výber nemuseli opakovat ?- domain([A,B,C],1,2), A#=B+C. Hana Rudová, Logické programování I, 18. kvetna 2012 212 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, 18. kvetna 2012 212 CLP(FD) v SICStus Prologu Výběr hodnoty JS> Obecný princip výběru hodnoty: první úspěch (succeed first) it volíme po radí tak, abychom výběr 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 & Parametry labeling/2 ovlivnující výber hodnoty pr . labe1ing([down], Vars) it up: doména procházena ve vzrůstajícím po radí (default) it down: doména procházena v klesajícím po radí Hana Rudová, Logické programování I, 18. kvetna 2012 212 CLP(FD) v SICStus Prologu Výber hodnoty JS> Obecný princip výberu hodnoty: první úspech (succeed first) j* volíme poradí tak, abychom 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 backtrackingu & Parametry labeling/2 ovlivnující výber hodnoty pr. labeling([down], Vars) -i- up: doména procházena ve vzrůstajícím poradí (default) down: doména procházena v klesajícím poradí C- Parametry labeling/2 rídící, 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ých" 3» enum: vícenásobná volba mezi všemi hodnotami v doméne podobne jako pri indomain/1 Hana Rudová, Logické programování I, 18. kvetna 2012 212 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 A výbereme promennou s nejmenší doménou ?- domain([A,B,C],1,3), A#<3, A#=B+C. Hana Rudová, Logické programování I, 18. kvetna 2012 213 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 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 Hana Rudová, Logické programování I, 18. kvetna 2012 213 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 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, 18. kvetna 2012 213 CLP(FD) v SICStus Prologu Výběr proměnné Obecný princip výběru proměnné: 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 výbereme promennou s nějměnší 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 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, 18. kvetna 2012 213 CLP(FD) v SICStus Prologu rěšění (prědpokládějmě minimalizaci) Parametry labeling/2 pro optimalizaci: minimize(F)/maxirrrize(F) iľ Cena #= A+B+C, 1abe1ing([minimize(Cena)], [A,B,C]) Mětoda větví a mězí (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, End). Hana Rudová, Logické programování I, 18. kvetna 2012 216 CLP(FD) v SICStus Prologu Algoritmy pro rešení problému splnování podmínek (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) Hana Rudová, Logické programování I, 18. kvetna 2012 218 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 a- vrchol = promenná, hyperhrana = podmínka Hana Rudová, Logické programování I, 18. kvetna 2012 218 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 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, 18. kvetna 2012 218 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 proměnné 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, 18. kvetna 2012 219 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 Jt 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, 18. kvetna 2012 219 Algoritmy pro CSP Binární CSP M Binární CSP i* CSP, ve kterém jsou pouze binární podmínky unární podmínky zakódovány do domény promenné JS> Graf podmíněk pro binární CSP není nutné uvažovat hypergraf, stací graf (podmínka spojuje pouze dva vrcholy) & Každý CSP lzě transformovat na "korěspondující" binární CSP iS* Výhody a nevýhody binarizace 3 získáváme unifikovaný tvar CSP problému, rada algoritmu navržena pro binární CSP -fc bohužel ale znacné zvetšení velikosti problému JS> Nebinární podmínky A složitejší propagacní algoritmy lze využít jejich sémantiky pro lepší propagaci X príklad: a11_different vs. množina binárních nerovností Hana Rudová, Logické programování I, 18. kvetna 2012 219 Algoritmy pro CSP Vrcholová a hranová konzistěncě & Vrcholová konzistěncě (node consistency) NC -fc každá hodnota z aktuální domény Vi promenné splnuje všechny unární podmínky s promennou Vi Hana Rudová, Logické programování I, 18. kvetna 2012 220 Algoritmy pro CSP Vrcholová a hranová konzistence & Vrcholová konzistence (node consistency) NC Jt 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, 18. kvetna 2012 220 Algoritmy pro CSP Vrcholová a hranová konzistence 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. a hranová konzistence je smerová konzistence hrany (Vi,Vj) nezarucuje konzistenci hrany (Vj,Vi) A I 3..7 A 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 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 Hana Rudová, Logické programování I, 18. kvetna 2012 221 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 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,V2J,2,4), Vi#< V2 Hana Rudová, Logické programování I, 18. kvetna 2012 221 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, 18. kvetna 2012 221 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 Vi a Vj) JS> proceduře revise((i,j)) Deleted := false for V x in Di 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, 18. kvetna 2012 221 Algoritmy pro CSP Dosažení hranové konzistence problému JS> Jak udelat CSP hranove konzistentní? a 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, 18. kvetna 2012 222 Algoritmy pro CSP Dosažení hranové konzistence problému Jak udělat CSP hranově konzistentní? a revize je potreba opakovat, dokud se mění doména nějaké proměnné a 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, 18. května 2012 222 Algoritmy pro CSP Algoritmus AG-B procedure AC-3(G) ____^ Vk *^ Vm Q := {(i,j) I (i,j) £ hrany(G), í = j} % seznam hran pro revizi whi1e 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 whi1e end AC-3 Hana Rudová, Logické programování I, 18. kvetna 2012 223 Algoritmy pro CSP Algoritmus AC-3 procedure AC-3(G) ____^ Vk *^ Vm Q : = ) I ) £ 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) £ 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, 18. kvetna 2012 224 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í Hana Rudová, Logické programování I, 18. kvetna 2012 224 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í 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, 18. kvetna 2012 224 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, 18. kvetna 2012 225 Algoritmy pro CSP k-konzistence Mají NC a AC něco společného? s NC: konzistence jedné proměnné & 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, 18. kvetna 2G12 225 Algoritmy pro CSP k-konzistence Mají NC a AC něco společného? s NC: konzistence jedné proměnné Jt 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) různých promenných rozšířit do libovolné k-té promenné 1,2,3 1,2,3 1,2,3 4 -í* Pro obecné CSP, tedy i pro nebinární podmínky Hana Rudová, Logické programování I, 18. kvetna 2012 225 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, 18. kvetna 2012 226 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1,1) lze rozšír it na (1,1,1) (2, 2) lze rozšír it na (2, 2,2) 1,2 1,2 1,2,3 není 2-konzistentní (3) nelze rozšír it (1, 3) ani (2, 3) nejsou konzistentní dvojice (nerozši r ujeme je) Hana Rudová, Logické programování I, 18. kvetna 2012 226 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, 18. kvetna 2012 226 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1,1) lze rozšír it na (1,1,1) 1,2 1,2 1,2,3 není 2-konzistentní ( 3 ) nelze rozší rit (2, 2) lze rozšír it na (2, 2,2) (1, 3) ani (2, 3) nejsou konzistentní dvojice (nerozši r ujeme 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 & NC = silná 1-konzistence = 1-konzistence & AC = (silná) 2-konzistence Hana Rudová, Logické programování I, 18. kvetna 2012 226 Algoritmy pro CSP Konzistence pro nalezení reš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, 18. kvetna 2012 227 Algoritmy pro CSP Konzistěncě pro nalězění rěšění 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, 18. kvetna 2012 227 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 B => min(A) = min(B)+1, max(B) = max(A)-1 p r íklad: A in 4..10, B in 6..18, A #> B min(A) = 6+1 => A in 7..10 max(B) = 10-1 => B in 6..9 Hana Rudová, Logické programování I, 18. kvetna 2012 230 Algoritmy pro CSP Konzistence mezí iS» Bounds consistency BC: slabší než obecná hranová konzistence -fc podmínka má konzistentní meze (BC), práve když pro každou promennou Vj z této podmínky a každou hodnou x g Dj existuje ohodnocení zbylých promenných v podmínce tak, že je podmínka splnena a pro vybrané ohodnocení yt promenné Vt platí min(Dt) < yt < max(Dt) a stací propagace pouze p r i zmene minimální nebo maximální hodnoty (pri zmene mezí) v doméne promenné & Konzistence mezí pro nerovnice L- A #> B => min(A) = min(B)+1, max(B) = max(A)-1 p ríklad: A in 4..10, B in 6..18, A #> B min(A) = 6+1 => A in 7..10 max(B) = 10-1 ^ B in 6..9 podobne: A #< B, A #>= B, A #=< B Hana Rudová, Logické programování I, 18. kvetna 2012 230 Algoritmy pro CSP Konzistěncě mězí a aritmětická omězění & A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmy pro CSP Konzistence mezí a aritmetická omezení & A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) Jt zmena min(A)vyvolá pouze zmenu min(B) a min(C) Jt zmena max(A)vyvolá pouze zmenu max(B) a max(C), ... Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmypro CSP Konzistence mezí a aritmetická omezení & A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) Jt zmena min(A)vyvolá pouze zmenu min(B) a min(C) Jt zmena max(A)vyvolá pouze zmenu max(B) a max(C), ... C Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 ^> Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmy pro CSP Konzistence mezí a aritmetická omezení & A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) A změna min(A)vyvolá pouze změnu min(B) a min(C) A změna max(A)vyvolá pouze změnu max(B) a max(C), ... C Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 => min(A)=1+2, max(A)=10+2 => A in 3..10 => min(B)=1-2, max(B)=10-2 => B in 1..8 Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmy pro CSP Konzistence mezí a aritmetická omezení * A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) A zmena min(A)vyvolá pouze zmenu min(B) a min(C) A zmena max(A)vyvolá pouze zmenu max(B) a max(C), ... M Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 => min(A)=1+2, max(A)=10+2 => A in 3..10 => min(B)=1-2, max(B)=10-2 => B in 1..8 A #> 5 ^ min(A)=6 ^ A in 6..10 => min(B)=6-2 => B in 4..8 (nové vyvolání A #= B + 2) Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmy pro CSP Konzistence mezí a aritmetická omezení & A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) Jt zmena min(A)vyvolá pouze zmenu min(B) a min(C) Jt zmena max(A)vyvolá pouze zmenu max(B) a max(C), ... M Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 => min(A)=1+2, max(A)=10+2 => A in 3..10 = min(B)=1-2, max(B)=10-2 = B in 1..8 A #> 5 == min(A)=6 == A in 6..10 == min(B)=6-2 == B in 4..8 (nové vyvolání A #= B + 2) A #\= 8 = A in (6..7) \/ (9..10) (meze stejné, k propagaci A #= B + 2 nedojde) Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmy pro CSP Konzistence mezí a aritmetická omezení & A #= B + C => min(A) = min(B)+min(C), max(A) = max(B)+max(C) min(B) = min(A)-max(C), max(B) = max(A)-min(C) min(C) = min(A)-max(B), max(C) = max(A)-min(B) Jt zmena min(A)vyvolá pouze zmenu min(B) a min(C) Jt zmena max(A)vyvolá pouze zmenu max(B) a max(C), ... M Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 => min(A)=1+2, max(A)=10+2 => A in 3..10 = min(B)=1-2, max(B)=10-2 = B in 1..8 A #> 5 == min(A)=6 == A in 6..10 == min(B)=6-2 == B in 4..8 (nové vyvolání A #= B + 2) A #\= 8 = A in (6..7) \/ (9..10) (meze stejné, k propagaci A #= B + 2 nedojde) JS* Vyzkoušejte si: A #= B - C, A #>= B + C Hana Rudová, Logické programování I, 18. kvetna 2012 231 Algoritmy pro CSP Globální podmínky & Propagace je lokální A pracuje se s jednotlivými podmínkami & interakce mezi podmínkami je pouze p res domény promenných C Jak dosáhnout více, když je silnejší propagace drahá? & Seskupíme nekolik podmínek do jedné tzv. globální podmínky JS> Propagaci p res globální podmínku r ešíme speciálním algoritmem navrženým pro danou podmínku C Príklady: M all_different omezení: hodnoty všech promenných různé serialized omezení: rozvržení úloh zadaných startovním casem a dobou trvání tak, aby se nep rekrývaly Hana Rudová, Logické programování I, 18. kvetna 2012 232 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, 18. kvetna 2012 233 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, 18. května 2012 233 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[X\,... ,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, 18. května 2012 233 Algoritmy pro CSP Propagace pro all_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 interval I: velikost intervalu I je rovna Ota 4 poctu promenných, jejichž doména je v I Eva 4 Marie 1 6 Hana Rudová, Logické programování I, 18. kvetna 2012 233 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: VjXi,.. .,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 = {Xi,...,Xk}, dom(U) = {Di 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)) => Vv g dom(U), VX g (V - U),X = v Hana Rudová, Logické programování I, 18. kvetna 2012 233 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: VjXi,.. .,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 = {Xi,...,Xk}, dom(U) = {Di u • • • u Dk} card(U) = card(dom(U)) => Vv e dom(U), VX e (V - U),X = v s» hodnoty v Hallově intervalu jsou pro ostatní proměnné 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, 18. května 2012 233 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: VjXi,.. .,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 = {Xi,...,Xk}, dom(U) = {Di 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 Složitost: O(2n) - hledání všech podmnožin množiny n proměnných (naivní) Hana Rudová, Logické programování I, 18. kvetna 2012 233 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 s» 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, 18. kvetna 2012 233 Algoritmy pro CSP Prohledávání + konzistence Splňování podmínek prohledáváním prostoru řešení A 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, 18. kvetna 2012 234 Algoritmy pro CSP Prohledávání + konzistence & Splňování podmínek prohledáváním prostoru r ešení A podmínky jsou užívány pasivné jako test j> 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í Hana Rudová, Logické programování I, 18. kvetna 2012 234 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 j> p r i razuji hodnoty promenných a zkouším co se stane vestavený prohledávací algoritmus Prologu: backtracking, triviální: generuj & 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í (propagacní) 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í) Hana Rudová, Logické programování I, 18. kvetna 2012 234 Algoritmy pro CSP Prohledávání + konzistence Splnování podmínek prohledáváním prostoru řešení A podmínky jsou užívány pasivně jako test j> prirazuji hodnoty proměnných a zkouším co se stane vestavěný prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj úplná metoda (nalezneme rešení nebo dokážeme jeho neexistenci) zbytecně pomalé (exponenciální): procházím i „evidentně" špatná ohodnocení & Konzistencní (propagacní) techniky -i- umožnují odstranění nekonzistentních hodnot z domény proměnných neúplná metoda (v doméně zustanou ještě nekonzistentní hodnoty) A relativně rychlé (polynomiální) & Používá se kombinace obou metod -fc postupné prirazování hodnot proměnným -i- po prirazení hodnoty odstranění nekonzistentních hodnot konzistencními technikami Hana Rudová, Logické programování I, 18. května 2012 234 Algoritmy pro CSP Prohlědávání do hloubky Základní prohledávací algoritmus pro problémy splnování podmínek & Prohlědávání stavového prostoru do hloubky (depth first search) & Dve fáze prohledávání s navracením Jt doprědná fázě: promenné jsou postupne vybírány, rozširuje se cástecné r ešení p r i razením konzistení hodnoty (pokud existuje) další promenné po vybrání hodnoty testujeme konzistenci a zpětná fázě: pokud neexistuje konzistentní hodnota pro aktuální promennou, algoritmus se vrací k p r edchozí p r i razené hodnote Hana Rudová, Logické programování I, 18. kvetna 2012 235 Algoritmy pro CSP Prohlědávání do hloubky & Základní prohledávací algoritmus pro problémy splnování podmínek & Prohlědávání stavového prostoru do hloubky (depth first search) & Dve fáze prohledávání s navracením & doprědná fázě: promenné jsou postupne vybírány, rozši r uje se cástecné r ešení p r i razením konzistení hodnoty (pokud existuje) další promenné po vybrání hodnoty testujeme konzistenci a zpětná fázě: pokud neexistuje konzistentní hodnota pro aktuální promennou, algoritmus se vrací k p r edchozí p r i razené hodnote & Promenné delíme na & minulé - promenné, které už byly vybrány (a mají p r i razenu hodnotu) * aktuální - promenná, která je práve vybrána a je jí p r i r azována hodnota s budoucí - promenné, které budou vybrány v budoucnosti Hana Rudová, Logické programování I, 18. kvetna 2012 235 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, 18. kvetna 2012 236 Algoritmy pro CSP Backtracking (BT) Backtracking ove r uje 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 Jt na všech minulých promenných Jt na podmínkách mezi minulými promennými a aktuální promennou Hana Rudová, Logické programování I, 18. kvetna 2012 237 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 A na všech minulých promenných -fc na podmínkách mezi minulými promennými a aktuální promennou procedure BT(G,a) Q:={(Ví, 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, 18. kvetna 2012 237 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, 18. kvetna 2012 238 Kontrola dopredu (FC - forward checking) FC je rozšiř ení backtrackingu FC navíc zajišťuje konzistenci mezi aktuální proměnnou a budoucími proměnnými, které jsou s ni spojeny dosud nesplnenými podmínkami Hana Rudová, Logické programování I, 18. kvetna 2012 239 AlgoritmyproCSP 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 proměnnými, které jsou s ní spojeny dosud nesplnenými podmínkami procedure FC(G,a) Q:={(Vi, Va) g hrany(G), i> a} % přidá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, 18. kvetna 2012 239 Algoritmy pro CSP Príklad: kontrola dopredu C Omezení: V1,V2, V3 in 1... 3, c : Vi# = 3 x V3 & Stavový prostor: Hana Rudová, Logické programování I, 18. kvetna 2012 240 Algoritmy pro CSP Pohled dopredu (LA - looking ahead) LA je rozšírení FC, navíc ove r uje konzistenci hran mezi budoucími promenný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, 18. kvetna 2012 241 AlgoritmyproCSP Pohled dop ř edu (LA - looking ahead) LA je rozšírení FC, navíc ove 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 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 -i* LA udržujě hranovou konzistěnci: protože ale LA(G,a) používá AC-3, musíme zajistit iniciální konzistěnci pomocí AC-3 ješte p red startem prohledávání Hana Rudová, Logické programování I, 18. kvetna 2012 241 Algoritmy pro CSP Příklad: pohled dopředu (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 p red 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, 18. kvetna 2012 242 Algoritmy pro CSP Přehled 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, 18. května 2012 243 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, 18. kvetna 2012 243 Algoritmy pro CSP Přehled algoritmů BT Backtracking (BT) kontroluje v kroku a podmínky ,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é Pohled dopředu (LA) kontroluje v kroku a podmínky Ví(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 proměnnými a FC n promenne aktuální Hana Rudová, Logické programování I, 18. kvetna 2012 243 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, 18. kvetna 2012 244 Algoritmy pro CSP Cvicení 1. Jaká jsou pravidla pro konzistenci mezí u omezení X#= Y+5? Jaké typy propagací pak proběhnou v následujícím příkladě pri použití konzistence mezí? X in 1..20, Y in 1..20, X #= Y+ 5, Y#> 10. 2. Ukažte, jak je dosaženo hranové konzistence v následujícím príkladu: domain([X,Y,Z],1,5]), X #< Y, Z#= Y+1 . Hana Rudová, Logické programování I, 18. kvetna 2012 245 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 tvorí program P. JS> Hlava je literál & Tělo je (eventuálne prázdná) konjunkce literál u T1,...Ta, a > 0 & Literál je tvoren m-árním predikátovým symbolem (m/p) a m termy (argumenty) JS> Term je konstanta, promenná nebo složený term. -í* Složený term s n termy na míste argumentu & Dotaz (cíl) je neprázdná množina literálu. Hana Rudová, Logické programování I, 18. kvetna 2012 247 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literály tela. Hana Rudová, Logické programování I, 18. kvetna 2012 248 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, 18. kvetna 2012 248 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, 18. kvetna 2012 248 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 nejobecnější unifikátor. Pokud neexistuje A' nebo a, ukonci cyklus. Hana Rudová, Logické programování I, 18. kvetna 2012 249 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':-Bi ,...,Bn (n > 0) z programu P takovou, že 3a : Aer = 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, 18. kvetna 2012 249 Implementace Prologu Abstraktní intěrprět - pokračování Kroky (3) až (5) p r edstavují rědukci (logickou inferenci) cíle A. Pocet redukcí za sekundu (LIPS) == indikátor výkonu implementace Hana Rudová, Logické programování I, 18. kvetna 2012 250 Implementace Prologu Abstraktní intěrprět - pokračování Kroky (3) až (5) p r edstavují rědukci (logickou inferenci) cíle A. Pocet redukcí za sekundu (LIPS) == indikátor výkonu implementace Věta 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, 18. kvetna 2012 250 Implementace Prologu Nedeteřminismus inteřpetu 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í střomu 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, 18. kvetna 2012 251 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, 18. kvetna 2012 251 Implementace Prologu Nedeterminismus interpetu 1. Selekcní pravidlo: výběr cíle A z množiny cílu S M neovlivnuje výrazně výsledek chování interpretu 2. Způsob prohledávání stromu výpoctu: výběr klauzule A' z programu P JG* je velmi důležitý, všechny klauzule totiž nevedou k úspěš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ýběr správné klauzule & vlastnost abstraktního interpretu, kterou ale reálné interprety nemají Hana Rudová, Logické programování I, 18. května 2012 251 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 Hana Rudová, Logické programování I, 18. kvetna 2012 252 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. 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, 18. kvetna 2012 252 Implementace Prologu Prohlědá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. Hana Rudová, Logické programování I, 18. kvetna 2012 252 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. 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. 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, 18. kvetna 2012 252 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, 18. kvetna 2012 253 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. Hana Rudová, Logické programování I, 18. kvetna 2012 253 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ř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, 18. kvetna 2012 253 Implementace Prologu Prohlědá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. -» Není úplné, tj. nemusí najít všechna rešení Nižší pametová nárocnost než prohledáváni do ši r ky & Používá se v Prologu Hana Rudová, Logické programování I, 18. kvetna 2012 253 Implementace Prologu Rěprězěntacě objěktů ifc Beztypový jazyk & Kontrola „typu" za behu výpoctu JS> Informace o struktu re soucástí objektu Hana Rudová, Logické programování I, 18. kvetna 2012 254 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, 18. kvetna 2012 254 Implementace Prologu Reprezentace objektů J& Beztypový jazyk ii> Kontrola „typu" za běhu výpoctu JS> Informace o strukture soucástí objektu Typy objektů M Primitivní objekty: konstanta císlo -i. volná proměnná -i- odkaz (reference) & Složené (strukturované) objekty: ± struktura A seznam Hana Rudová, Logické programování I, 18. května 2012 254 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, 18. kvetna 2012 255 Implementace Prologu Reprezentace objektů II P ríznaky (tags): Objekt Pr íznak volná promenná FREE konstanta CONST čelé číslo INT odkaz REF složený term FUNCT Obsah adresovatelného slova: hodnota a p r íznak. Hana Rudová, Logičké programování I, 18. kvetna 2G12 255 Implementače Prologu Reprezentace objektů II Prí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. Primitivní objekty uloženy p rímo ve slove Hana Rudová, Logické programování I, 18. kvetna 2012 255 Implementace Prologu Reprezentace 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 príznak. Primitivní objekty uloženy prímo ve slove Složené objekty Ä jsou instance termu ve zdrojovém textu, tzv. zdrojového termu & zdrojový term bez promenných => každá instanciace ekvivalentní zdrojovému termu zdrojový term s promennými => dve instance se mohou lišit aktuálními hodnotami promenných, jedinecnost zajišťuje kopírování struktur nebo sdílení struktur Hana Rudová, Logické programování I, 18. kvetna 2012 255 Implementace Prologu Kopírování struktur Pňríklad: a(b(X),c(X,Y),d), FUNCT a/3 REF REF CONSTd FUNCT c/Z REF FREE Y FUNCT b/1 - FREE X Hana Rudová, Logické programování I, 1S. kvetna Implementace Prologu Kopírování struktur II Term F s aritou A reprezentován A+1 slovy: Jt funktor a arita v prvním slove J> 2. slovo nese první argument (resp. odkaz na jeho hodnotu) . Jt 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, 18. kvetna 2012 257 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, 18. května 2012 258 Implementace Prologu Sdílení struktur II Př íklad: a(b(X),c(X,Y),d) reprezentuje < a(b($1),c($1,$2),d) ; [FREE, FREE] > kde symbolem $i označujeme í-tou přomennou. Hana Rudová, Logické programování I, 18. kvetna 2012 259 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, 18. kvetna 2012 259 Implementace Prologu Srovnání: p r íklad Naivní srovnání: sdílení pamet'ove méne nárocné Hana Rudová, Logické programování I, 18. kvetna 2012 260 Implementace Prologu Srovnání: prí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, 18. kvetna 2012 260 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, 18. kvetna 2012 260 Implementace Prologu Srovnání: príklad - pokracová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/l FREE X Hana Rudová, Logické programování I, l8. kvetna 20l2 26l 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/Z - REF FREE Y FUNCT b/1 FREE X tj. identické jako prímé vytvorení termu a(b(X),c(X,Y),d) Hana Rudová, Logické programování I, 18. kvetna 2012 261 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 Jt kopírování struktur: bez problému jednodušší algoritmy usnadnují i optimalizace Hana Rudová, Logické programování I, 18. kvetna 2012 262 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, 18. kvetna 2012 262 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 prístupu 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, 18. kvetna 2012 262 Implementace Prologu Řízění výpočtu JS> Doprědný výpočět a po úspechu (úspešná redukce) jednotlivá volání procedur skoncí úspechem a klasické volání rekurzivních procedur Hana Rudová, Logické programování I, 18. kvetna 2012 263 Implementace Prologu Rí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) nepoda r í 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 dop r ednývýpocet Hana Rudová, Logické programování I, 18. kvetna 2012 263 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 Hana Rudová, Logické programování I, 18. kvetna 2012 264 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 JS> Aktivacní záznam uložen na lokálním zásobníku JS> Dop r edný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, 18. kvetna 2012 264 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 JS> 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) J& Zpetný výpocet (backtracking) -i- hodnoty parametrů v okamžiku zavolání procedury -fc následující klauzule pro zpracování pri neúspechu Hana Rudová, Logické programování I, 18. kvetna 2012 264 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). Hana Rudová, Logické programování I, 18. kvetna 2012 265 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, 18. kvetna 2012 265 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) -í* 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é Hana Rudová, Logické programování I, 18. kvetna 2012 265 Implementace Prologu Aktivacní 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) -í* 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ýpoctu => 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, 18. kvetna 2012 265 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) -í* Pri návratu je treba obnovit (roll-back) puvodní 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é & 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á" & 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úspechu vrchol zásobníku snížen podle uschované hodnoty v aktivacním záznamu Hana Rudová, Logické programování I, 18. kvetna 2012 265 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 Hana Rudová, Logické programování I, 18. kvetna 2012 266 Implementace Prologu Okolí a bod volby Aktivacní záznam úspěšně ukoncené procedury nelze odstranit z lokálního zásobníku => rozdelení aktivacního záznamu: iS> okolí (environment) - informace nutné pro dopredný běh programu M bod volby (choice point) - informace nezbytné pro zotavení po neúspěchu & ukládány na lokální zásobník -i* samostatně provázány (odkaz na predchozí okolí resp. bod volby) Hana Rudová, Logické programování I, 18. května 2012 266 Implementace Prologu Okolí a bod volby Aktivační záznam úspěšně ukončené procedury nelze odstranit z lokálního zásobníku => rozdělení aktivačního záznamu: JS> okolí (environment) - informace nutné pro dop r edný 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 p r 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, 18. kvetna 2012 266 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 Hana Rudová, Logické programování I, 18. kvetna 2012 266 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) -í* 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, 18. kvetna 2012 266 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, 18. kvetna 2012 267 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). -í* Řez: neovlivnuje dopredný výpocet, má vliv pouze na zpetný výpocet & Odstranení alternativních vetví výpoctu ^ odstranení odpovídajících bodů volby A 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 Hana Řudová, Logické programování I, 18. kvetna 2012 267 Implementace Prologu Řez JS> Prostredek pro ovlivnění běhu 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 zpětný výpocet & Odstranění alternativních větví výpoctu => odstranění odpovídajících bodů volby A tj. odstranění bodu volby mezi soucasným vrcholem zásobníku a bodem volby procedury, která rez vyvolala (vcetně bodu volby procedury s rezem) => změna ukazatele na „nejmladší" bod volby ^ Vytvárení deterministických procedur => Optimalizace využití zásobníku Hana Rudová, Logické programování I, 18. května 2012 267 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, 18. kvetna 2012 268 Implementace Prologu Interpret Prologu Základní principy: klauzule uloženy jako termy -i* programová databáze a pro uložení klauzulí Jr má charakter haldy & umožňuje modifikovatelnost prologovských programu za behu (assert) C klauzule zřetězeny podle poradí naCtení j* triviální z r etezení Vyhodnocení dotazu: volání procedur rízené unifikací Hana Rudová, Logické programování I, 18. kvetna 2012 268 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) Hana Rudová, Logické programování I, 18. kvetna 2012 269 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 p rí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 == p r idej 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, 18. kvetna 2012 269 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 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 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. 8. Pokud není nalezena odpovídající klauzule, výpocet se vrací na predchozí bod volby (krátí se lokální i globální zásobník). 9. Výpocet koncí neúspechem: neexistuje již bod volby, k nemuž by se výpocet mohl vrátit. 10. Výpocet koncí úspechem, jsou-li úspešne redukovány všechny literály v cíli. Hana Rudová, Logické programování I, 18. kvetna 2012 269 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. Hana Rudová, Logické programování I, 18. května 2012 270 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 proměnných na stopu. Hana Řudová, Logické programování I, 18. kvetna 2012 270 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": interpretCQuery, 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, 18. kvetna 2012 270 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 -í* Hash tabulka pro vyhledání první klauzule & Možno rozhodnout (parciálne) determinismus procedury Hana Rudová, Logické programování I, 18. kvetna 2012 271 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, 18. kvetna 2012 272 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) M Indexace podle prvního argumentu Základní typy z r etezení: -i- podle po radí klauzulí (aktuální argument je volná promenná) A dle konstant (aktuální je argument konstanta) -i- formální argument je seznam (aktuální argument je seznam) dle struktur (aktuální argument je struktura) Hana Rudová, Logické programování I, 18. kvetna 2012 272 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, 18. kvetna 2012 273 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, 18. května 2012 274 Implementace Prologu Tail Recursion Optimization, TRO Iterace provádena pomocí rekurze => lineární paměť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, 18. kvetna 2012 274 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, 18. kvetna 2012 275 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í pamet'ová nárocnost & s TRO: 1 okolí, konstatní pamet'ová nárocnost Hana Rudová, Logické programování I, 18. kvetna 2012 275 Implementace Prologu Optimalizace posledního volání TRO pouze speciální prípad obecné optimalizace posledního volání (Last Call Optimization), LCO Hana Rudová, Logické programování I, 18. května 2012 276 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) odstraňováno vždy, když leží na vrcholu zásobníku. Hana Rudová, Logické programování I, 18. kvetna 2012 276 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 -fc 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í Hana Rudová, Logické programování I, 18. kvetna 2012 276 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í „globalizace" lokálních proměnných: lokální promenné posledního literálu A nutno přesunout na globální zásobník i> pouze pro neinstanciované promenné Hana Rudová, Logické programování I, 18. kvetna 2012 276 Implementace Prologu Preklad Preklad Motivace: dosažení vyšší míry optimalizace i* kompaktní kód Jť cástecná nezávislost na hardware Hana Rudová, Logické programování I, 18. května 2012 278 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, 18. kvetna 2012 278 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, 18. kvetna 2012 278 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 prepsatjen 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, 18. kvetna 2012 278 Preklad Parciální vyhodnocení & Jak navrhnout Warrenův abstraktní pocítac? J* prostr ednictví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 Rudová, Logické programování I, 18. kvetna 2012 279 Preklad Parciální vyhodnocení - pří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, 18. kvetna 2012 280 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). Hana Rudová, Logické programování I, 18. kvetna 2012 280 Preklad Parciální vyhodnocení - pří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, 18. kvetna 2012 280 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, 18. kvetna 2012 281 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, 18. kvetna 2012 281 Preklad Parciální vyhodnocení Prologu Cílová operace: unifikace. Duvod: rízení výpoctu poměrně podrobné i v interpretu £ unifikace v interpretu atomickou operací & unifikace v interpretu nahrazuje radu podstatně jednodušších operací (testy, prirazení, predání a prevzetí parametrů ...) & většina unifikací nevyžaduje obecnou unifikaci a lze je nahradit jednoduššími operacemi Hana Rudová, Logické programování I, 18. kvetna 2012 282 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, p r i r azení, p r edání a p r evzetí parametrů ...) & vetšina unifikací nevyžaduje obecnou unifikaci a lze je nahradit jednoduššími operacemi Zviditelnení 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 p r edáványjsou 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, 18. kvetna 2012 282 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, 18. kvetna 2012 283 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, 18. kvetna 2012 283 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álne vyhodnotit predikáty unify/2 a put/2 Hana Rudová, Logické programování I, 18. kvetna 2012 283 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, 18. kvetna 2012 284 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 soucástí objektu volná promenná FREE, konstanta CONST, celé císlo INT, odkaz REF, složený term FUNCT Hana Rudová, Logické programování I, 18. kvetna 2012 284 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, 18. kvetna 2012 284 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á proměnná: výsledkem je instanciace unify(A,T) :- var(T), ( var(A), create_var(A) ; true ), T := $addr$(A). Hana Rudová, Logické programování I, 18. kvetna 2012 285 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, 18. kvetna 2012 285 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, 18. kvetna 2012 286 Preklad unify pro konstantu 2) T je konstanta: výsledkem je test nebo prirazení 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 prepsat do kompaktního tvaru unify(A,T) :-atomic(T), unify_const(A,T). kde unify_const/2 provede príslušný test nebo prirazení. Hana Rudová, Logické programování I, 18. kvetna 2012 286 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. Hana Rudová, Logické programování I, 18. kvetna 2012 287 Preklad unify pro složený těrm 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, 18. kvetna 2012 287 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 Rudová, Logické programování I, 18. kvetna 2012 288 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, 18. kvetna 2012 289 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, 18. kvetna 2012 290 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, 18. kvetna 2012 290 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 promennout T => stací provést unification(A2,A3) Hana Rudová, Logické programování I, 18. kvetna 2012 290 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, 18. kvetna 2012 291 Preklad Jiný príklad a(c,s(f),d,X) :- g(X). Procedurální pseudokód (testy a p r i razení) 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, 18. kvetna 2012 292 Preklad Jiný prí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 Vyzkoušejte si: delete(X, [YjT], [Y|T1]) :- delete(X, T, T1). Hana Rudová, Logické programování I, 18. kvetna 2012 292 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, 18. kvetna 2012 293 Preklad Rozmístění 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, 18. kvetna 2012 294 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 r ezem zarízne zásobník Argumentové registry: A1,A2,... (p r i p r edá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, 18. kvetna 2012 295 Preklad Typy instrukcí WAMu & put instrukce - príprava argumentů pred voláním podcíle A žádná z těchto 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 zvětší 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, 18. května 2012 296 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 A1,f put_value A2,A5 put_value A3,A6 put_value A4,A7 execute b/4 Hana Rudová, Logické programování I, 18. kvetna 2012 297 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, 18. kvetna 2012 298 Preklad WAM - optimalizace 1. Indexace klauzulí 2. Generování optimální posloupnosti instrukcí WAMu 3. Odstranení redundancí pri generování cílového kódu. & Príklad: a(X,Y,Z) :- b(f,X,Y,Z). naivní kód (vytvorí kompilátor pracující striktne zleva doprava) vs. optimalizovaný kód (pocet registrů a tedy i pocet instrukcí/presunů 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é programování I, 18. kvetna 2012 298 Preklad Instrukce WAMu get instrukce put instrukce unify instrukce get_var Ai,Y put_var Ai,Y unify_var Y get_value Ai,Y put_value Ai,Y unify_value Y get_const Ai,C put_unsafe_value Ai,Y unify_local_value Y get_nil Ai put_const Ai,C unify_const C get_struct Ai,F/N put_nil Ai unify_nil get_list Ai put_struct Ai,F/N unify_void N put_list Ai instrukce rízení allocate deallocate call Proc/N,A execute Proc/N proceed indexacní instrukce try_me_else Next retry_me_else Next trust_me_else fail try Next retry Next trust fail cut_last save_cut Y load_cut Y switch_on_term Var,Const,List,Struct switch_on_const Table switch_on_struct Table Hana Rudová, Logické programování I, 1S. kvetna Z99 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 Hana Rudová, Logické programování I, 18. kvetna 2012 300 Preklad WAM - indexace Provázání klauzulí: instrukce XX_me_e1se: M první klauzule: try_me_e1se; založí bod volby i> poslední klauzule: trust_me_e1se; zruší nejmladší bod volby a ostatní klauzule: retry_me_e1se; znovu použije nejmladší bod volby po neúspechu ii> Provázání podmnožiny klauzulí (podle argumentu): S try retry -i- trust Hana Rudová, Logické programování I, 18. kvetna 2012 300 Preklad WAM - indexace Provázání klauzulí: instrukce XX_me_e1se: M první klauzule: try_me_e1se; založí bod volby i> poslední klauzule: trust_me_e1se; zruší nejmladší bod volby a ostatní klauzule: retry_me_e1se; znovu použije nejmladší bod volby po neúspechu ii> Provázání podmnožiny klauzulí (podle argumentu): S try -k retry -i- 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 switch_on_YY: hashovací tabulka pro konkrétní typ (konstanta, struktura) Hana Rudová, Logické programování I, 18. kvetna 2012 300 Preklad Příklad indexace instrukcí Procedure 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í instrukce 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é programování I, 18. kvetna 2012 301 Preklad WAM - rízení výpoctu & execute Proc: ekvivalentní príkazu goto Hana Rudová, Logické programování I, 18. kvetna 2012 302 Preklad WAM - řízení výpoCtu & execute Proc: ekvivalentní príkazu goto J5> proceed: zpracování faktu Hana Rudová, Logické programování I, 18. kvetna 2012 302 Preklad WAM - rízení výpočtu & execute Proc: ekvivalentní p ríkazu goto J5> proceed: zpracování faktu M allocate: alokuje okolí (pro nekteré klauzule net r eba, proto explicitne generováno) Hana Rudová, Logické programování I, 18. kvetna 2012 302 Preklad WAM - rízení výpoctu & execute Proc: ekvivalentní príkazu goto J5> proceed: zpracování faktů 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) Hana Rudová, Logické programování I, 18. kvetna 2012 302 Preklad WAM - r ízění výpočtu & execute Proc: ekvivalentní příkazu goto J5> proceed: zpracování faktU M allocate: alokuje okolí (pro některé klauzule netřeba, 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, 18. kvetna 2012 302 Preklad