IB013 .ogické programování I Hana Rudová jaro 2009 Hodnocení předmětu -• Zápočtový projekt: celkem až 40 bodů -• Průběžná písemná práce: až 30 bodů (základy programování v Prologu) M pro každého jediný termín: 25. března v učebně Dl M alternativní termín pouze v případech závažných důvodů pro neúčast 3 vzor písemky na webu předmětu -• Závěrečná písemná práce: až 1 50 bodů M vzor písemky na webu předmětu M opravný termín možný jako ústní zkouška M Hodnocení: součet bodů za projekt a za obě písemky M známka A za cca 1 75 bodů, známka F za cca 1 1 0 bodů M známka bude zapsána pouze těm, kteří dostanou zápočet za projekt Hana Rudová, Logické programování I, 20. května 2009 2 Organizace předmětu Základní informace -• Přednáška: účast není povinná nicméně ... M Cvičení: zápočet udělen za zápočtový projekt -• Web předmětu: interaktivní osnova na IS M průsvitky dostupné postupně v průběhu semestru M harmonogram výuky -• předběžný obsah výuky pro jednotlivé přednášky během semestru M elektronicky dostupné materiály M informace o zápočtových projektech M Obsah přednášky 3 základy programování v jazyce Prolog M teorie logického programováni -• logické programování s omezujícími podmínkami M implementace logického programováni Hana Rudová, Logické programování I, 20. května 2009 3 Organizace předmětu Literatura M Bratko, I. Prolog Programming for Artificial Intelligence. Addison-Wesley, 2001. M prezenčně v knihovně -• Clocksin, W. F. - Mellish, Ch. S. Programming in Prolog. Springer, 1 994. -• Sterling, L. - Shapiro, E. Y. The art of Prolog : advanced programming techniques. MIT Press, 1 987. -• Nerodě, A. - Shore, R. A. Logic for applications. Springer-Verlag, 1 993. M prezenčně v knihovně -• Dechter, R. Constraint Processing. Morgan Kaufmann Publishers, 2003. M prezenčně v knihovně + Elektronicky dostupné materiály (viz web předmětu) Hana Rudová, Logické programování I, 20. května 2009 4 Organizace předmětu Software: SICStus Prolog -• Doporučovaná implementace Prologu 3 Dokumentace: http://www.fi.muni.cz/~hanka/sicstus/doc/html M Komerční produkt Zakoupena licence pro instalace na domácí počítače studentů -• Podrobné informace nawebu předmětu Hana Rudová, Logické programování I, 20. května 2009 5 Organizace předmětu Cvičení -• Zaměřeno na praktické aspekty, u počítačů -• Skupiny: 3 skupina 01, sudý čtvrtek, první cvičení 19.února -• skupina 02, lichý čtvrtek, první cvičení 26.února -• Zápočtové projekty: Adriana Strejčkova 3 zápočtové projekty dostupné přes web předmětu -• podrobné pokyny k zápočtovým projektům na webu předmětu 3 vystavení projektů na webu předmětu: do 21.února -• zahájení registrace řešitelů projektu: 4. března -• předběžná analýza řešeného problému: 1. dubna -• termín pro odevzdání projektů: 20. května 3 předvádění projektů (po registraci): 1.června- 19.června Hana Rudová, Logické programování I, 20. května 2009 6 Organizace předmětu Průběžná písemná práce -• Pro každého jediný termín 25. března v učebně Dl -• Alternativní termín pouze v závažných důvodech pro neúčast M Celkem až 30 bodů (1 50 závěrečná písemka, 40 projekt) Hana Rudová, Logické programování I, 20. května 2009 7 Organizace předmětu OB ■*#■ Sď zna písemná prace -• Pro každého jediný termín 25. března v učebně Dl -• Alternativní termín pouze v závažných důvodech pro neúčast M Celkem až 30 bodů (1 50 závěrečná písemka, 40 projekt) -• 3 příklady, 40 minut -• Napsat zadaný predikát, porovnat chování programů M Obsah: první čtyři přednášky a první dvě cvičení -• Oblasti, kterých se budou příklady zejména týkat 3 unifikace -• seznamy -• backtracking -• optimalizace posledního volání M řez -• aritmetika M Ukázka průběžné písemné práce na webu Hana Rudová, Logické programování I, 20. května 2009 7 Organizace předmětu Úvod do Prologu Prolog -• PROgramming in LOGic 3 část predikátové logiky prvního řádu -• Deklarativní programování .# specifikacní jazyk, jasná sémantika, nevhodné pro procedurální postupy -• Co dělat namísto Jak dělat -• Základní mechanismy -• unifikace, stromové datové struktury, automatický backtracking Hana Rudová, Logické programování I, 20. května 2009 9 Úvod do Prologu Prolog: historie a současnost -• Rozvoj začíná po roce 1 970 3 Robert Kowalski - teoretické základy 3 Alain Colmerauer, David Warren (Warren Abstract Machine) - implementace -• pozdější rozšíření Prologu o logické programování s omezujícími podmínkami Hana Rudová, Logické programování I, 20. května 2009 10 Úvod do Prologu Prolog: historie a současnost -• Rozvoj začíná po roce 1 970 3 Robert Kowalski - teoretické základy 3 Alain Colmerauer, David Warren (Warren Abstract Machine) - implementace -• pozdější rozšíření Prologu o logické programování s omezujícími podmínkami -• Prolog v současnosti M zavedené aplikační oblasti, nutnost přidání inteligence Jt hypotéky; pediatrický sw; konfigurace a pravidla pro stanovení ceny objednávky; testovací nástroje, modelové testování; ... M náhrada procedurálního kódu Prologem vede k > desetinásobnému zmenšení kódu, řádově menšímu času na vývoj, jednodušší údržbě -• efektivita Prologu? 3* zrychlení počítačů + výrazné zvětšení nároků sw => ve prospěch kompaktnosti i rychlosti Prologu Hana Rudová, Logické programování I, 20. května 2009 10 Úvod do Prologu Program = fakta + pravidla 3 (Prologovský) program je seznam programových klauzulí 3 programové klauzule: fakt, pravidlo -• Fakt: deklaruje vždy pravdivé věci 3 clovek( novak, 18, student ). M Pravidlo: deklaruje věci, jejichž pravdivost závisí na daných podmínkách 3 studujeC X ) :- clovek( X, _Vek, student ). 3 alternativní (obousměrný) význam pravidel pro každé X, pro každé X, X studuje, jestliže X je student, potom X je student X studuje 3 pracujeC X ) :- clovek( X, _Vek, CoDela ), prace( CoDela ). Hana Rudová, Logické programování I, 20. května 2009 1 1 Úvod do Prologu Program = fakta + pravidla 3 (Prologovský) program je seznam programových klauzulí M programové klauzule: fakt, pravidlo -• Fakt: deklaruje vždy pravdivé věci 3 clovek( novak, 18, student ). M Pravidlo: deklaruje věci, jejichž pravdivost závisí na daných podmínkách 3 studujeC X ) :- clovek( X, _Vek, student ). M alternativní (obousměrný) význam pravidel pro každé X, pro každé X, X studuje, jestliže X je student, potom X je student X studuje 3 pracujeC X ) :- clovek( X, _Vek, CoDela ), prace( CoDela ). -• Predikát: množina pravidel a faktů se stejným funktorem a aritou 3 značíme: clovek/3, student/l; analogie procedury v procedurálních jazycích, Hana Rudová, Logické programování I, 20. května 2009 1 1 Úvod do Prologu Komentáře k syntaxi -• Klauzule ukončeny tečkou -• Základní příklady argumentů -• konstanty: (tomas, anna) ... začínají malým písmenem -• proměnné 3* X, Y ... začínají velkým písmenem -i* _, _A, _B ... začínají podtržítkem (nezajímá nás vracená hodnota) -• Psaní komentářů clovek( novak, 18, student ). % komentář na konci řádku clovek( novotny, 30, učitel ). /* komentář */ Hana Rudová, Logické programování I, 20. května 2009 12 Úvod do Prologu Dotaz -• Dotaz: uživatel se ptá programu, zda jsou věci pravdivé ?- studujeC novak). % yes splnitelný dotaz ?- studujeC novotny). % no nesplnitelný dotaz -• Odpověď na dotaz M positivní - dotaz je splnitelný a uspěl 3 negativní - dotaz je nesplnitelný a neuspěl Hana Rudová, Logické programování I, 20. května 2009 13 Úvod do Prologu Dotaz -• Dotaz: uživatel se ptá programu, zda jsou věci pravdivé ?- studujeC novak). % yes splnitelný dotaz ?- studujeC novotny). % no nesplnitelný dotaz -• Odpověď na dotaz M positivní - dotaz je splnitelný a uspěl M negativní - dotaz je nesplnitelný a neuspěl 3 Proměnné jsou během výpočtu instanciovány (= nahrazeny objekty) M ?- clovekC novak, 18, Prace ). -• výsledkem dotazu je instanciace proměnných v dotazu 3 dosud nenainstanciovaná proměnná: volná proměnná Hana Rudová, Logické programování I, 20. května 2009 13 Úvod do Prologu Dotaz -• Dotaz: uživatel se ptá programu, zda jsou věci pravdivé ?- studujeC novak). % yes splnitelný dotaz ?- studujeC novotny). % no nesplnitelný dotaz -• Odpověď na dotaz M positivní - dotaz je splnitelný a uspěl M negativní - dotaz je nesplnitelný a neuspěl 3 Proměnné jsou během výpočtu instanciovány (= nahrazeny objekty) M ?- clovekC novak, 18, Prace ). M výsledkem dotazu je instanciace proměnných v dotazu 3 dosud nenainstanciovaná proměnná: volná proměnná -• Prolog umí generovat více odpovědí pokud existují ?- clovek( novak, Vek, Prace ). % všechna řešení přes ";" Hana Rudová, Logické programování I, 20. května 2009 13 Úvod do Prologu Klauzule = fakt, pravidlo, dotaz -• Klauzule se skládá z hlavy a těla -• Tělo je seznam cílů oddělených čárkami, čárka = konjunkce -• Fakt: pouze hlava, prázdné tělo -• rodic( pavla, robert ). -• Pravidlo: hlava i tělo -• upracovany_clovek( X ) :- clovek( X, _Vek, Prace ), prace( Prace, tezka ). M Dotaz: prázdná hlava, pouze tělo -• ?- clovek( novak, Vek, Prace ). ?- rodicC pavla, Ditě ), rodic( Ditě, Vnuk ). Hana Rudová, Logické programování I, 20. května 2009 14 Úvod do Prologu Rekurzivní pravidla predekC X, Z ) :- rodic( X, Z ). % (1) predekC X, Z ) :- rodic( X, Y ), % (2) rodicC Y, Z ). Hana Rudová, Logické programování I, 20. května 2009 15 Úvod do Prologu Rekurzivní predekC X, Z ) :- rodic( X, Z ). predekC X, Z ) :- rodic( X, Y ), rodicC Y, Z ). predekC X, Z ) :- rodicC X, Y ), predekC Y, Z). Hana Rudová, Logické programování I, 20. května 2009 15 pravidla % CD % (2) % C2') Příklad: rodokmen rodi rodi rodi rodi rodi c( pavla, robert ). c( tomas, robert ). c( tomas, eliska ). c( robert, anna ). c( robert, petr ). rodic( petr, jirka ). predek( X, Z ) :- rodic( X, Z ). % (D predek( X, Z ) :- rodic( X, Y ), predek( Y, Z ). % (2') Hana Rudová, Logické programování I, 20. května 2009 16 Úvod do Prologu Výpočet odpovědi na dotaz ?- predek(tomas,robert) rodi rodi rodi rodi rodi c( pavla, robert ). c( tomas, robert ). c( tomas, eliska ). c( robert, anna ). c( robert, petr ). rodic( petr, jirka ). predek(tomas, robert) yes dle (1) Y rodic(tomas,robert) predek( X, Z ) :- rodic( X, Z ). predek( X, Z ) :- rodic( X, Y ), predek( Y, Z ). % (D % (2') Hana Rudová, Logické programování I, 20. května 2009 17 Úvod do Prologu Výpočet odpovědi na dotaz ?- predek(tomas, petr) predek(tomas, petr) dle (1) Y Y dle (2') no rodic( tomas, petr) rodic(tomas, Y) predek( Y, petr) rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, petr ). Y=robert Y dle rodic(tomas, robert) predek( robert, petr) predekC X, Z ) :- rodic( X, Z ). % (1) predekC X, Z ) :- rodic( X, Y ), % (2') predekC Y, Z ). Y dle (1) rodic(robert, petr) yes Hana Rudová, Logické programování I, 20. května 2009 18 Úvod do Prologu Odpověď na dotaz ?- predek(robert, Potomek) rodic( pavla, robert ). rodic( tomas, robert ). rodic( tomas, eliska ). rodic( robert, anna ). rodic( robert, petr ). rodic( petr, ji rka ). predek( X, Z ) :- rodic( X, Z ). predekC X, Z ) :- rodic( X, Y ), predekC Y, Z ) predek(robert,Potomek) --> ??? Hana Rudová, Logické programování I, 20. května 2009 19 Úvod do Prologu Syntaxe a význam Prologovských programů Syntaxe Prologovských programu M Typy objektů jsou rozpoznávány podle syntaxe -• Atom -• řetězce písmen, čísel, „_" začínající malým písmenem: pavel , pavel_novak, x25 -• řetězce speciálních znaků: <-->, ====> 3 řetězce v apostrofech: 'Pavel', 'Pavel Novák' -• Celá a reálná čísla: 0, -1056, 0.35 M Proměnná M řetězce písmen, čísel, „_" začínající velkým písmenem nebo „_" M anonymní proměnná: ma_dite(X) :- rodic( X, _ ). «i* hodnotu anonymní proměnné Prolog na dotaz nevrací: ?- rodic( X, _ ) M lexikální rozsah proměnné je pouze jedna klauzule: prvni(X,X,X). prvni(X,X,_)■ Hana Rudová, Logické programování I, 20. května 2009 21 Syntaxe a význam Prologovských programů Termy M Term - datové objekty v Prologu: datum( 1, kveten, 2003 ) M funktor: datum 3 argumenty: 1, kveten, 2003 3 arita - počet argumentů: 3 -• Všechny strukturované objekty v Prologu jsou stromy -• trojuhelnikC bod(4,2), bod(6,4), bod(7,l) ) -• Hlavní funktor termu - funktor v kořenu stromu odpovídající termu 3 trojuhelnikje hlavní funktor v trojuhelnikC bod(4,2), bod(6,4), bod(7,l) ) Hana Rudová, Logické programování I, 20. května 2009 22 Syntaxe a význam Prologovských programů Unifikace -• Termy jsou unifikovatelné, jestliže M jsou identické nebo M proměnné v obou termech mohou být instanciovany tak, že termyjsou po substituci identické M datumC Dl, Ml, 2003 ) = datum( 1, M2, Y2) operátor = Dl =1, Ml = M2, Y2 = 2003 Hana Rudová, Logické programování I, 20. května 2009 23 Syntaxe a význam Prologovských programů Unifikace -• Termy jsou unifikovatelné, jestliže M jsou identické nebo M proměnné v obou termech mohou být instanciovany tak, že termyjsou po substituci identické M datumC Dl, Ml, 2003 ) = datum( 1, M2, Y2) operátor = Dl =1, Ml = M2, Y2 = 2003 -• Hledáme nejobecnější unifikátor (most general unifier (MGU) M jiné instanciace? ... Dl = 1, Ml = 5 , Y2 = 2003 ... není MGU ^ ?- datum( Dl, Ml, 2003 ) = datum( 1, M2, Y2), Dl = Ml. Hana Rudová, Logické programování I, 20. května 2009 23 Syntaxe a význam Prologovských programů Unifikace -• Termy jsou unifikovatelné, jestliže M jsou identické nebo M proměnné v obou termech mohou být instanciovany tak, že termyjsou po substituci identické M datumC Dl, Ml, 2003 ) = datum( 1, M2, Y2) operátor = Dl =1, Ml = M2, Y2 = 2003 -• Hledáme nejobecnější unifikátor (most general unifier (MGU) M jiné instanciace? ... Dl = 1, Ml = 5 , Y2 = 2003 ... není MGU ^ ?- datum( Dl, Ml, 2003 ) = datum( 1, M2, Y2), Dl = Ml. -• 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, 20. května 2009 23 Syntaxe a význam Prologovských programů Unifikace Termy S a T jsou unifikovatelné, jestliže 1 . S a T jsou konstanty a tyto konstantyjsou identické; 2. S je proměnná a T cokolivjineho - S je instanciovana na T; Tje proměnná a S cokolivjineho - Tje instanciovana na S 3. S a T jsou termy význam mají logické relace Hana Rudová, Logické programování I, 20. května 2009 25 Syntaxe a význam Prologovských programů Deklarativní a procedurální význam programů -• p :- q, r. -• Deklarativní: Co je výstupem programu? 3 p je pravdivé, jestliže q a r jsou pravdivé J Zqar plyne p => význam mají logické relace -• Procedurální: Jak vypočítáme výstup programu? -• p vyřešíme tak, že nejprve vyřešíme q a pak r => kromě logických relací je významné i pořadí cílů -• výstup ±* indikátor yes/no určující, zda byly cíle splněny instanciace proměnných v případě splnění cílů Hana Rudová, Logické programování I, 20. května 2009 25 Syntaxe a význam Prologovských programů Deklarativní význam programu Máme-li program a cíl G, pak deklarativní význam říká: cíl G je splnitelný právě 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 těle I jsou pravdivé. Instance klauzule: proměnné v klauzuli jsou substituovány termem M ma_dite(X) :- rodic( X, Y ). % klauzule ma_dite(petr) :- rodic( petr, Z ). % instance klauzule Hana Rudová, Logické programování I, 20. května 2009 26 Syntaxe a význam Prologovských programů Konjunce "," vs. disjunkce ";" cílů -• Konjunce = nutné splnění všech cílů M p :- q, r. -• Disjunkce = stačí splnění libovolného cíle M p :- q; r. p :- q. p : - r. -• priorita středníku je vyšší: p :- q, r; s, t, u. p :- (q, r) ; (s, t, u). p :- q, r. p :- s, t, u. Hana Rudová, Logické programování I, 20. května 2009 27 Syntaxe a význam Prologovských programů r^v I'll i' 'i ° Poradí klauzuli a cílu (a) a(l). ?- a(l). a(X) :- b(X,Y), a(Y). bCl.l). Hana Rudová, Logické programování I, 20. května 2009 28 Syntaxe a význam Prologovských programů r^v I'll i' 'i ° Poradí klauzuli a cílu (a) a(l). ?- a(l). a(X) :- b(X,Y), a(Y). bCl.l). (b) a(X) :- b(X,Y), a(Y) . % změněné pořadí klauzulí v programu vzhledem k (a) a(l). bCl.l). Hana Rudová, Logické programování I, 20. května 2009 28 Syntaxe a význam Prologovských programů r^v I'll i' 'i ° Poradí klauzuli a cílu Ca) a(l). ?- a(l). a(X) :- b(X,Y), a(Y). b(l,l). (b) a(X) :- b(X,Y), a(Y) . % změněné pořadí klauzulí v programu vzhledem k (a) a(l). b(l, 1) . % nenalezení odpovědi: nekonečný cyklus Hana Rudová, Logické programování I, 20. května 2009 28 Syntaxe a význam Prologovských programů r^v I'll i' 'i ° Poradí klauzuli a cílu (a) a(l). ?- a(l). a(X) :- b(X,Y), a(Y). bCl.l). (b) a(X) :- b(X,Y), a(Y) . % změněné pořadí klauzulí v programu vzhledem k (a) a(l). b(l,l). % nenalezení odpovědi: nekonečný cyklus (c) a(X) :- b(X,Y), c(Y). ?- a(X). bCl.l). c(2). cd). Hana Rudová, Logické programování I, 20. května 2009 28 Syntaxe a význam Prologovských programů r^v I'll i' 'i ° Poradí klauzuli a cílu (a) a(l). ?- a(l). a(X) :- b(X,Y), a(Y). bCl.l). (b) a(X) :- b(X,Y), a(Y) . % změněné pořadí klauzulí v programu vzhledem k (a) a(l). b(l,l). % nenalezení odpovědi: nekonečný cyklus (c) a(X) :- b(X,Y), c(Y). ?- a(X). bCl.l). c(2). cd). (d) a(X) :- c(Y), b(X,Y). % změněné pořadí cílů v těle klauzule vzhledem k (c) b(l,l). c(2). cd). Hana Rudová, Logické programování I, 20. května 2009 28 Syntaxe a význam Prologovských programů r^v I'll i' 'i ° Poradí klauzuli a cílu Ca) a(l). ?- a(l). a(X) :- b(X,Y), a(Y). b(l,l). (b) a(X) :- b(X,Y), a(Y) . % změněné pořadí klauzulí v programu vzhledem k (a) a(l). b(l, 1) . % nenalezení odpovědi: nekonečný cyklus (c) a(X) :- b(X,Y), c(Y). ?- a(X). b(l,l). c(2). cd). (d) a(X) :- c(Y), b(X,Y). % změněné pořadí cílů v těle klauzule vzhledem k (c) b(l,l). c(2). c(l) . % náročnější nalezení první odpovědi než u (c) V obou případech stejný deklarativní ale odlišný procedurální význam Hana Rudová, Logické programování I, 20. května 2009 28 Syntaxe a význam Prologovských programů í klauzulí a cílu I. (1) a(X) :- c(Y), b(X,Y) (2) b(l,l). (3) c(2). (4) c(l). ?- a(X). a(X) dle(1) c(Y), b(X,Y) dle(3)/Y=2 dle(4KY=1 b(X,2) no b(X,1) die (2) X=1 yes Hana Rudová, Logické programování I, 20. května 2009 29 Syntaxe a význam Prologovských programů í klauzulí a cílu I. (1) a(X) :- c(Y), b(X,Y) (2) b(l,l). (3) c(2). (4) c(l). Vyzkoušejte si: a(X) :- b(X,X), c(X). a(X) :- b(X,Y), c(X). b(2,2). b(2,l). c(l). ?- a(X). a(X) dle(1) c(Y), b(X,Y) dle(3)/Y=2 dle(4KY=1 b(X,2) no b(X,1) die (2) X=1 yes Hana Rudová, Logické programování I, 20. května 2009 29 Syntaxe a význam Prologovských programů Operátory, aritmetika Operátory -• Infixová notace: 2*a + b*c -• Prefixová notace:+( *(2,a), *(b>,c) ) priorita +: 500, priorita*: 400 M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor Hana Rudová, Logické programování I, 20. května 2009 31 Operátory, aritmetika Operátory -• Infixová notace: 2*a + b*c -• Prefixová notace:+( *(2,a), *(b>,c) ) priorita +: 500, priorita*: 400 M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor -• Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). -• Definice operátoru: :- op( 600, xfx, zna ). priorita: l..l200 Hana Rudová, Logické programování I, 20. května 2009 31 Operátory, aritmetika Operátory -• Infixová notace: 2*a + b*c -• Prefixová notace:+( *(2,a), *(b>,c) ) priorita +: 500, priorita*: 400 M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor -• Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). -• Definice operátoru: :- op( 600, xfx, zna ). priorita: l..l200 -• :- op( 1100, xfy, ; ). nestrukturované objekty: 0 :- op( 1000, xfy, , ). p :- q, r; s, t. p :- (q, r) ; (s, t). ; má vyšší prioritu než , M :- op( 1200, xfx, :- ). :-má nejvyšší prioritu Hana Rudová, Logické programování I, 20. května 2009 31 Operátory, aritmetika Operátory -• Infixová notace: 2*a + b*c -• Prefixová notace:+( *(2,a), *(b>,c) ) priorita +: 500, priorita*: 400 M Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor -• Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). -• Definice operátoru: :- op( 600, xfx, zna ). priorita: l..l200 -• :- op( 1100, xfy, ; ). nestrukturované objekty: 0 :- op( 1000, xfy, , ). p :- q, r; s, t. p :- (q, r) ; (s, t). ; má vyšší prioritu než , M :- op( 1200, xfx, :- ). :-má nejvyšší prioritu -• Definice operátoru není spojena s datovými manipulacemi (kromě speciálních případů) Hana Rudová, Logické programování I, 20. května 2009 31 Operátory, aritmetika Typy operátorů Typy operátorů M infixové operátory: xfx, xfy, yfx M prefixové operátory: fx, fy -• postfixové operátory: xf, yf př. xfx = yfx př. fx ?- fy v ■ * x a y určuji prioritu argumentu M x reprezentuje argument, jehož priorita musí být striktně menší než u operátoru 3 y reprezentuje argument, jehož priorita je menší nebo rovna operátoru M a-b-c odpovídá (a-b)-c a ne a-(b-c): „-" odpovídá yfx správne priorita: 0 priorita: 0 chybně priorita: 500 priorita: 500 Hana Rudová, Logické programování I, 20. května 2009 32 Operátory, aritmetika Aritmetika -• Předdefinované operátory + , -, *i /, ** mocnina, // celočíselné děleni, mod zbytek po dělení M ?- X = 1 + 2. X=l + 2 = odpovídá unifikaci J?-Xis 1+2. X = 3 „is" je speciální předdefinovaný operátor, který vynutí evaluaci Hana Rudová, Logické programování I, 20. května 2009 33 Operátory, aritmetika Aritmetika -• Předdefinované operátory + , -, *i /, ** mocnina, // celočíselné děleni, mod zbytek po dělení M ?- X = 1 + 2. X=l + 2 = odpovídá unifikaci J?-Xis 1+2. X = 3 „is" je speciální předdefinovaný operátor, který vynutí evaluaci 3 porovnej: N = (1+1+1+1+1) N is (1+1+1+1+1) Hana Rudová, Logické programování I, 20. května 2009 33 Operátory, aritmetika Aritmetika -• Předdefinované operátory + , -, *i /, ** mocnina, // celočíselné děleni, mod zbytek po dělení M ?- X = 1 + 2. X=l + 2 = odpovídá unifikaci J?-Xis 1+2. X = 3 „is" je speciální předdefinovaný operátor, který vynutí evaluaci 3 porovnej: N = (1+1+1+1+1) N is (1+1+1+1+1) S pravá strana musí být vyhodnotitelný výraz (bez proměnné) volání?- X is Y + 1. způsobí chybu Hana Rudová, Logické programování I, 20. května 2009 33 Operátory, aritmetika Aritmetika -• Předdefinované operátory + , -, *i /, ** mocnina,// celočíselné děleni, mod zbytek po dělení M ?- X = 1 + 2. X=l + 2 = odpovídá unifikaci M ?- X is 1 + 2. X = 3 „is" je speciální předdefinovaný 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 proměnné) volání?- X is Y + 1. způsobí chybu -• Další speciální předdefinované operátory >, <, >=, =<, =: = aritmetická rovnost, =\= aritmetická nerovnost M porovnej: 1+2 =:= 2+1 1+2 = 2+1 Hana Rudová, Logické programování I, 20. května 2009 33 Operátory, aritmetika Aritmetika -• Předdefinované operátory + , -, *i /, ** mocnina,// celočíselné děleni, mod zbytek po dělení M ?- X = 1 + 2. X=l + 2 = odpovídá unifikaci M ?- X is 1 + 2. X = 3 „is" je speciální předdefinovaný 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 proměnné) volání?- X is Y + 1. způsobí chybu -• Další speciální předdefinované operátory >, <, >=, =<, =: = aritmetická rovnost, =\= aritmetická nerovnost M porovnej: 1+2 =:= 2+1 1+2 = 2+1 M obě strany musí být vyhodnotitelný výraz: volání ?- 1 < A + 2. způsobí chybu Hana Rudová, Logické programování I, 20. května 2009 33 Operátory, aritmetika Různé typy rovností a porovnání X = Y XaY jsou unifikovatelné X \= Y XaY nejsou unifikovatelné, (také \+ X = Y) Hana Rudová, Logické programování I, 20. května 2009 34 Operátory, aritmetika Různé typy rovností a porovnání X = Y XaY jsou unifikovatelné X \= Y XaY nejsou unifikovatelné, (také \+ X = Y) X == Y XaY jsou identické porovnej: ?-A == B. ... no ?- A=B, A==B. Hana Rudová, Logické programování I, 20. května 2009 34 Operátory, aritmetika Různé typy rovností a porovnání X = Y XaY jsou unifikovatelné X \= Y XaY nejsou unifikovatelné, (také \+ X = Y) X == Y XaY jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X \== Y XaY nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no Hana Rudová, Logické programování I, 20. května 2009 34 Operátory, aritmetika Různé typy rovností a porovnání X = Y XaY jsou unifikovatelné X \= Y XaY nejsou unifikovatelné, (také \+ X = Y) X == Y XaY jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X \== Y XaY nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no X is Y Y je aritmeticky vyhodnoceno a výsledek je přiřazen X X =:= Y X a Y jsou si aritmeticky rovny X =\= Y XaY si aritmeticky nejsou rovny X < Y aritmetická hodnota X je menší než Y (=<, >, >=) Hana Rudová, Logické programování I, 20. května 2009 34 Operátory, aritmetika Různé typy rovností a porovnání X = Y XaY jsou unifikovatelné X \= Y XaY nejsou unifikovatelné, (také \+ X = Y) X == Y XaY jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X \== Y XaY nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no X is Y Y je aritmeticky vyhodnoceno a výsledek je přiřazen X X =:= Y X a Y jsou si aritmeticky rovny X =\= Y XaY si aritmeticky nejsou rovny X < Y aritmetická hodnota X je menší než Y (=<, >, >=) X @< Y term X předchází term Y (@=<, @>, @>=) 1. porovnání termů: podle alfabetického n. aritmetického uspořádání 2. porovnání struktur: podle arity, pak hlavního funktoru a pak zleva podle argumentů Hana Rudová, Logické programování I, 20. května 2009 34 Operátory, aritmetika Různé typy rovností a porovnání X = Y XaY jsou unifikovatelné X \= Y XaY nejsou unifikovatelné, (také \+ X = Y) X == Y XaY jsou identické porovnej: ?- A == B. ... no ?- A=B, A==B. ... B = A yes X \== Y XaY nejsou identické porovnej: ?- A \== B. ... yes ?- A=B, A \== B. ... A no X is Y Y je aritmeticky vyhodnoceno a výsledek je přiřazen X X =:= Y X a Y jsou si aritmeticky rovny X =\= Y XaY si aritmeticky nejsou rovny X < Y aritmetická hodnota X je menší než Y (=<, >, >=) X @< Y term X předchází term Y (@=<, @>, @>=) 1. porovnání termů: podle alfabetického n. aritmetického uspořádání 2. porovnání struktur: podle arity, pak hlavního funktoru a pak zleva podle argumentů ?- f( pavel, g(b)) @< f( pavel, h (a)). ... yes Hana Rudová, Logické programování I, 20. května 2009 34 Operátory, aritmetika Prolog: příklady Příklad: průběh a :- b,c,d. b :- e,c,f,g. b :- g,h. c. d. e : - i . e : - h. g- h. i . Jak vypadá průběh výpočtu pro dotaz ?- a. Hana Rudová, Logické programování I, 20. května 2009 36 i/ý počtu Prolog: příklad Příklad: věž z kostek Příklad: postavte věž zadané velikosti ze tří různě velkých kostek tak, že kostka smí ležet pouze na větší kostce. Hana Rudová, Logické programování I, 20. května 2009 37 Prolog: příklad Příklad: věž z kostek Příklad: postavte věž zadané velikosti ze tří různě velkých kostek tak, že kostka smí ležet pouze na větší kostce. kostka(mala). kostka(stredni). kostka(velka). vetsi(zeme,velká). vetsi(zeme,střední). vetsi(zeme,mala). vetsi(velka,strední). vetsi(velká,mal a). vetsi(stredni,mala). % ?- postav_vez(vez(zeme,0), vez(Kostka,0)). % ?- postav_vez(vez(zeme,0), vez(Kostka,3)). Hana Rudová, Logické programování I, 20. května 2009 37 Prolog: příklad Příklad: věž z kostek Příklad: postavte věž zadané velikosti ze tří různě velkých kostek tak, že kostka smí ležet pouze na větší kostce. kostka(mala). kostka(stredni). kostka(velka). vetsi(zeme,velká). vetsi(zeme,střední). vetsi(zeme,mala). vetsi(velka,strední). vetsi(velká,mal a). vetsi(stredni,mala). % ?- postav_vez(vez(zeme,0), vez(Kostka,0)). % ?- postav_vez(vez(zeme,0), vez(Kostka,3)). postav_vez( Vez, Vez ). postav_vez( Vstup, Vystup ) :- pridej_kostku( Vstup, Přidáni ), postav_vez( Přidáni, Vystup ). pridej_kostku( Vstup, Přidáni ) :- Vstup = vez( Vrchol, Vyska ), kostka( Kostka ), vetsi( Vrchol, Kostka ), NovaVyska is Vyska + 1, Přidáni = vez( Kostka, NovaVyska ). Hana Rudová, Logické programování I, 20. května 2009 37 Prolog: příklad Řez, negace Rez f(X.O) :- X < 3 f(X,2) :- 3 =< X, X < 6 f(X,4) :- 6 =< X. Hana Rudová, Logické programování I, 20. května 2009 a upnutí přidáni operátoru řezu ?- f(l,Y), Y>2. 39 Řez, negace Rez a upnutí f(X.O) f(X,2) f(X,4) - X < 3, !. - 3 =< X, X < 6 - 6 =< X. v ■ | * * pndam operátoru rezu , , > j ?- f(l,Y), Y>2 M Upnutí: po splnění podcílů před řezem se už další klauzule neuvažují Hana Rudová, Logické programování I, 20. května 2009 39 Řez, negace Rez a upnutí f(X.O) :- X < 3, !. f(X,2) :- 3 =< X, X < 6 f(X,4) :- 6 =< X. V ■ I * * pndam operátoru rezu , , > j ?- f(l,Y), Y>2. f(X,0) :- X < 3, !. %(1) f(X,2) :- X < 6, !. %(2) f(X,4). M Upnutí: po splnění podcílů před řezem se už další klauzule neuvažují Hana Rudová, Logické programování I, 20. května 2009 39 Řez, negace Rez a upnutí f(X.O) :- X < 3, !. f(X,2) :- 3 =< X, X < 6 f(X,4) :- 6 =< X. V ■ I * * pridaní operátoru rezu > j i j ?- f(l,Y), Y>2. f(X,0) :- X < 3, !. %(1) f(X,2) :- X < 6, !. %(2) f(X,4). ?- f(l,Y). -• Smazání řezu v (1) a (2) změní chování programu -• Upnutí: po splnění podcílů před řezem se už další klauzule neuvažují Hana Rudová, Logické programování I, 20. května 2009 39 Řez, 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(l,Z). Hana Rudová, Logické programování I, 20. května 2009 40 Řez, 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(l,Z). Z = 2 ? ; Z = 3 ? ; no Hana Rudová, Logické programování I, 20. května 2009 40 Řez, negace Rez a ořezání f(X,Y) :- s(X,Y). s(X.Y) :- Y is X + 1 s(X,Y) :- Y is X + 2 ?- f(i,z) ■ Z = 2 ? ; Z = 3 ? ; no fCX,Y) :- s(X,Y), !. s(X,Y) :- Y is X + 1 s(X,Y) :- Y is X + 2 ?_ f(i,z) Ořezání: po splnění podcílů před řezem se už neuvažuje další možné splnění těchto podcílů Hana Rudová, Logické programování I, 20. května 2009 40 Řez, negace Rez a ořezání f (X, Y) s(X,Y) s(X,Y) - s(X,Y). - Y is X + 1 - Y is X + 2 f (X, Y) s(X,Y) s(X,Y) - s(X,Y), !. - Y is X + 1 - Y is X + 2 ?- f(l,Z) Z = 2 ? ; Z = 3 ? ; no ?- f(l,Z) Z = 2 ? ; no Ořezání: po splnění podcílů před řezem se už neuvažuje další možné splnění těchto podcílů Smazání řezu změní chování programu Hana Rudová, Logické programování I, 20. května 2009 40 Řez, negace Chování operátoru řezu Předpokládejme, že klauzule H :- TI, T2, ..., Trn, !, ...Tn.je aktivována voláním cíle G, který je u n ifi kováte Iný s H. G=h(X,Y) V momentě, kdy je nalezen řez, existuje řešení cílů TI, ..., Trn X=1,Y=1 Ořezání: při provádění řezu se už další možné splnění cílů TI, ..., Trn nehledá a všechny ostatní alternativy jsou odstraněny Y=2 Upnutí: dále už nevyvolávám další klauzule, jejichž hlava je také X=2 u n ifi kováte Iná s G ?- h(X,Y). h(X,Y) X=l / \ X=2 h(l,Y) :- tl(Y), ! h(2,Y) :- a. tl(Y) a (vynechej: upnutí) Y=l / \ Y=2 ^ ) ■- b. b c (vynechej: ořezání) tl(2) :- c. / Hana Rudová, Logické programování I, 20. května 2009 41 Řez, negace Řez: příklad c(X) :- p(X). c(X) :- v(X). p(l). p(2). v(2). ?- c(2). Hana Rudová, Logické programování I, 20. května 2009 42 Řez, negace Řez: příklad c(X) :- p(X). c(X) :- v(X). p(l). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c(X). Hana Rudová, Logické programování I, 20. května 2009 42 Řez: příklad c(X) :- p(X). c(X) :- v(X). p(l). p(2). v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- c(X). X = 1 ? ; %p(l) X = 2 ? ; %p(2) X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 20. května 2009 42 c(X) :- p(X). c(X) :- v(X). Rez: příklad cl(X) :- p(X), ! cl(X) :- v(X). P(l). p(2) v(2) ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- cl(2) ?_ c (X). x = 1 ? ; %p(D x = 2 ? ; %p(2) x = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 20. května 2009 42 Řez, negace c(X) :- p(X), c(X) :- v(X). Rez: příklad cl(X) :- p(X), ! cl(X) :- v(X). P(D. P(2) v(2). ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- cl(2). true ? ; %p(2) no ?- c(X). ?- cl(X) X = 1 ? ; %p(D X = 2 ? ; %p(2) X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 20. května 2009 42 Řez, negace c(X) :- p(X). c(X) :- v(X). Rez: cl(X) cl(X) P(l). P(2) v(2) ?- c(2). true ? ; %p(2) true ? ; %v(2) no ?- cl(2) true ? no ?- c(X). ?- cl(X) X = 1 ? ; %p(D X = 1 ? X = 2 ? ; %p(2) no X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 20. května 2009 42 íklad P(X), ! v (X). ; %p(2) ; %p(D Řez, negace Řez: cvičení 1. Porovnejte chování uvedených programů pro zadané dotazy. a(X,X) :- b(X). a(X,X) :- b(X),!. a(X,X) :- b(X),c. a(X,Y) :- Y is X+l. a(X,Y) :- Y is X+l. a(X,Y) :- Y is X+l. b(X) :- X > 10. b(X) :- X > 10. b(X) :- X > 10. c ■- ' ?- a(X,Y). ?- a(l,Y). ?- a(ll,Y). 2. Napište predikát pro výpočet maxima max( X, Y, Max ) Hana Rudová, Logické programování I, 20. května 2009 43 Řez, negace Typy řezu -• Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet -• Zelený řez: odstraní pouze neúspěšná odvození 3 f(X,l) :- X >= 0, !. f(X,-l) :- X < 0. Hana Rudová, Logické programování I, 20. května 2009 44 Řez, negace Typy řezu -• Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet -• Zelený řez: odstraní pouze neúspěšná odvození M f(X,l) :- X >= 0, !. f(X,-l) :- X < 0. bez řezu zkouším pro nezáporná čísla 2. klauzuli Hana Rudová, Logické programování I, 20. května 2009 44 Řez, negace Typy řezu -• Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet -• Zelený řez: odstraní pouze neúspěšná odvození M f(X,l) :- X >= 0, !. f(X,-l) :- X < 0. bez řezu zkouším pro nezáporná čísla 2. klauzuli -• Modrý řez: odstraní redundantní řešení -• f(X,l) :- X >= 0, !. f(0,l). f(X,-l) :- X < 0. Hana Rudová, Logické programování I, 20. května 2009 44 Řez, negace Typy řezu -• Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet -• Zelený řez: odstraní pouze neúspěšná odvození M f(X,l) :- X >= 0, !. f(X,-l) :- X < 0. bez řezu zkouším pro nezáporná čísla 2. klauzuli -• Modrý řez: odstraní redundantní řešení -• f(X,l) :- X >= 0, !. f(0,l). f(X,-l) :- X < 0. bez řezu vrací f(0,l) 2x Hana Rudová, Logické programování I, 20. května 2009 44 Řez, negace Typy řezu -• Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet -• Zelený řez: odstraní pouze neúspěšná odvození M f(X,l) :- X >= 0, !. f(X,-l) :- X < 0. bez řezu zkouším pro nezáporná čísla 2. klauzuli -• Modrý řez: odstraní redundantní řešení -• f(X,l) :- X >= 0, !. f(0,l). f(X,-l) :- X < 0. bez řezu vrací f(0,l) 2x 3 Červený řez: odstraní úspěšná řešení M f(X,l) :- X >= 0, !. f(_X,-l). Hana Rudová, Logické programování I, 20. května 2009 44 Řez, negace Typy řezu -• Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet -• Zelený řez: odstraní pouze neúspěšná odvození M f(X,l) :- X >= 0, !. f(X,-l) :- X < 0. bez řezu zkouším pro nezáporná čísla 2. klauzuli -• Modrý řez: odstraní redundantní řešení -• f(X,l) :- X >= 0, !. f(0,l). f(X,-l) :- X < 0. bez řezu vrací f(0,l) 2x 3 Červený řez: odstraní úspěšná řešení M f(X,l) :- X >= 0, !. f(_X,-l). bez řezu uspěje 2. klauzule pro nezáporná čísla Hana Rudová, Logické programování I, 20. května 2009 44 Řez, negace Negace jako neúspěch -• Speciální cíl pro nepravdu (neúspěch) fail a pravdu true -• X a Y nejsou unifikovatelné: different (X, Y) M different C X, Y ) :- X = Y, !, fail. differentC _X, _Y ). -• Xje muž: muz(X) muz( X ) :- zena( X ), !, fail. muz( _X ) . Hana Rudová, Logické programování I, 20. května 2009 45 Řez, negace Negace jako neúspěch: operátor \+ M different(X,Y) :- X = Y, !, fail. muz(X) :- zena(X), !, fail. different(_X,_Y). muz(_X). -• Unární operátor \+ P 3 jestliže P uspěje, potom \+ P neuspěje \+(P) :- P, !, fail. 3 v opačném případě \+ P uspěje Hana Rudová, Logické programování I, 20. května 2009 46 Řez, negace Negace jako neúspěch: operátor \+ M different(X,Y) :- X = Y, !, fail. muz(X) :- zena(X), !, fail. different(_X,_Y). muz(_X). -• Unární operátor \+ P 3 jestliže P uspěje, potom \+ P neuspěje \+(P) :- P, !, fail. 3 v opačném případě \+ P uspěje -• differentC X, Y ) :- \+ X=Y. M muz( X ) :- \+ zena( X ). M Pozor: takto definovaná negace \+P vyžaduje konečné odvození P Hana Rudová, Logické programování I, 20. května 2009 46 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (ID dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (ID dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- dobre( X ), rozumne( X ). Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % CD dobre( bmw ). % (2) drane( bmw ). % (3) rozumneC Auto ) :- % (4) \+ drahe( Auto ) ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % CD dobre( bmw ). % (2) drane( bmw ). % (3) rozumneC Auto ) :- % (4) \+ drahe( Auto ) ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle(1),X/citroen rozumne(citroen) Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % CD dobre( bmw ). % (2) drane( bmw ). % (3) rozumneC Auto ) :- % (4) dobre(X),rozumne(X) dle(1),X/citroen \+ drahe( Auto ) rozumne(citroen) die (4) \+ drahe(citroen) ?- dobre( X ), rozumne( X ). Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % CD 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) die (4) \+ drahe(citroen) die (I) drahe(citroen),!, fail Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % CD 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) die (4) \+ drahe(citroen) die (I) drahe(citroen),!, fail Hana Rudová, Logické programování I, 20. května 2009 47 no Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (II) dobre( citroen ). % CD 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) die (4) \+ drahe(citroen) die (I) drahe(citroen),!, fail die (II) yes no Hana Rudová, Logické programování I, 20. května 2009 47 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (ID dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). Hana Rudová, Logické programování I, 20. května 2009 48 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (ID dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). Hana Rudová, Logické programování I, 20. května 2009 48 Řez, negace \+(P) :- P, !, fail. % (I) \+(_). % (II) Negace a proměnné rozumne(X), dobre(X) dobre( citroen ). % CD dobre( bmw ). % (2) drane( bmw ). % (3) rozumneC Auto ) :- % (4) \+ drahe( Auto ) ?- rozumne( X ), dobre( X ). Hana Rudová, Logické programování I, 20. května 2009 48 Řez, negace \+(P) : -P, ! , fail. % (I) % (ID Negace a proměnné rozumne(X), dobre(X) dobre( citroen ). dobre( bmw ). drahe( bmw ). rozumne( Auto ) :-\+ drahe( Auto ) % CD % (2) % (3) % (4) die (4) \+ drahe(X), dobre(X) ?- rozumne( X ), dobre( X ). Hana Rudová, Logické programování I, 20. května 2009 48 Řez, negace \+(P) : \+C_). -P, !, fail. % (I) % (II) Negace a proměnné rozumne(X), dobre(X) dobre( citroen ). dobre( bmw ). drane( bmw ). rozumneC Auto ) :-\+ drahe( Auto ) % CD % C2) % C3) % C4) die (4) \+ drahe(X), dobre(X) die (I) drahe(X),!,fail,dobre(X) ?- rozumneC X ), dobreC X ). Hana Rudová, Logické programování I, 20. května 200g 48 Řez, negace \+(P) : \+C_). -P, !, fail. % (I) % (II) Negace a proměnné rozumne(X), dobre(X) dobre( citroen ). dobre( bmw ). drane( bmw ). rozumneC Auto ) :-\+ drahe( Auto ) % CD % C2) % C3) % C4) die (4) \+ drahe(X), dobre(X) die (I) drahe(X),!,fail,dobre(X) die (3), X/bmw !, fail, dobre(bmw) ?- rozumneC X ), dobreC X ). Hana Rudová, Logické programování I, 20. května 200g 48 Řez, negace \+(P) : \+C_). -P, !, fail. % (I) % (II) Negace a proměnné rozumne(X), dobre(X) dobre( citroen ). dobre( bmw ). drane( bmw ). rozumneC Auto ) :-\+ drahe( Auto ) % CD % C2) % C3) % C4) ?- rozumneC X ), dobreC X ). die (4) \+ drahe(X), dobre(X) die (I) drahe(X),!,fail,dobre(X) die (3), X/bmw !, fail, dobre(bmw) fail,dobre(bmw) Hana Rudová, Logické programování I, 20. května 2009 48 Řez, negace \+(P) : \+C_). -P, !, fail. % (I) % (II) Negace a proměnné rozumne(X), dobre(X) dobre( citroen ). dobre( bmw ). drane( bmw ). rozumneC Auto ) :-\+ drahe( Auto ) % CD % C2) % C3) % C4) ?- rozumneC X ), dobreC X ). die (4) \+ drahe(X), dobre(X) die (I) drahe(X),!,fail,dobre(X) die (3), X/bmw !, fail, dobre(bmw) fail,dobre(bmw) no Hana Rudová, Logické programování I, 20. května 2009 48 Řez, negace Bezpečný cíl ?- rozumneC citroen ). yes ?- rozumneC X ). no ?- \+ draheC citroen ). yes ?- \+ draheC X ). no \+ P je bezpečný: proměnné P jsou v okamžiku volání P instanciovany M negaci používáme pouze pro bezpečný cíl P Hana Rudová, Logické programování I, 20. května 2009 49 Řez, negace Chování negace M ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no M Negace jako neúspěch používá předpoklad uzavřeného světa 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, 20. května 2009 50 Řez, negace Chování negace M ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no M Negace jako neúspěch používá předpoklad uzavřeného světa 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 ) -• ?- drahe( X ). VÍME: existuje X takové, že drahe( X ) platí -• ALE: pro cíle s negací neplatí existuje X takové, že \+ drahe( X ) Hana Rudová, Logické programování I, 20. května 2009 50 Řez, negace Chování negace M ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no M Negace jako neúspěch používá předpoklad uzavřeného světa 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 ) -• ?- drahe( X ). VÍME: existuje X takové, že drahe( X ) platí -• ALE: pro cíle s negací neplatí existuje X takové, že \+ drahe( X ) => negace jako neúspěch není ekvivalentní negaci v matematické logice Hana Rudová, Logické programování I, 20. května 2009 50 Řez, negace Predikáty na ří -• řez „!" -• fail: cíl, který vždy neuspěje «• \+ P: negace jako neúspěch \+ P :- P, !, fail; true. Hana Rudová, Logické programování I, 20. května 2009 :ení běhu programu I true: cíl, který vždy uspěje 51 Řez, negace Predikáty na řízení běhu programu I. -• řez „!" -• fail: cíl, který vždy neuspěje true: cíl, který vždy uspěje «• \+ P: negace jako neúspěch \+ P :- P, !, fail; true. -• once(P): vrátí pouze jedno řešení cíle P once(P) :- P, !. Hana Rudová, Logické programování I, 20. května 2009 51 Řez, negace Predikáty na řízení běhu programu I. -• řez „!" -• fail: cíl, který vždy neuspěje true: cíl, který vždy uspěje «• \+ P: negace jako neúspěch \+ P :- P, !, fail; true. -• once(P): vrátí pouze jedno řešení cíle P once(P) :- P, !. -• Vyjádření podmínky: P -> Q ; R -• jestliže platí P tak Q (P -> Q ; R) :- P, ! , Q. -• v opačném případě R (P -> Q ; R) :- R. -• príklad: min(X,Y,Z) : - X =< Y -> Z = X ; Z = Y. Hana Rudová, Logické programování I, 20. května 2009 51 Řez, negace Predikáty na řízení běhu programu I. -• řez „!" -• fail: cíl, který vždy neuspěje true: cíl, který vždy uspěje «• \+ P: negace jako neúspěch \+ P :- P, !, fail; true. -• once(P): vrátí pouze jedno řešení cíle P once(P) :- P, !. -• Vyjádření podmínky: P -> Q ; R -• jestliže platí P tak Q (P -> Q ; R) :- P, ! , Q. -• v opačném případě R (P -> Q ; R) :- R. -• príklad: min(X,Y,Z) : - X =< Y -> Z = X ; Z = Y. M P -> Q Hana Rudová, Logické programování I, 20. května 2009 51 Řez, negace Predikáty na řízení běhu programu I. -• řez „!" -• fail: cíl, který vždy neuspěje true: cíl, který vždy uspěje «• \+ P: negace jako neúspěch \+ P :- P, !, fail; true. -• once(P): vrátí pouze jedno řešení cíle P once(P) :- P, !. -• Vyjádření podmínky: P -> Q ; R -• jestliže platí P tak Q (P -> Q ; R) :- P, ! , Q. -• v opačném případě R (P -> Q ; R) :- R. -• príklad: min(X,Y,Z) : - X =< Y -> Z = X ; Z = Y. M P -> Q M odpovídá: (P -> Q; fail) M příklad: zaporne(X) :- number(X) -> X < 0. Hana Rudová, Logické programování I, 20. května 2009 51 Řez, negace Predikáty na řízení běhu programu IL -• call (P): zavolá cíl P a uspěje, pokud uspěje P -• nekonečná posloupnost backtrackovacích voleb: repeat repeat. repeat :- repeat. Hana Rudová, Logické programování I, 20. května 2009 52 Řez, negace Predikáty na řízení běhu programu IL -• call (P): zavolá cíl P a uspěje, pokud uspěje P -• nekonečná posloupnost backtrackovacích voleb: repeat repeat. repeat :- repeat. klasické použití: generuj akci X, proveď ji a otestuj, zda neskončit Hlava :- ... uloz_stav( StaryStav ), repeat, generujC X ), % deterministické: generuj, prováděj, testuj provadejC X ), testujC X ), i ■ > obnov_stav( StaryStav ), Hana Rudová, Logické programování I, 20. května 2009 52 Řez, negace Seznamy Reprezentace seznamu -• Seznam: [a, b, c], prázdný seznam [] -• Hlava (libovolný objekt), tělo (seznam): .(Hlava, Telo) -• všechny strukturované objekty stromy - i seznamy 3 funktor".", dva argumenty 3 .(a, .(b, .(c, []))) = [a, b, c] -• notace: [ Hlava | Telo ] = [a | Tel o] Hana Rudová, Logické programování I, 20. května 2009 54 Seznamy Reprezentace seznamu -• Seznam: [a, b, c], prázdný seznam [] -• Hlava (libovolný objekt), tělo (seznam): .(Hlava, Telo) -• všechny strukturované objekty stromy - i seznamy 3 funktor".", dva argumenty 3 .(a, .(b, .(c, []))) = [a, b, c] -• notace: [ Hlava | Telo ] = [a | Tel o] Telo je v [a | Tel o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] Hana Rudová, Logické programování I, 20. května 2009 54 Seznamy Reprezentace seznamu -• Seznam: [a, b, c], prázdný seznam [] -• Hlava (libovolný objekt), tělo (seznam): .(Hlava, Telo) -• všechny strukturované objekty stromy - i seznamy 3 funktor".", dva argumenty 3 .(a, .(b, .(c, []))) = [a, b, c] -• notace: [ Hlava | Telo ] = [a | Tel o] Telo je v [a | Tel o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] -• Lze psát i: [a,b|Telo] -• před "|"je libovolný počet prvků seznamu , za "I"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, 20. května 2009 54 Seznamy Reprezentace seznamu -• Seznam: [a, b, c], prázdný seznam [] -• Hlava (libovolný objekt), tělo (seznam): .(Hlava, Telo) -• všechny strukturované objekty stromy - i seznamy 3 funktor".", dva argumenty 3 .(a, .(b, .(c, []))) = [a, b, c] -• notace: [ Hlava | Telo ] = [a | Tel o] Telo je v [a | Tel o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] -• Lze psát i: [a,b|Telo] -• před "|"je libovolný počet prvků seznamu , za "I"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, 20. května 2009 54 Seznamy Reprezentace seznamu -• Seznam: [a, b, c], prázdný seznam [] -• Hlava (libovolný objekt), tělo (seznam): .(Hlava, Telo) -• všechny strukturované objekty stromy - i seznamy 3 funktor".", dva argumenty 3 .(a, .(b, .(c, []))) = [a, b, c] -• notace: [ Hlava | Telo ] = [a | Tel o] Telo je v [a | Tel o] seznam, tedy píšeme [ a, b, c ] = [ a | [ b, c ] ] -• Lze psát i: [a,b|Telo] -• před "|"je libovolný počet prvků seznamu , za "I"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] ] M Seznam jako neúplná datová struktura: [a,b,c|T] 3 Seznam = [a,b,c|T], T = [d,e|S], Seznam = [a,b,c,d,e|S] Hana Rudová, Logické programování I, 20. května 2009 54 Seznamy Prvek seznamu -• memberC X, S ) -• platí: memberC b, [a,b,c] ). M neplatí: memberC b, [[a,b]|[c]] ). -• X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %CD M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) Hana Rudová, Logické programování I, 20. května 2009 55 Prvek seznamu member(1,[2,1,3,1,4]) M memberC X, S ) -• platí: memberC b, [a,b,c] ). M neplatí: memberC b, [[a,b]|[c]] ). -• X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %CD M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) Hana Rudová, Logické programování I, 20. května 2009 55 Seznamy Prvek seznamu -• memberC X, S ) -• platí: memberC b, [a,b,c] ). M neplatí: memberC b, [[a,b]|[c]] ). -• X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %CD M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) Hana Rudová, Logické programování I, 20. května 2009 55 member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) Seznamy Prvek seznamu memberC X, S ) platí: memberC b, [a,b,c] ). neplatí: memberC b, [[a,b]|[c]] ). X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %(1) M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) dle (1 D yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,154]) Hana Rudová, Logické programování I, 20. května 2009 55 Seznamy Prvek seznamu memberC X, S ) platí: memberC b, [a,b,c] ). neplatí: memberC b, [[a,b]|[c]] ). X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %(1) M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) dle (1 D yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,154]) dle (2) member(1,[1,4]) Hana Rudová, Logické programování I, 20. května 2009 55 Seznamy Prvek seznamu memberC X, S ) platí: memberC b, [a,b,c] ). neplatí: memberC b, [[a,b]|[c]] ). X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %(1) M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) dle (1 D yes dle (1 D 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, 20. května 2009 55 Seznamy Prvek seznamu memberC X, S ) platí: memberC b, [a,b,c] ). neplatí: memberC b, [[a,b]|[c]] ). X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %(1) M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) dle (1 D yes dle (1 D 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, 20. května 2009 55 Seznamy Prvek seznamu memberC X, S ) platí: memberC b, [a,b,c] ). neplatí: memberC b, [[a,b]|[c]] ). X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %(1) M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) dle (1 D yes dle (1 D 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, 20. května 2009 55 no Seznamy Prvek seznamu memberC X, S ) platí: memberC b, [a,b,c] ). neplatí: memberC b, [[a,b]|[c]] ). X je prvek seznamu S, když 3 X je hlava seznamu S nebo memberC X, [ X | _ ] ). %(1) M X je prvek těla seznamu S memberC X, [ _ | Telo ] ) :- memberC X, Telo ). %C2) Další příklady použití: 3 member(X,[1,2,3]). 3 member(l,[2,1,3,1]). dle (1 D yes dle (1 D yes member(1,[2,1,3,1,4]) dle (2) member(1,[1,3,1,4]) dle (2) member(1,[3,154]) dle (2) member(1,[1,4]) dle (2) member(1,[4]) dle (2) member(1,[]) dle (2) Hana Rudová, Logické programování I, 20. května 2009 55 no Seznamy Spojení seznamů -• appendC LI, L2, L3 ) M Platí: appendC [a,b], [c,d], [a,b,c,d] ) M Neplatí: appendC [b,a], [c,d], [a,b,c,d] ), appendC [a,[b]], [c,d], [a,b,c,d] ) Hana Rudová, Logické programování I, 20. května 2009 56 Seznamy Spojení seznamů -• appendC LI, L2, L3 ) M Platí: appendC [a,b], [c,d], [a,b,c,d] ) M Neplatí: appendC [b,a], [c,d], [a,b,c,d] ), appendC [a,[b]], [c,d], [a,b,c,d] ) -• Definice: 3 pokud je 1. argument prázdný seznam, pak 2. a 3. argument jsou stejné seznamy: appendC [], S, S ). Hana Rudová, Logické programování I, 20. května 2009 56 Seznamy Spojení seznamů appendC LI, L2, L3 ) Platí: append( [a,b], [c,d], [a,b,c,d] ) Neplatí: append( [b,a], [c,d], [a,b,c,d] ), appendC [a,[b]], [c,d], [a,b,c,d] ) Definice: 3 pokud je 1. argument prázdný seznam, pak 2. a 3. argument jsou stejné seznamy: append( [], S, S ). M pokud je 1. argument neprázdný seznam, pak má 3. argument stejnou hlavu jako 1 appendC [X|S1], S2, [X|S3] ) :- append( SI, S2, S3). X S1 S2 S3 Hana Rudová, Logické programování I, 20. května 2009 56 Seznamy Příklady použití append -• appendC [], S, S ). appendC [X|S1], S2, [X|S3] ) :- appendC SI, S2, S3). M Spojení seznamů: appendC [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] appendC [a, [b,c], d], [a, [], b], S ). S = [a, [b,c] , d, a, [] , b] ] Hana Rudová, Logické programování I, 20. května 2009 57 Seznamy Příklady použití append -• appendC [], S, S ). appendC [X|S1], S2, [X|S3] ) :- appendC SI, S2, S3). M Spojení seznamů: appendC [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] appendC [a, [b,c], d], [a, [], b], S ). S = [a, [b,c] , d, a, [] , b] ] -• Dekompozice seznamu na dva seznamy: appendC SI, S2 , [a, b ]). SI = [], S2 = [a,b] ; SI = [a] , S2 = [b] ? ; SI = [a,b], S2 = [] Hana Rudová, Logické programování I, 20. května 2009 57 Seznamy Příklady použití append -• appendC [], S, S ). appendC [X|S1], S2, [X|S3] ) :- appendC SI, S2, S3). M Spojení seznamů: appendC [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] appendC [a, [b,c], d], [a, [], b], S ). S = [a, [b,c] , d, a, [] , b] ] -• Dekompozice seznamu na dva seznamy: appendC SI, S2 , [a, b ]). SI = [], S2 = [a,b] ; SI = [a] , S2 = [b] ? ; SI = [a,b], S2 = [] -• Vyhledávání v seznamu: appendC Pred, [c | Za ] , [a,b,c,d,e] ). Pred = [a,b], Za = [d,e] Hana Rudová, Logické programování I, 20. května 2009 57 Seznamy Příklady použití append -• appendC [], S, S ). appendC [X|S1], S2, [X|S3] ) :- appendC SI, S2, S3). M Spojení seznamů: appendC [a,b,c], [1,2,3], S ). S = [a,b,c,1,2,3] appendC [a, [b,c], d], [a, [], b], S ). S = [a, [b,c] , d, a, [] , b] ] -• Dekompozice seznamu na dva seznamy: appendC SI, S2 , [a, b ]). SI = [], S2 = [a,b] ; SI = [a] , S2 = [b] ? ; SI = [a,b], S2 = [] -• Vyhledávání v seznamu: appendC Pred, [c | Za ] , [a,b,c,d,e] ). Pred = [a,b], Za = [d,e] M Předchůdce a následník: appendC _, [Pred,c,Za|_] , [a,b,c,d,e] ). Pred = b, Za = d Hana Rudová, Logické programování I, 20. května 2009 57 Seznamy Smazání prvku seznamu delete( X, S, SI ) M Seznam SI odpovídá seznamu S, ve kterém je smazán prvek X 3 jestliže X je hlava seznamu S, pak výsledkem je tělo S deleteC X, [X|Telo], Telo). M jestliže X je v těle seznamu, pak X je smazán až v těle deleteC X, [Y|Telo], [Y|Telol] ) :- deleteC X, Telo, Telol ). Hana Rudová, Logické programování I, 20. května 2009 58 Seznamy Smazání prvku seznamu delete( X, S, SI ) M Seznam SI odpovídá seznamu S, ve kterém je smazán prvek X 3 jestliže X je hlava seznamu S, pak výsledkem je tělo S deleteC X, [X|Telo], Telo). M jestliže X je v těle seznamu, pak X je smazán až v těle deleteC X, [Y|Telo], [Y|Telol] ) :- deleteC X, Telo, Telol ). -• delete smaže libovolný výskyt prvku pomocí backtrackingu ?- delete(a, [a,b,a,a], S). S = [b,a,a] ; S = [a,b,a]; S = [a,b,a] Hana Rudová, Logické programování I, 20. května 2009 58 Seznamy Smazání prvku seznamu delete( X, S, SI ) M Seznam SI odpovídá seznamu S, ve kterém je smazán prvek X 3 jestliže X je hlava seznamu S, pak výsledkem je tělo S deleteC X, [X|Telo], Telo). M jestliže X je v těle seznamu, pak X je smazán až v těle deleteC X, [Y|Telo], [Y|Telol] ) :- deleteC X, Telo, Telol ). -• delete smaže libovolný výskyt prvku pomocí backtrackingu ?- delete(a, [a,b,a,a], S). S = [b,a,a] ; S = [a,b,a]; S = [a,b,a] -• delete, který smaže pouze první výskyt prvku X M deleteC X, [X|Telo], Telo) :- !. deleteC X, [Y|Telo], [Y|Telol] ) :- deleteC X, Telo, Telol). Hana Rudová, Logické programování I, 20. května 2009 58 Seznamy Optimalizace posledního volání -• Last Call Optimization (LCO) M Implementační technika snižující nároky na paměť M Mnoho vnořených rekurzivních volání je náročné na paměť -• Použití LCO umožňuje vnořenou rekurzi s konstantními pametovými nároky -• Typický příklad, kdy je možné použití LCO: M procedura musí mít pouze jedno rekurzivní volání: v posledním cíli poslední klauzule M cíle předcházející tomuto rekurzivnímu volání musí být deterministické 3 p( ...):- ... % žádné rekurzivní voláni v těle klauzule p( ...):- ... % žádné rekurzivní voláni v těle klauzule p(...) :- ..., !, p( ... ). % řez zajišťuje determinismus -• Tento typ rekurze lze převést na iteraci Hana Rudová, Logické programování I, 20. května 2009 59 Seznamy LCO a akumulátor -• Reformulace rekurzivní procedury, aby umožnila LCO -• Výpočet délky seznamu length( Seznam, Délka ) lengthC [], 0 ). lengthC [ H | T ], Délka ) :- lengthC T, DelkaO ), Délka is 1 + DelkaO. Hana Rudová, Logické programování I, 20. května 2009 60 Seznamy LCO a akumulátor -• Reformulace rekurzivní procedury, aby umožnila LCO -• Výpočet délky seznamu length( Seznam, Délka ) lengthC [], 0 ). lengthC [ H | T ], Délka ) :- lengthC T, DelkaO ), Délka is 1 + DelkaO. -• Upravená procedura, tak aby umožnila LCO: % lengthC Seznam, ZapocitanaDelka, CelkovaDelka ): % CelkovaDelka = ZapocitanaDelka + ,,počet prvků v Seznam'' Hana Rudová, Logické programování I, 20. května 2009 60 Seznamy LCO a akumulátor -• Reformulace rekurzivní procedury, aby umožnila LCO -• Výpočet délky seznamu length( Seznam, Délka ) lengthC [], 0 ). lengthC [ H | T ], Délka ) :- lengthC T, DelkaO ), Délka is 1 + DelkaO. -• Upravená procedura, tak aby umožnila LCO: % lengthC Seznam, ZapocitanaDelka, CelkovaDelka ): % CelkovaDelka = ZapocitanaDelka + ,,počet prvků v Seznam'' lengthC Seznam, Délka ) :- lengthC Seznam, 0, Délka ). % pomocný predikát lengthC [] , Délka, Délka ). % celková délka = započítaná délka lengthC [ H | T ] , A, Délka ) :- A0 is A + 1, lengthC T, A0, Délka ). M Přídavný argument se nazývá akumulátor Hana Rudová, Logické programování I, 20. května 2009 60 Seznamy max_list s akumulátorem Výpočet největšího prvku v seznamu max_l ist (Seznam, Max) max_list([X], X). max_list([X|T], Max) :-max_li st(T,MaxT), ( MaxT >= X, !, Max = MaxT Max = X ). Hana Rudová, Logické programování I, 20. května 2009 61 Seznamy max_list s akumulátorem Výpočet největšího prvku v seznamu max_l ist (Seznam, Max) max_list([X], X). max_list([X|T], Max) :-max_li st(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, 20. května 2009 61 Seznamy Akumulátor jako seznam -• Nalezení seznamu, ve kterém jsou prvky v opačném pořadí reverse( Seznam, OpacnySeznam ) M reverseC [] , [] ). reverseC [ H | T ], Opacny ) :- Hana Rudová, Logické programování I, 20. května 2009 62 Akumulátor jako seznam -• Nalezení seznamu, ve kterém jsou prvky v opačném pořadí reverse( Seznam, OpacnySeznam ) M reverseC [] , [] ). reverseC [ H | T ], Opacny ) :-reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). M naivní reverse s kvadratickou složitosti Hana Rudová, Logické programování I, 20. května 2009 62 Akumulátor jako seznam -• Nalezení seznamu, ve kterém jsou prvky v opačném pořadí reverse( Seznam, OpacnySeznam ) M reverseC [] , [] ). reverseC [ H | T ], Opacny ) :-reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). M naivní reverse s kvadratickou složitosti -• reverse pomocí akumulátoru s lineární složitostí M % reverseC Seznam, Akumulátor, Opacny ): % Opacny obdržíme přidáním prvků ze Seznam do Akumulátor v opačném poradi Hana Rudová, Logické programování I, 20. května 2009 62 Seznamy Akumulátor jako seznam Nalezení seznamu, ve kterém jsou prvky v opačném pořadí reverse( Seznam, OpacnySeznam ) M reverseC [] , [] ). reverseC [ H | T ], Opacny ) :-reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). M naivní reverse s kvadratickou složitosti reverse pomocí akumulátoru s lineární složitostí M % reverseC Seznam, Akumulátor, Opacny ): % Opacny obdržíme přidáním prvků ze Seznam do Akumulátor v opačném poradi reverse( Seznam, OpacnySeznam ) :- reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). reverse( [ H | T ], A, Opacny ) :- reverse( T, [ H | A ], Opacny ). % přidání H do akumulátoru Hana Rudová, Logické programování I, 20. května 2009 62 Seznamy Akumulátor jako seznam «• Nalezení seznamu, ve kterém jsou prvky v opačném pořadí reverse( Seznam, OpacnySeznam ) M reverseC [] , [] ). reverseC [ H | T ], Opacny ) :-reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). M naivní reverse s kvadratickou složitosti -• reverse pomocí akumulátoru s lineární složitostí M % reverseC Seznam, Akumulátor, Opacny ): % Opacny obdržíme přidáním prvků ze Seznam do Akumulátor v opačném poradi reverse( Seznam, OpacnySeznam ) :- reverse( Seznam, [], OpacnySeznam). reverse( [], S, S ). reverse( [ H | T ], A, Opacny ) :- reverse( T, [ H | A ], Opacny ). % přidání H do akumulátoru -• zpětná konstrukce seznamu (srovnej s předchozí doprednou konstrukcí, např. append) Hana Rudová, Logické programování I, 20. května 2009 62 Seznamy Neefektivita při spojování seznamů M Sjednocení dvou seznamů -• append( [], S, S ). appendC [X|S1], S2, [X|S3] ) :- append( SI, S2, S3 ). Hana Rudová, Logické programování I, 20. května 2009 63 Seznamy Neefektivita při spojování seznamů M Sjednocení dvou seznamů -• append( [], S, S ). appendC [X|S1], S2, [X|S3] ) :- appendC SI, S2, S3 ). -• ?- appendC [2,3], [1], S ). Hana Rudová, Logické programování I, 20. května 2009 63 Seznamy Neefektivita při spojování seznamů M Sjednocení dvou seznamů -• append( [], S, S ). appendC [X|S1], S2, [X|S3] ) :- append( SI, S2, S3 ). -• ?- append( [2,3], [1], S ). postupné volání cílů: append( [2,3], [1], S ) - append( [3], [1], S') - append( [], [1], S" ) Hana Rudová, Logické programování I, 20. května 2009 63 Seznamy Neefektivita při spojování seznamů M Sjednocení dvou seznamů -• append( [], S, S ). appendC [X|S1], S2, [X|S3] ) :- append( SI, S2, S3 ). -• ?- append( [2,3], [1], S ). postupné volání cílů: append( [2,3], [1], S ) - append( [3], [1], S') - append( [], [1], S" ) -• Vždy je nutné projít celý první seznam Hana Rudová, Logické programování I, 20. května 2009 63 Seznamy Rozdílové seznamy -• Zapamatování konce a připojení na konec: rozdílové seznamy Hana Rudová, Logické programování I, 20. května 2009 64 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] M Reprezentace prázdného seznamu: L-L Hana Rudová, Logické programování I, 20. května 2009 64 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 \i Z1 A2 MM L1 Z2 M L2 appendC Al-Zl, Z1-Z2, A1-Z2 ) LI L2 L3 L3 Hana Rudová, Logické programování I, 20. května 2009 64 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 \i Z1 A2 MM L1 Z2 M L2 appendC Al-Zl, Z1-Z2, A1-Z2 ). LI L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 L3 Hana Rudová, Logické programování I, 20. května 2009 64 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 \i Z1 A2 MM L1 Z2 M L2 L3 appendC Al-Zl, Z1-Z2, A1-Z2 ). LI L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 [2,3|Z1]-Z2 Hana Rudová, Logické programování I, 20. května 2009 64 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 \i Z1 A2 MM L1 Z2 M L2 L3 appendC Al-Zl, Z1-Z2, A1-Z2 ). LI L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 [2,3|Z1]-Z2 [2,3,1|Z2]-Z2 Hana Rudová, Logické programování I, 20. května 2009 64 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 \i Z1 A2 MM L1 Z2 M L2 L3 appendC Al-Zl, Z1-Z2, A1-Z2 ). LI L2 L3 [2,3] [1] [2,3,1] [2,3|Z1]-Z1 [1|Z2]-Z2 [2,3|Z1]-Z2 [2,3,1|Z2]-Z2 -• ?- appendC [2,3|Z1]-Z1, [1|Z2]-Z2, S ). S = Al - Z2 = [2,31 ZI] - Z2 = [2,31 [1|Z2] ] - Z2 ZI = [1|Z2] S = [2,3,1|Z2]-Z2 -• Jednotková složitost, oblíbená technika ale není tak flexibilní Hana Rudová, Logické programování I, 20. května 2009 64 Seznamy Akumulátor vs. rozdílové seznamy: reverse reverseC [], [] ) . reverseC [ H | T ], Opacny ) :- reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). kvadratická složitost reverseC Seznam, Opacny ) :- reverseOC Seznam, [], Opacny ). reverseOC [] , S, S ). reverseOC [ H | T ], A, Opacny ) :- reverseOC T, [ H I A ], Opacny ). akumulátor Clineárni) Hana Rudová, Logické programování I, 20. května 2009 65 Seznamy Akumulátor vs. rozdílové seznamy: reverse reverseC [], [] ) . reverseC [ H | T ], Opacny ) :- reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). kvadratická složitost reverseC Seznam, Opacny ) :- reverseOC Seznam, [], Opacny ). reverseOC [] , S, S ). reverseOC [ H | T ], A, Opacny ) :- reverseOC T, [ H I A ], Opacny ). akumulátor Clineárni) reverseC Seznam, Opacny ) :- reverseOC Seznam, Opacny-[]). reverseOC [], S-S ). reverseOC [ H | T ], Opacny-OpacnyKonec ) :- rozdílové seznamy reverseOC T, Opacny-[ H | OpacnyKonec] ). Clineárni) Hana Rudová, Logické programování I, 20. května 2009 65 Seznamy Akumulátor vs. rozdílové seznamy: reverse reverseC [], [] ) . reverseC [ H | T ], Opacny ) :- reverseC T, OpacnyT ), appendC OpacnyT, [ H ], Opacny ). kvadratická složitost reverseC Seznam, Opacny ) :- reverseOC Seznam, [], Opacny ). reverseOC [] , S, S ). reverseOC [ H | T ], A, Opacny ) :- reverseOC T, [ H I A ], Opacny ). akumulátor Oineárni) reverseC Seznam, Opacny ) :- reverseOC Seznam, Opacny-[]). reverseOC [], S-S ). reverseOC [ H | T ], Opacny-OpacnyKonec ) :- rozdílové seznamy reverseOC T, Opacny-[ H | OpacnyKonec] ). Oineárni) Příklad: operace pro manipulaci s frontou M test na prázdnost, přidání na konec, odebrání ze začátku Hana Rudová, Logické programování I, 20. května 2009 65 Seznamy Vestavěné predikáty Vestavěné predikáty -• Predikáty pro řízení běhu programu 3 fail , true, ... «• Různé typy rovností M unifikace, aritmetická rovnost, ... -• Databázové operace M změna programu (programové databáze) za jeho běhu -• Vstup a výstup -• Všechna řešení programu -• Testování typu termu -• proměnná?, konstanta?, struktura?, ... M Konstrukce a dekompozice termu M argumenty?, funktor?, ... Hana Rudová, Logické programování I, 20. května 2009 67 Vestavěné predikáty Databázové operace Databáze: specifikace množiny relací Prologovský program: programová databáze, kde jsou relace specifikovány explicitně (fakty) i implicitně (pravidly) Vestavěné predikáty pro změnu databáze během provádění programu: assert( Klauzule ) přidání Klauzule do programu asserta( Klauzule ) přidání na začátek assertz( Klauzule ) přidání na konec retract( Klauzule ) smazání klauzule unifikovatelné s Klauzule Pozor: nadměrné použití těchto operací snižuje srozumitelnost programu Hana Rudová, Logické programování I, 20. května 2009 68 Vestavěné predikáty Příklad: databázové operace -• Caching: odpovědi na dotazy jsou přidány do programové databáze Hana Rudová, Logické programování I, 20. května 2009 69 Vestavěné predikáty Příklad: databázové operace -• Caching: odpovědi na dotazy jsou přidány do programové databáze M ?- solve( problem, Solution), assertaC solve( problem, Solution) ). -• :- dynamic solve/2. % nezbytné při použití v SICStus Prologu Hana Rudová, Logické programování I, 20. května 2009 69 Vestavěné predikáty Příklad: databázové operace Caching: odpovědi na dotazy jsou přidány do programové databáze M ?- solve( problem, Solution), assertaC solve( problem, Solution) ). -• :- dynamic solve/2. % nezbytné při použití v SICStus Prologu Příklad: uloz_trojice( Seznámí, Seznam2 ) :-member( XI, Seznámí ), member( X2, Seznam2 ), spocitej_treti( XI, X2, X3 ), assertz( trojice( XI, X2, X3 ) ), f ai 1 . Hana Rudová, Logické programování I, 20. května 2009 69 Vestavěné predikáty Příklad: databázové operace -• Caching: odpovědi na dotazy jsou přidány do programové databáze M ?- solve( problem, Solution), assertaC solve( problem, Solution) ). -• :- dynamic solve/2. % nezbytné při použití v SICStus Prologu M Příklad: uloz_trojice( Seznámí, Seznam2 ) :- member( XI, Seznámí ), member( X2, Seznam2 ), spocitej_treti( XI, X2, X3 ), assertz( trojice( XI, X2, X3 ) ), f ai 1 . uloz_trojice( _, _ ) :- !. Hana Rudová, Logické programování I, 20. května 2009 69 Vestavěné predikáty Vstup a výstup 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 proudů soubor 1 soubor 2 program může čí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í proud M aktivní výstupní proud uživatelský terminál - user 3 datový vstup z terminálu uživatelsky terminal program user soubor 3 soubor 4 vstupni proudy vystupni proudy Hana Rudová, Logické programování I, 20. května 2009 70 Vestavěné predikáty Vstupní a výstupní proudy: vestavěné predikáty -• změna (otevření) aktivního vstupního/výstupního proudu: see(S)/tell (S) ctem" ( Soubor ) :- see( Soubor ), cteni_ze_souboru( Informace ), see( user ). -• uzavření aktivního vstupního/výstupního proudu: seen/told Hana Rudová, Logické programování I, 20. května 2009 71 Vestavěné predikáty Vstupní a výstupní proudy: vestavěné predikáty -• změna (otevření) aktivního vstupního/výstupního proudu: see(S)/tell (S) ctem" ( Soubor ) :- see( Soubor ), cteni_ze_souboru( Informace ), see( user ). -• uzavření aktivního vstupního/výstupního proudu: seen/told M zjištění aktivního vstupního/výstupního proudu: seeing(S)/telling(S) ctem" ( Soubor ) :- seeing( StarySoubor ), see( Soubor ) , cteni_ze_souboru( Informace ), seen, see( StarySoubor ). Hana Rudová, Logické programování I, 20. května 2009 71 Vestavěné predikáty Sekvenční přístup -• čtení dalšího termu: read(Term) * při čtení jsou termy odděleny tečkou | ?- read(A), read( ahoj(B) ), Hana Rudová, Logické programování I, 20. května 2009 k textovým souborům readC [C,D] ). 72 Vestavěné predikáty Sekvenční přístup k textovým souborům -• čtení dalšího termu: read(Term) * při čtení jsou termy odděleny tečkou | ?- read(A), read( ahoj(B) ), read( [C,D] ). |: ahoj. ahojC petre ). [ ahoj( 'Petre!' ), jdeme ]. A = ahoj, B = petre, C = ahoj('Petre!'), D = jdeme Hana Rudová, Logické programování I, 20. května 2009 72 Vestavěné predikáty Sekvenční přístup k textovým souborům -• čtení dalšího termu: read(Term) * při čtení jsou termy odděleny tečkou | ?- read(A), read( ahoj(B) ), read( [C,D] ). |: ahoj. ahojC petre ). [ ahoj( 'Petre!' ), jdeme ]. A = ahoj, B = petre, C = ahoj('Petre!'), D = jdeme M po dosažení konce souboru je vrácen atom end_of_f i 1 e 3 zápis dalšího termu: write(Term) ?- write( ahoj ). ?- write( 'Ahoj Petre!' ). nový řádek na výstup: ni N mezer na výstup: tab(N) Hana Rudová, Logické programování I, 20. května 2009 72 Vestavěné predikáty Sekvenční přístup k textovým souborům -• čtení dalšího termu: read(Term) 3 při čtení jsou termy odděleny tečkou | ?- read(A), read( ahoj(B) ), read( [C,D] ). |: ahoj. ahojC petre ). [ ahoj( 'Petre!' ), jdeme ]. A = ahoj, B = petre, C = ahoj('Petre!'), D = jdeme M po dosažení konce souboru je vrácen atom end_of_f i 1 e 3 zápis dalšího termu: write(Term) ?- write( ahoj ). ?- write( 'Ahoj Petre!' ). nový řádek na výstup: ni N mezer na výstup: tab(N) -• čtení/zápis dalšího znaku: getO(Znak) , get(NeprazdnyZnak)/put(Znak) 3 po dosažení konce souboru je vrácena -1 Hana Rudová, Logické programování I, 20. května 2009 72 Vestavěné predikáty Příklad čtení process_file( Soubor ) :- seeingC StarySoubor ), see( Soubor ), repeat, read( Term ), process_term( Term ), Term == end_of_file, i ■ j seen, see( StarySoubor ). repeat. repeat :- repeat. Hana Rudová, Logické programování I, 20. května 2009 73 ze souboru % zjištěni aktivního proudu % otevřeni souboru Soubor % čteni termu Term % manipulace s termem % je konec souboru? % uzavřeni souboru % aktivace původniho proudu % opakováni Vestavěné predikáty Ctení programu ze souboru -• Interpretování kódu programu -• ?- consul t(program). M ?- consultCprogram.pl') . -• ?- consultC [programl, 'program2.pl'] ). -• ?- [program] . 3 ?- [user] . zadávání kódu ze vstupu ukončené CTRL+D Hana Rudová, Logické programování I, 20. května 2009 74 Vestavěné predikáty Ctení programu ze souboru -• Interpretování kódu programu -• ?- consul t(program). M ?- consultCprogram.pl') . -• ?- consultC [programl, 'program2.pl'] ). -• ?- [program] . 3 ?- [user] . zadávání kódu ze vstupu ukončené CTRL+D -• Kompilace kódu programu 3 ?- compile( [programl, 'program2.pl'] ). -• další varianty podobně jako u interpretování -• typické zrychlení: 5 až 10 krát Hana Rudová, Logické programování I, 20. května 2009 74 Vestavěné predikáty Všechna řešení -• Backtracking vrací pouze jedno řešení po druhém -• Všechna řešení dostupná najednou: bagof/3, setof/3, findall/3 -• bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splněno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Ditě, vek( Ditě, 5 ), Seznam ). Hana Rudová, Logické programování I, 20. května 2009 75 Vestavěné predikáty Všechna řešení -• Backtracking vrací pouze jedno řešení po druhém -• Všechna řešení dostupná najednou: bagof/3, setof/3, findall/3 -• bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splněno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Ditě, vek( Ditě, 5 ), Seznam ). Seznam = [ anna, tomas ] Hana Rudová, Logické programování I, 20. května 2009 75 Vestavěné predikáty Všechna řešení -• Backtracking vrací pouze jedno řešení po druhém -• Všechna řešení dostupná najednou: bagof/3, setof/3, findall/3 -• bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splněno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Ditě, vek( Ditě, 5 ), Seznam ). Seznam = [ anna, tomas ] -• Volné proměnné v cíli P jsou všeobecně kvantifikovány ?- bagof( Ditě, vek( Ditě, Vek ), Seznam ). Hana Rudová, Logické programování I, 20. května 2009 75 Vestavěné predikáty Všechna řešení -• Backtracking vrací pouze jedno řešení po druhém -• Všechna řešení dostupná najednou: bagof/3, setof/3, findall/3 -• bagof( X, P, S ): vrátí seznam S, všech objektů X takových, že P je splněno vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Ditě, vek( Ditě, 5 ), Seznam ). Seznam = [ anna, tomas ] -• Volné proměnné v cíli P jsou všeobecně kvantifikovány ?- bagof( Ditě, vek( Ditě, Vek ), Seznam ). Vek = 7, Seznam = [ petr ]; Vek = 5, Seznam = [ anna, tomas ] Hana Rudová, Logické programování I, 20. května 2009 75 Vestavěné predikáty Všechna řešení IL -• Pokud neexistuje řešení bagof (X, P, S) neuspěje -• bagof: pokud nějaké řešení existuje několikrát, pak S obsahuje duplicity -• bagof, setof, findall: P je libovolný cíl vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Ditě, ( vek( Ditě, 5 ), Ditě \= anna ), Seznam ). Seznam = [ tomas ] Hana Rudová, Logické programování I, 20. května 2009 76 Vestavěné predikáty Všechna řešení IL -• Pokud neexistuje řešení bagof (X, P, S) neuspěje -• bagof: pokud nějaké řešení existuje několikrát, pak S obsahuje duplicity M bagof, setof, findall: P je libovolný cíl vek( petr, 7 ). vek( anna, 5 ). vek( tomas, 5 ). ?- bagof( Ditě, ( vek( Ditě, 5 ), Ditě \= anna ), Seznam ). Seznam = [ tomas ] -• bagof, setof, findall: na objekty shromažďované v X nejsou žádná omezení ?- bagof( Dite-Vek, vek( Ditě, Vek ), Seznam ). Seznam = [petr-7,anna-5,tomas-5] Hana Rudová, Logické programování I, 20. května 2009 76 Vestavěné predikáty Existenční kvantifikátor „" " -• Přidání existenčního kvantifikátoru „Ä " ^> hodnota proměnné nemá význam ?- bagof( Ditě, Vek~vek( Ditě, Vek ), Seznam ). Hana Rudová, Logické programování I, 20. května 2009 77 Vestavěné predikáty Existenční kvantifikátor „" " -• Přidání existenčního kvantifikátoru „Ä " ^> hodnota proměnné nemá význam ?- bagof( Ditě, Vek~vek( Ditě, Vek ), Seznam ). Seznam = [petr,anna,tomas] Hana Rudová, Logické programování I, 20. května 2009 77 Vestavěné predikáty Existenční kvantifikátor „ » Přidání existenčního kvantifikátoru „Ä " ^> hodnota proměnné nemá význam ?- bagof( Ditě, Vek~vek( Ditě, 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( Ditě, vek( Ditě, _Vek ), Seznam ). Seznam = [petr] ; Seznam = [anna,tomas] Hana Rudová, Logické programování I, 20. května 2009 77 Vestavěné predikáty Existenční kvantifikátor „ » Přidání existenčního kvantifikátoru „Ä " ^> hodnota proměnné nemá význam ?- bagof( Ditě, Vek~vek( Ditě, 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( Ditě, vek( Ditě, _Vek ), Seznam ). Seznam = [petr] ; Seznam = [anna,tomas] Před operátorem „~ " může být i seznam ?- bagof( Vek ,[Jméno,Přijmeni]~vek( Jméno, Prijmeni, Vek ), Seznam ). Seznam = [7,5,5] Hana Rudová, Logické programování I, 20. května 2009 77 Vestavěné predikáty Všechna řešení III. -• setof( X, P, S ): rozdíly od bagof M S je uspořádaný podle @< 3 případné duplicity v S jsou eliminovány Hana Rudová, Logické programování I, 20. května 2009 78 Vestavěné predikáty Všechna řešení III. -• setof( X, P, S ): rozdíly od bagof M S je uspořádaný podle @< 3 případné duplicity v S jsou eliminovány -• findall( X, P, S ): rozdíly od bagof M všechny proměnné jsou existenčně kvantifikovány ?- findaIK Ditě, vek( Ditě, Vek ), Seznam ). Hana Rudová, Logické programování I, 20. května 2009 78 Vestavěné predikáty Všechna řešení III. -• setof( X, P, S ): rozdíly od bagof M S je uspořádaný podle @< 3 případné duplicity v S jsou eliminovány -• findall( X, P, S ): rozdíly od bagof M všechny proměnné jsou existenčně kvantifikovány ?- findaIK Ditě, vek( Ditě, Vek ), Seznam ). =>vS jsou shromažďovány všechny možnosti i pro různá řešení => findall uspěje přesně jednou Hana Rudová, Logické programování I, 20. května 2009 78 Vestavěné predikáty Všechna řešení III. -• setof( X, P, S ): rozdíly od bagof M S je uspořádaný podle @< 3 případné duplicity v S jsou eliminovány -• findall( X, P, S ): rozdíly od bagof M všechny proměnné jsou existenčně kvantifikovány ?- findaIK Ditě, vek( Ditě, Vek ), Seznam ). =>vS jsou shromažďovány všechny možnosti i pro různá řešení => findall uspěje přesně jednou M výsledný seznam může být prázdný => pokud neexistuje řešení, uspěje a vrátí S = [] Hana Rudová, Logické programování I, 20. května 2009 78 Vestavěné predikáty Všechna řešení III. -• setof( X, P, S ): rozdíly od bagof M S je uspořádaný podle @< 3 případné duplicity v S jsou eliminovány -• findall( X, P, S ): rozdíly od bagof M všechny proměnné jsou existenčně kvantifikovány ?- findaIK Ditě, vek( Ditě, Vek ), Seznam ). =>vS jsou shromažďovány všechny možnosti i pro různá řešení => findall uspěje přesně jednou M výsledný seznam může být prázdný => pokud neexistuje řešení, uspěje a vrátí S = [] -• ?- bagof( Ditě, vek( Ditě, Vek ), Seznam ). Vek = 7, Seznam = [ petr ]; Vek = 5, Seznam = [ anna, tomas ] ?- findall( Ditě, vek( Ditě, Vek ), Seznam ). Hana Rudová, Logické programování I, 20. května 2009 78 Vestavěné predikáty Všechna řešení III. -• setof( X, P, S ): rozdíly od bagof M S je uspořádaný podle @< 3 případné duplicity v S jsou eliminovány -• findall( X, P, S ): rozdíly od bagof M všechny proměnné jsou existenčně kvantifikovány ?- findaIK Ditě, vek( Ditě, Vek ), Seznam ). =>vS jsou shromažďovány všechny možnosti i pro různá řešení => findall uspěje přesně jednou M výsledný seznam může být prázdný => pokud neexistuje řešení, uspěje a vrátí S = [] -• ?- bagof( Ditě, vek( Ditě, Vek ), Seznam ). Vek = 7, Seznam = [ petr ]; Vek = 5, Seznam = [ anna, tomas ] ?- findall( Ditě, vek( Ditě, Vek ), Seznam ). Seznam = [petr,anna,tomas] Hana Rudová, Logické programování I, 20. května 2009 78 Vestavěné predikáty Testování typu termu var(X) X je volná proměnná nonvar(X) X není proměnná Hana Rudová, Logické programování I, 20. května 2009 79 Vestavěné predikáty var(X) nonvar(X) Testovaní typu termu 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, 20. května 2009 79 Vestavěné predikáty Testovaní typ var(X) X je volná proměnná nonvar(X) X není proměnná atom(X) X je atom (pavel , : integer(X) X je integer float(X) X je float atomic(X) X je atom nebo číslo compound(X) X je struktura Hana Rudová, Logické programování I, 20. května 2009 79 u termu Pavel Novák', <-->) Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné 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, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, Nl is NO + 1, count( X, S, Nl, N). Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, Nl is NO + 1, count( X, S, Nl, N). count( X, [_|S], NO, N) :- count( X, S, NO, N). Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, Nl is NO + 1, count( X, S, Nl, N). count( X, [_|S], NO, N) :- count( X, S, NO, N). :-? count( a, [a,b,a,a], N ) N=3 Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, Nl is NO + 1, count( X, S, Nl, 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, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). count( X, [X|S], NO, N) :- !, Nl is NO + 1, count( X, S, Nl, 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 N=3 Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné predikáty Určení počtu výskytů prvku v seznamu count( X, S, N ) :- count( X, S, 0, N ). count( _, [], N, N ). countC X, [X|S], NO, N) :- !, Nl is NO + 1, countC X, S, Nl, N) countC X, [_|S], NO, N) :- countC X, S, NO, N). :-? countC a, [a,b,a,a], N ) :-? countC a, [a,b,X,Y], N). N=3 N=3 countC _, [], N, N ). countC X, [Y|S], NO, N ) :- nonvarCY), X = Y, !, Nl is NO + 1, countC X, S, Nl, N ) countC X, [_|S], NO, N ) :- countC X, S, NO, N ). Hana Rudová, Logické programování I, 20. května 2009 80 Vestavěné predikáty Konstrukce a dekompozice atomu -• Atom (opakování) -• řetězce písmen, čísel, „_" začínající malým písmenem: pavel , pavel_novak, x2, x4_34 M řetězce speciálních znaků:+, <->, ===> M řetězce v apostrofech: 'Pavel', Pavel Novák', 'prší', 'ano' ?- 'ano'=A. A = ano Hana Rudová, Logické programování I, 20. května 2009 81 Vestavěné predikáty Konstrukce a dekompozice atomu -• Atom (opakování) -• řetězce písmen, čísel, „_" začínající malým písmenem: pavel , pavel_novak, x2, x4_34 M řetězce speciálních znaků:+, <->, ===> M řetězce v apostrofech: 'Pavel', Pavel Novák', 'prší', 'ano' ?- 'ano'=A. A = ano M Řetězec znaků v uvozovkách * př. "ano", "Pavel" ?- A="Pavel". ?- A="ano". A = [80,97,118,101,108] A=[97,110,111] M př. použití: konstrukce a dekompozice atomu na znaky, vstup a výstup do souboru Hana Rudová, Logické programování I, 20. května 2009 81 Vestavěné predikáty Konstrukce a dekompozice atomu -• Atom (opakování) -• řetězce písmen, čísel, „_" začínající malým písmenem: pavel , pavel_novak, x2, x4_34 M řetězce speciálních znaků:+, <->, ===> M řetězce v apostrofech: 'Pavel', Pavel Novák', 'prší', 'ano' ?- 'ano'=A. A = ano M Řetězec znaků v uvozovkách * př. "ano", "Pavel" ?- A="Pavel". ?- A="ano". A = [80,97,118,101,108] A=[97,110,111] M př. použití: konstrukce a dekompozice atomu na znaky, vstup a výstup do souboru 3 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, 20. května 2009 81 Vestavěné predikáty Konstrukce a dekompozice termu M Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Hana Rudová, Logické programování I, 20. května 2009 82 Vestavěné predikáty Konstrukce a dekompozice termu M Konstrukce a dekompozice termu Term =.. [ Funktor | SeznamArgumentu ] a(9,e) =.. [a,9,e] Cil =.. [ Funktor | SeznamArgumentu ], call( Cil ) Hana Rudová, Logické programování I, 20. května 2009 82 Vestavěné predikáty Konstrukce a dekompozice termu M 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, 20. května 2009 82 Vestavěné predikáty Konstrukce a dekompozice termu M 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, 20. května 2009 82 Vestavěné predikáty Konstrukce a dekompozice termu M 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 některé argumenty, pak je efektivnější: functor( Term, Funktor, Arita ) functorC a(9,e), a, 2 ) Hana Rudová, Logické programování I, 20. května 2009 82 Vestavěné predikáty Konstrukce a dekompozice termu M 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 některé argumenty, pak je efektivnější: functor( Term, Funktor, Arita ) functorC a(9,e), a, 2 ) functor(atom,atom,0) functor(l,1,0) Hana Rudová, Logické programování I, 20. května 2009 82 Vestavěné predikáty Konstrukce a dekompozice termu M 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 některé argumenty, pak je efektivnější: functor( Term, Funktor, Arita ) functorC a(9,e), a, 2 ) functor(atom,atom,0) functor(l,1,0) arg( N, Term, Argument ) arg( 2, a(9,e), e) Hana Rudová, Logické programování I, 20. května 2009 82 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/1) => konec rozkladu Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/1) => konec rozkladu -• Term je složený (=. ./2 , functor/3) ^> procházení seznamu argumentů a rozklad každého argumentu Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 M Příklad: ground/1 uspěje, pokud v termu nejsou proměnné; jinak neuspěje Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 -• Příklad: ground/1 uspěje, pokud v termu nejsou proměnné; jinak neuspěje g round(Term) :- atomic(Term), !. Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 -• Příklad: ground/1 uspěje, pokud v termu nejsou proměnné; jinak neuspěje g round(Term) :- atomic(Term), !. ground(Term) :- var(Term), !, fail. Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 -• Příklad: ground/1 uspěje, pokud v termu nejsou proměnné; jinak neuspěje g round(Term) :- atomic(Term), !. ground(Term) :- var(Term), !, fail. ground([H|T]) :- !, ground(H), ground(T). Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 -• Příklad: ground/1 uspěje, pokud v termu nejsou proměnné; jinak neuspěje g round(Term) :- atomic(Term), !. ground(Term) :- var(Term), !, fail. ground([H|T]) :- !, ground(H), ground(T). ground(Term) :- Term =.. [ _Funktor | Argumenty ], groundC Argumenty ). Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Rekurzivní rozklad termu -• Term je proměnná (var/1), atom nebo číslo (atomi c/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 -• Příklad: ground/1 uspěje, pokud v termu nejsou proměnné; jinak neuspěje g round(Term) :- atomic(Term), !. ground(Term) :- var(Term), !, fail. ground([H|T]) :- !, ground(H), ground(T). ground(Term) :- Term =.. [ _Funktor | Argumenty ], groundC Argumenty ). ?- ground(s(2,[a(l,3),b,c],X)). ?- ground(s(2,[a(l,3),b,c])). no yes Hana Rudová, Logické programování I, 20. května 2009 83 Vestavěné predikáty Příklad: dekompozice termu I. -• count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. -• count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu -• ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). N=2 Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. -• count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu -• ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). N=2 3 count_term( X, T, N ) :- count_term( X, T, 0, N). Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. -• count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu -• ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). N=2 3 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, NO, N ) :- integer(T), X = T, !, N is NO + 1. Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. -• count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu -• ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). N=2 3 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, NO, N ) :- integer(T), X = T, !, N is NO + 1. count_term( _, T, N, N ) :- atomic(T), !. Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. -• count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu -• ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). N=2 3 count_term( X, T, N ) :- count_term( X, T, 0, N). count_term( X, T, NO, N ) :- integer(T), X = T, !, N is NO + 1. count_term( _, T, N, N ) :- atomic(T), !. count_term( _, T, N, N ) :- var(T), !. Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) T, N, N ) T, N, N ) T, NO, N ) - integer(T), X = T, !, N is NO + 1 atomic(T), !. var(T), !. - T =.. [ _ | Argumenty ], Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) T, N, N ) T, N, N ) T, NO, N ) - integer(T), X = T, !, N is NO + 1 atomic(T), !. var(T), !. - T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) T, N, N ) T, N, N ) T, NO, N ) - integer(T), X = T, !, N is NO + 1 atomic(T), !. var(T), !. - T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) :- integer(T), X = T, !, N is NO + 1 T, N, N ) :- atomic(T), !. T, N, N ) :- var(T), !. T, NO, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], NO, N ) :- count_term( X, H, 0, Nl), Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) :- integer(T), X = T, !, N is NO + 1 T, N, N ) :- atomic(T), !. T, N, N ) :- var(T), !. T, NO, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], NO, N ) :- count_term( X, H, 0, Nl), N2 is NO + Nl, Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) :- integer(T), X = T, !, N is NO + 1 T, N, N ) :- atomic(T), !. T, N, N ) :- var(T), !. T, NO, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], NO, N ) :- count_term( X, H, 0, Nl), N2 is NO + Nl, count_arg( X, T, N2, N ). Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) :- integer(T), X = T, !, N is NO + 1 T, N, N ) :- atomic(T), !. T, N, N ) :- var(T), !. T, NO, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], NO, N ) :- count_term( X, H, 0, Nl), N2 is NO + Nl, count_arg( X, T, N2, N ). ?- count_term( 1, [a,2,[b,c],[d,[e,f],Y]], N ). Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Příklad: dekompozice termu I. count_term( Integer, Term, N ) určí počet výskytů celého čísla v termu ?- count_term( 1, a(l,2,b(x,z(a,b,l)),Y), N ). count_term( X, T, N ) :- count_term( X, T, 0, N). N=2 count_term( X count_term( _ count_term( _ count_term( X T, NO, N ) :- integer(T), X = T, !, N is NO + 1. T, N, N ) :- atomic(T), !. T, N, N ) :- var(T), !. T, NO, N ) :- T =.. [ _ | Argumenty ], count_arg( X, Argumenty, NO, N ). count_arg( _, [], N, N ). count_arg( X, [ H | T ], NO, N ) :- count_term( X, H, 0, Nl), N2 is NO + Nl, count_arg( X, T, N2, N ). M ?- count_term( 1, [a,2,[b,c],[d,[e,f],Y]], N ). count_term( X, T, NO, N ) :- T = [_|_], !, count_arg( X, T, NO, N ). klauzuli přidáme před poslední klauzuli count_term/4 Hana Rudová, Logické programování I, 20. května 2009 84 Vestavěné predikáty Cvičení: dekompozice termu -• Napište predikát substituteC Podterm, Term, Podterml, Terml), který nahradí všechny výskyty Podterm v Term termem Podterml a výsledek vrátí v Terml -• Předpokládejte, že Term a Podterm jsou termy bez proměnných -• ?- substitute( sin(x), 2*sin(x)*f(sin(x)), t, F ). F=2*t*f(t) Hana Rudová, Logické programování I, 20. května 2009 85 Vestavěné predikáty Technika a styl programování v Prologu Technika a styl programování v Prologu -• Styl programování v Prologu M některá pravidla správného stylu M správný vs. špatný styl M komentáře -• Ladění -• Efektivita Hana Rudová, Logické programování I, 20. května 2009 87 Technika a styl programování v Prologu Styl programování v Prologu I. -• Cílem stylistických konvencí je 3 redukce nebezpečí programovacích chyb 3 psaní čitelných a srozumitelných programů, které se dobře ladí a modifikují Hana Rudová, Logické programování I, 20. května 2009 88 Technika a styl programování v Prologu Styl programování v Prologu I. -• Cílem stylistických konvencí je 3 redukce nebezpečí programovacích chyb 3 psaní čitelných a srozumitelných programů, které se dobře ladí a modifikují -• Některá pravidla správného stylu M krátké klauzule -• krátké procedury; dlouhé procedury pouze s uniformní strukturou (tabulka) Hana Rudová, Logické programování I, 20. května 2009 88 Technika a styl programování v Prologu Styl programování v Prologu I. -• Cílem stylistických konvencí je 3 redukce nebezpečí programovacích chyb 3 psaní čitelných a srozumitelných programů, které se dobře ladí a modifikují -• Některá pravidla správného stylu M krátké klauzule -• krátké procedury; dlouhé procedury pouze s uniformní strukturou (tabulka) M klauzule se základními (hraničními) případy psát před rekurzivními klauzulemi M vhodná jména procedur a proměnných -i* nepoužívat seznamy ([. . .]) nebo závorky ({...}, (...)) pro termy pevné arity 3 vstupní argumenty psát před výstupními Hana Rudová, Logické programování I, 20. května 2009 88 Technika a styl programování v Prologu 23 Styl programování v Prologu I. -• Cílem stylistických konvencí je 3 redukce nebezpečí programovacích chyb 3 psaní čitelných a srozumitelných programů, které se dobře ladí a modifikují -• Některá pravidla správného stylu M krátké klauzule -• krátké procedury; dlouhé procedury pouze s uniformní strukturou (tabulka) M klauzule se základními (hraničními) případy psát před rekurzivními klauzulemi M vhodná jména procedur a proměnných -i* nepoužívat seznamy ([. . .]) nebo závorky ({...}, (...)) pro termy pevné arity 3 vstupní argumenty psát před výstupními -• struktura programu -jednotné konvence v rámci celého programu, např. mezery, prázdné řádky, odsazení S* klauzule stejné procedury na jednom místě; prázdné řádky mezi klauzulemi; každý cíl na zvláštním řádku Hana Rudová, Logické programování I, 20. května 2009 88 Technika a styl programování v Prologu 23 Správný styl programování -• konstrukce setříděného seznamu Seznam3 ze setříděných seznamů Seznámí, Seznam2: merge( Seznámí, Seznam2, Seznam3 ) 3 merge( [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení merge( Seznam, [], Seznam ). Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení merge( Seznam, [], Seznam ). mergeC [X|Telol], [Y|Telo2], [X|Telo3] ) :- Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení merge( Seznam, [], Seznam ). mergeC [X|Telol], [Y|Telo2], [X|Telo3] ) :-X < Y, !, Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení merge( Seznam, [], Seznam ). mergeC [X|Telol], [Y|Telo2], [X|Telo3] ) :-X < Y, !, mergeC Telol, [Y|Telo2], Telo3 ). Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení merge( Seznam, [], Seznam ). mergeC [X|Telol], [Y|Telo2], [X|Telo3] ) :-X < Y, !, mergeC Telol, [Y|Telo2], Telo3 ). mergeC Seznámí, [Y|Telo2], [Y|Telo3] ) :- Hana Rudová, Logické programování I, 20. května 2009 89 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( Seznámí, Seznam2, Seznam3 ) M mergeC [2,4,7], [1,3,4,8], [1,2,3,4,4,7,8] ) -• merge( [], Seznam, Seznam ) :- ! . % prevence redundantních řešení merge( Seznam, [], Seznam ). mergeC [X|Telol], [Y|Telo2], [X|Telo3] ) :-X < Y, !, mergeC Telol, [Y|Telo2], Telo3 ). mergeC Seznámí, [Y|Telo2], [Y|Telo3] ) :-mergeC Seznámí, Telo2, Telo3 ). Hana Rudová, Logické programování I, 20. května 2009 89 Technika a styl programování v Prologu Špatný styl programování mergeC SI, S2, S3 ) 51 = [] , ! , S3 = S2 52 =[],!, S3 = SI 51 = [X|T1], 52 = [Y|T2], ( X < Y, !, Z = X, merge( TI, S2, T3 ) ; Z = Y, merge( SI, 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, 20. května 2009 90 Technika a styl programování v Prologu Styl programování v Prologu II. M Středník „;" může způsobit nesrozumitelnost klauzule M nedávat středník na konec řádku, používat závorky 3 v některých případech: rozdělení klauzle se středníkem do více klauzulí Hana Rudová, Logické programování I, 20. května 2009 91 Technika a styl programování v Prologu Styl programování v Prologu II. M Středník „;" může způsobit nesrozumitelnost klauzule M nedávat středník na konec řádku, používat závorky 3 v některých případech: rozdělení klauzle se středníkem do více klauzulí -• Opatrné používání operátoru řezu -• preferovat použití zeleného řezu (nemění deklarativní sémantiku) -• červený řez používat v jasně definovaných konstruktech negace: P, !, fail; true \+ P alternativy: Podmínka, !, Cill ; Cil2 Podminka -> Cill ; Cil2 Hana Rudová, Logické programování I, 20. května 2009 91 Technika a styl programování v Prologu Styl programování v Prologu II. M Středník „;" může způsobit nesrozumitelnost klauzule M nedávat středník na konec řádku, používat závorky 3 v některých případech: rozdělení klauzle se středníkem do více klauzulí -• Opatrné používání operátoru řezu -• preferovat použití zeleného řezu (nemění deklarativní sémantiku) -• červený řez používat v jasně definovaných konstruktech negace: P, !, fail; true \+ P alternativy: Podmínka, !, Cill ; Cil2 Podminka -> Cill ; Cil2 -• Opatrné používání negace „\+" 3 negace jako neúspěch: negace není ekvivalentní negaci v matematické logice Hana Rudová, Logické programování I, 20. května 2009 91 Technika a styl programování v Prologu Styl programování v Prologu II. M Středník „;" může způsobit nesrozumitelnost klauzule M nedávat středník na konec řádku, používat závorky 3 v některých případech: rozdělení klauzle se středníkem do více klauzulí -• Opatrné používání operátoru řezu -• preferovat použití zeleného řezu (nemění deklarativní sémantiku) -• červený řez používat v jasně definovaných konstruktech negace: P, !, fail; true \+ P alternativy: Podmínka, !, Cill ; Cil2 Podminka -> Cill ; Cil2 -• Opatrné používání negace „\+" 3 negace jako neúspěch: negace není ekvivalentní negaci v matematické logice M Pozor na assert a retract: snižuji transparentnost chování programu Hana Rudová, Logické programování I, 20. května 2009 91 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) M jak jsou hlavní koncepty (objekty) reprezentovány Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) M jak jsou hlavní koncepty (objekty) reprezentovány -• doba výpočtu a paměťové nároky Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) M jak jsou hlavní koncepty (objekty) reprezentovány -• doba výpočtu a paměťové nároky -• jaké jsou limitace programu Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) M jak jsou hlavní koncepty (objekty) reprezentovány -• doba výpočtu a paměťové nároky -• jaké jsou limitace programu -• zda jsou použity nějaké speciální rysy závislé na systému Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) M jak jsou hlavní koncepty (objekty) reprezentovány -• doba výpočtu a paměťové nároky -• jaké jsou limitace programu M zda jsou použity nějaké speciální rysy závislé na systému M jaký je význam predikátů v programu, jaké jsou jejich argumenty, které jsou vstupní a které výstupní (pokud víme) M vstupní argumenty „+", výstupní „-" merge( +Seznaml, +Seznam2, -Seznam3 ) 3 JmenoPredikatu/Arita merge/3 Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Dokumentace a komentáře -• co program dělá, jak ho používat (jaký cíl spustit a jaké jsou očekávané výsledky), příklad použití -• které predikáty jsou hlavní (top-level) M jak jsou hlavní koncepty (objekty) reprezentovány -• doba výpočtu a paměťové nároky -• jaké jsou limitace programu M zda jsou použity nějaké speciální rysy závislé na systému M jaký je význam predikátů v programu, jaké jsou jejich argumenty, které jsou vstupní a které výstupní (pokud víme) M vstupní argumenty „+", výstupní „-" merge( +Seznaml, +Seznam2, -Seznam3 ) 3 JmenoPredikatu/Arita merge/3 M algoritmické a implementační podrobnosti Hana Rudová, Logické programování I, 20. května 2009 92 Technika a styl programování v Prologu Ladění -• Přepínače na trasování: trace/O, notrace/O -• Trasování specifického predikátu: spy/1, nospy/1 M spyC merge/3 ) -• debug/0, nodebug/0: pro trasování pouze predikátů zadaných spy/1 Hana Rudová, Logické programování I, 20. května 2009 93 Technika a styl programování v Prologu Ladění -• Přepínače na trasování: trace/0, notrace/0 -• Trasování specifického predikátu: spy/1, nospy/1 M spyC merge/3 ) -• debug/0, nodebug/0: pro trasování pouze predikátů zadaných spy/1 -• Libovolná část programu může být spuštěna zadáním vhodného dotazu: trasování cíle M vstupní informace: jméno predikátu, hodnoty argumentů při volání -• výstupní informace -i* při úspěchu hodnoty argumentů splňující cíl J* při neúspěchu indikace chyby -• nové vyvolání přes ";": stejný cíl je volán při backtrackingu Hana Rudová, Logické programování I, 20. května 2009 93 Technika a styl programování v Prologu Krabičkový (4-branový) model Vizualizace řídícího toku (backtrackingu) na úrovni predikátu M Call: volání cíle 3 Exit: úspěšné ukončení volání cíle -• Fail: volání cíle neuspělo 3 Redo: jeden z následujících cílů neuspěl a systém backtrackuje, aby nalezl alternativy k předchozímu řešení Call | | Exit -------------------------> + predek( X, Z ) :- rodic( X, Z ). +---------------> | predekC X, Z ) :- rodic( X, Y ), | <------------------------------+ predek( Y, Z ). + <------------- Fail I I Redo Hana Rudová, Logické programování I, 20. května 2009 94 Technika a styl programování v Prologu Příklad a (X) - nonvar(X). a (X) - c(X). a (X) - d(X). cd). d(2). Call 1 1 Exi t -> + a(X) :- nonvar(X).| ----------> I a(X) :- c(X). | <----------- -- + a(X) :- d(X). + <---------- Fan" 1 | I Redo Hana Rudová, Logické programování I, 20. května 2009 trasování 95 Technika a styl programování v Prologu Příklad a (X) - nonvar(X). a (X) - c(X). a (X) - d(X). cd). d(2). Call 1 1 Exi t -> + a(X) :- nonvar(X).| ----------> I a(X) :- c(X). | <----------- -- + a(X) :- d(X). + <---------- Fan" 1 | I Redo Hana Rudová, Logické programování I, 20. května 2009 trasování I ?- a(X). 1 1 Call: a(_463) ? 2 2 Call: nonvar(_463) ? 2 2 Fail: nonvar(_463) ? 9 5 Technika a styl programování v Prologu Příklad a (X) - nonvar(X). a (X) - c(X). a (X) - 0(X). cd). 0(2). Call 1 1 Exi t -> + a(X) :- nonvar(X).| ------> | a(X) :- c(X). | <------ -- + a(X) :- d(X). + <------ Fan" 1 | I Redo Hana Rudová, Logické programování I, 20. května 2009 trasování ?_ a(X). 1 1 Call a(_463) ? 2 2 Call nonvar(_463) ? 2 2 Fail nonvar(_463) ? 3 2 Call c(_463) ? 3 2 Exit c(D ? 1 1 Exit a(l) ? X = 1 ? 9 5 Technika a styl programování v Prologu Příklad a (X) - nonvar(X). a (X) - c(X). a (X) - d(X). cd). d(2). Call 1 1 Exi t -> + a(X) :- nonvar(X).| ------> I a(X) :- c(X). | <------ -- + a(X) :- d(X). + <------ Fan" 1 | I Redo Hana Rudová, Logické programování I, 20. května 2009 trasování ?_ X = 1 ? a(X). 1 1 Call a(_463) ? 2 2 Call nonvar(_463) ? 2 2 Fail nonvar(_463) ? 3 2 Call c(_463) ? 3 2 Exit c(D ? 1 1 Exit a(l) ? ľ > 1 1 Redo a(l) ? 4 2 Call d(_463) ? 9 5 Technika a styl programování v Prologu Příklad a (X) - nonvar(X). a (X) - c(X). a (X) - 0(X). cd). 0(2). Call 1 1 Exi t -> + a(X) :- nonvar(X).| ------> | a(X) :- c(X). | <------ -- + a(X) :- d(X). + <------ Fan" 1 | I Redo Hana Rudová, Logické programování I, 20. května 2009 trasování 1 ?- a(X). 1 1 Call a(_463) ? 2 2 Call nonvar(_463) ? 2 2 Fail nonvar(_463) ? 3 2 Call c(_463) ? 3 2 Exit c(D ? ? 1 1 Exit a(l) ? X = 1 ? ■ > 1 1 Redo a(l) ? 4 2 Call d(_463) ? 4 2 Exit d(2) ? 1 1 Exit a(2) ? X = 2 ? ■ > no % trace l ?- 9 5 Technika a styl programování v Prologu Efektivita -• Čas výpočtu, paměťové nároky, a také časové nároky na vývoj programu 3 u Prologu můžeme častěji narazit na problémy s časem výpočtu a pamětí M Prologovské aplikace redukují čas na vývoj 3 vhodnost pro symbolické, nenumerické výpočty se strukturovanými objekty a relacemi mezi nimi Hana Rudová, Logické programování I, 20. května 2009 96 Technika a styl programování v Prologu Efektivita -• Čas výpočtu, paměťové nároky, a také časové nároky na vývoj programu 3 u Prologu můžeme častěji narazit na problémy s časem výpočtu a pamětí M Prologovské aplikace redukují čas na vývoj 3 vhodnost pro symbolické, nenumerické výpočty se strukturovanými objekty a relacemi mezi nimi -• Pro zvýšení efektivity je nutno se zabývat procedurálními aspekty 3 zlepšení efektivity při prohledávání 3 odstranění zbytečného backtrackingu «i* zrušení provádění zbytečných alternativ co nejdříve -• návrh vhodnějších datových struktur, které umožní efektivnější operace s objekty Hana Rudová, Logické programování I, 20. května 2009 96 Technika a styl programování v Prologu Zlepšení efektivity: základní techniky M Optimalizace posledního volání (LCO) a akumulátory -• Rozdílové seznamy při spojování seznamů -• Caching: uložení vypočítaných výsledků do programové databáze Hana Rudová, Logické programování I, 20. května 2009 97 Technika a styl programování v Prologu Zlepšení efektivity: základní techniky M Optimalizace posledního volání (LCO) a akumulátory -• Rozdílové seznamy při spojování seznamů -• Caching: uložení vypočítaných výsledků do programové databáze -• Indexace podle prvního argumentu M např. v SICStus Prologu 3 při volání predikátu s prvním nainstaniovaným argumentem se používá hašovací tabulka zpřístupňující pouze odpovídající klauzule M zamestnanecC Prijmeni, KrestniJméno, Odděleni, ...) Hana Rudová, Logické programování I, 20. května 2009 97 Technika a styl programování v Prologu Zlepšení efektivity: základní techniky M Optimalizace posledního volání (LCO) a akumulátory -• Rozdílové seznamy při spojování seznamů -• Caching: uložení vypočítaných výsledků do programové databáze -• Indexace podle prvního argumentu M např. v SICStus Prologu 3 při volání predikátu s prvním nainstaniovaným argumentem se používá hašovací tabulka zpřístupňující pouze odpovídající klauzule M zamestnanecC Prijmeni, KrestniJméno, Odděleni, ...) M Determinismus: M rozhodnout, které klauzule mají uspět vícekrát, ověřit požadovaný determinismus Hana Rudová, Logické programování I, 20. května 2009 97 Technika a styl programování v Prologu Predikátová logika l.řádu Teorie logického programování -• PROLOG: PROgramming in LOGic, část predikátové logiky l.řádu M fakta: rodic(petr,petrik), VXa(X) -• klauzule: VXVY rodic(X,Y) => predek(X,Y) Hana Rudová, Logické programování I, 20. května 2009 99 Teorie logického programování Teorie logického programování -• PROLOG: PROgramming in LOGic, část predikátové logiky l.řádu M fakta: rodic(petr,petrik), VXa(X) -• klauzule: VXVY rodic(X,Y) => predek(X,Y) -• Predikátová logika I. řádu (PL1) -• soubory objektů: lidé, čísla, body prostoru, ... -• syntaxe PL1, sémantika PL1, pravdivost a dokazatelnost Hana Rudová, Logické programování I, 20. května 2009 99 Teorie logického programování Teorie logického programování -• PROLOG: PROgramming in LOGic, část predikátové logiky l.řádu M fakta: rodic(petr,petrik), VXa(X) -• klauzule: VXVY rodic(X,Y) => predek(X,Y) -• Predikátová logika I. řádu (PL1) -• soubory objektů: lidé, čísla, body prostoru, ... -• syntaxe PL1, sémantika PL1, pravdivost a dokazatelnost -• Rezoluce ve výrokové logice, v PL1 -• dokazovací metoda M Rezoluce v logickém programování -• Backtracking, řez, negace vs. rezoluce Hana Rudová, Logické programování I, 20. května 2009 99 Teorie logického programování Predikátová logika I. řádu (PL1) Abeceda JA jazyka £ PL1 se skládá ze symbolů: M proměnné X, Y, ... označují libovolný objekt z daného oboru Hana Rudová, Logické programování I, 20. května 2009 100 Predikátová logika Predikátová logika I. řádu (PLl) Abeceda JA jazyka £ PLl se skládá ze symbolů: -• proměnné X, Y, ... označují libovolný objekt z daného oboru M funkční symboly f, g, ... označují operace (příklad: +, x ) M arita = počet argumentů, n-ární symbol, značíme f/n -• nulární funkční symboly - konstanty: označují význačné objekty (příklad: 0, 1, ...) Hana Rudová, Logické programování I, 20. května 2009 100 Predikátová logika Predikátová logika I. řádu (PL1) Abeceda JA jazyka £ PL1 se skládá ze symbolů: -• proměnné X, Y, ... označují libovolný objekt z daného oboru M funkční symboly f, g, ... označují operace (příklad: +, x ) M arita = počet argumentů, n-ární symbol, značíme f/n -• nulární funkční symboly - konstanty: označují význačné objekty (příklad: 0, 1, ...) -• predikátové symboly p,q, ... pro vyjádření vlastností a vztahů mezi objekty M arita = počet argumentů, n-ární symbol, značíme p/n příklad: <, e Hana Rudová, Logické programování I, 20. května 2009 100 Predikátová logika Predikátová logika I. řádu (PL1) Abeceda JA jazyka £ PL1 se skládá ze symbolů: -• proměnné X, Y, ... označují libovolný objekt z daného oboru M funkční symboly f, g, ... označují operace (příklad: +, x ) M arita = počet argumentů, n-ární symbol, značíme f/n -• nulární funkční symboly - konstanty: označují význačné objekty (příklad: 0, 1, ...) -• predikátové symboly p,q, ... pro vyjádření vlastností a vztahů mezi objekty M arita = počet argumentů, n-ární symbol, značíme p/n příklad: <, e -• logické spojky a, v, ->, =>, = Hana Rudová, Logické programování I, 20. května 2009 100 Predikátová logika Predikátová logika I. řádu (PL1) Abeceda JA jazyka £ PL1 se skládá ze symbolů: -• proměnné X, Y, ... označují libovolný objekt z daného oboru M funkční symboly f, g, ... označují operace (příklad: +, x ) M arita = počet argumentů, n-ární symbol, značíme f/n -• nulární funkční symboly - konstanty: označují význačné objekty (příklad: 0, 1, ...) -• predikátové symboly p,q, ... pro vyjádření vlastností a vztahů mezi objekty M arita = počet argumentů, n-ární symbol, značíme p/n příklad: <, e -• logické spojky a, v, ->, =>, = -• kvantifikátory V, 3 M logika I. řádu používá kvantifikaci pouze pro individua (odlišnost od logik vyššího řádu) M v logice 1. řádu nelze: v R : VA c R, y f : R - R Hana Rudová, Logické programování I, 20. května 2009 100 Predikátová logika Predikátová logika I. řádu (PL1) Abeceda JA jazyka £ PL1 se skládá ze symbolů: -• proměnné X, Y, ... označují libovolný objekt z daného oboru M funkční symboly f, g, ... označují operace (příklad: +, x ) M arita = počet argumentů, n-ární symbol, značíme f/n -• nulární funkční symboly - konstanty: označují význačné objekty (příklad: 0, 1, ...) -• predikátové symboly p,q, ... pro vyjádření vlastností a vztahů mezi objekty M arita = počet argumentů, n-ární symbol, značíme p/n příklad: <, e -• logické spojky a, v, ->, =>, = -• kvantifikátory V, 3 M logika I. řádu používá kvantifikaci pouze pro individua (odlišnost od logik vyššího řádu) M v logice 1. řádu nelze: v R : VA c R, y f : R - R M závorky: ),( Hana Rudová, Logické programování I, 20. května 2009 100 Predikátová logika Jazyky PLI -• Specifikace jazyka L je definována funkčními a predikátovými symboly symboly tedy určují oblast, kterou jazyk popisuje M Jazyky s rovností: obsahují predikátový symbol pro rovnost ,=" Hana Rudová, Logické programování I, 20. května 2009 101 Predikátová logika Jazyky PLI -• Specifikace jazyka L je definována funkčními a predikátovými symboly symboly tedy určují oblast, kterou jazyk popisuje M Jazyky s rovností: obsahují predikátový symbol pro rovnost ,=" Příklady -• jazyk teorie uspořádání -• jazyk s =, binární prediátový symbol < Hana Rudová, Logické programování I, 20. května 2009 101 Predikátová logika Jazyky PLI -• Specifikace jazyka L je definována funkčními a predikátovými symboly symboly tedy určují oblast, kterou jazyk popisuje M Jazyky s rovností: obsahují predikátový symbol pro rovnost ,=" Příklady -• jazyk teorie uspořádání -• jazyk s =, binární prediátový symbol < -• jazyk teorie množin 3 jazyk s =, binární predikátový symbol e Hana Rudová, Logické programování I, 20. května 2009 101 Predikátová logika Jazyky PLI -• Specifikace jazyka L je definována funkčními a predikátovými symboly symboly tedy určují oblast, kterou jazyk popisuje M Jazyky s rovností: obsahují predikátový symbol pro rovnost ,=" Příklady -• jazyk teorie uspořádání -• jazyk s =, binární prediátový symbol < -• jazyk teorie množin 3 jazyk s =, binární predikátový symbol e -• jazyk elementární aritmetiky -• jazyk s =, nulární funkční symbol 0 pro nulu, unární funkční symbol s pro operaci následníka, binární funkční symboly pro sčítání + a násobení x Hana Rudová, Logické programování I, 20. května 2009 101 Predikátová logika Term, atomická formule, formule -• Term nad abecedou JA M každá proměnná z JA je term M je-li f/n z JA a ti,...,tn jsou termy, pak /(ti,..., tn) je také term <• každý term vznikne konečným počtem užití přechozích kroků f( X, g(X,0)) Hana Rudová, Logické programování I, 20. května 2009 102 Predikátová logika Term, atomická formule, formule -• Term nad abecedou JA M každá proměnná z JA je term M je-li f In z JA a ti,..., tn jsou termy, pak /(ti,..., tn) je také term <• každý term vznikne konečným počtem užití přechozích kroků f( X, g(X,0)) M Atomická formule (atom) nad abecedou JA -• je-li p In z JA a ti,..., tn jsou termy, pak p(ti,...,tn) je atomická formule f(X) < g(X,0) Hana Rudová, Logické programování I, 20. května 2009 102 Predikátová logika Term, atomická formule, formule -• Term nad abecedou JA M každá proměnná z JA je term M je-li f In z JA a ti,..., tn jsou termy, pak /(ti,..., tn) je také term <• každý term vznikne konečným počtem užití přechozích kroků f( X, g(X,0)) M Atomická formule (atom) nad abecedou JA 3 je-li pln z JA a ti,..., tn jsou termy, pak p(ti,...,tn) je atomická formule f(X) < g(X,0) -• Formule nad abecedou JA M každá atomická formule je formule -• jsou-li F a G formule, pak také OF), (F a G), (F v G), (F => G), (F = G) jsou formule -• je-li X proměnná a F formule, pak také (VX F) a (3X F) jsou formule 3 každá formule vznikne konečným počtem užití přechozích kroků (3X ((f(X) = 0) a p(0))) Hana Rudová, Logické programování I, 20. května 2009 102 Predikátová logika Interpretace -• Interpretace 1 jazyka L nad abecedou JA je dána -• neprázdnou množinou V (také značíme \1\, nazývá se univerzum) a M zobrazením, které s* každé konstantě c g JA přiřadí nějaký prvek V ± každému funkčnímu symbolu f In g JA přiřadí n-ární operaci nad V ± každému predikátovému symbolu p/n g JA přiřadí n-ární relaci nad V Hana Rudová, Logické programování I, 20. května 2009 103 Predikátová logika Interpretace -• Interpretace 1 jazyka L nad abecedou JA je dána -• neprázdnou množinou V (také značíme \1\, nazývá se univerzum) a M zobrazením, které s* každé konstantě c g JA přiřadí nějaký prvek V ± každému funkčnímu symbolu f In g JA přiřadí n-ární operaci nad V ± každému predikátovému symbolu p/n g JA přiřadí n-ární relaci nad V M Příklad: uspořádání na M 3 jazyk: predikátový symbol menšili 3 interpretace: univerzum R; zobrazení: mensí(x,y) := x < y Hana Rudová, Logické programování I, 20. května 2009 103 Predikátová logika Interpretace -• Interpretace 1 jazyka L nad abecedou JA je dána -• neprázdnou množinou V (také značíme \1\, nazývá se univerzum) a M zobrazením, které s* každé konstantě c g JA přiřadí nějaký prvek V ± každému funkčnímu symbolu f In g JA přiřadí n-ární operaci nad V ± každému predikátovému symbolu p/n g JA přiřadí n-ární relaci nad V M Příklad: uspořádání na M 3 jazyk: predikátový symbol menšili 3 interpretace: univerzum R; zobrazení: mensí(x,y) := x < y M Příklad: elementární aritmetika nad množinou N (včetně 0) -• jazyk: konstanta zero, funční symboly 5/1, plus 12 M interpretace: ± univerzum N; zobrazení: zero := 0, s(x):=l+x, plus(x,y) := x + y Hana Rudová, Logické programování I, 20. května 2009 103 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1 M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp(plus(s(zero),X)) = Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1 M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + op(X) = Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1 M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + op(X) = (1 + qp(zero)) + 0 = Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 *0 Každá dobře utvořená formule označuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktuře a interpretaci Pravdivá formule 1 N^ Q: formule Q označena pravda Neravdivá formule 1 ^m Q: formule Q označena nepravda Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 *0 Každá dobře utvořená formule označuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktuře a interpretaci Pravdivá formule 1 N^ Q: formule Q označena pravda Neravdivá formule 1 ^ Q: formule Q označena nepravda M příklad: pII predikátový symbol, tj. p q lil p := {(1), (3), (5),...} 1 \= p (zero) a p (s (zero)) Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 *0 Každá dobře utvořená formule označuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktuře a interpretaci Pravdivá formule 1 N^ Q: formule Q označena pravda Neravdivá formule 1 ^ Q: formule Q označena nepravda M příklad: pII predikátový symbol, tj. p q lil p := {(1), (3), (5),...} 1 \= p(zero) a p(s(zero)) iff 1 \= p(zero) a 1 \= p(s(zero)) Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 *0 Každá dobře utvořená formule označuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktuře a interpretaci Pravdivá formule 1 N^ Q: formule Q označena pravda Neravdivá formule 1 ^ Q: formule Q označena nepravda M příklad: pII predikátový symbol, tj. p q lil p := {(1), (3), (5),...} 1 \= p(zero) a p(s(zero)) iff 1 \= p(zero) a 1 \= p(s(zero)) iff (op(zero)) g p a (op(s(zero))) g p Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 *0 Každá dobře utvořená formule označuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktuře a interpretaci Pravdivá formule 1 N^ Q: formule Q označena pravda Neravdivá formule 1 ^ Q: formule Q označena nepravda M příklad: pII predikátový symbol, tj. p q lil p := {(1), (3), (5),...} 1 \= p(zero) a p(s(zero)) iff 1 \= p(zero) a 1 \= p(s(zero)) iff (op(zero)) g p a (op(s(zero))) g p iff (op(zero)) g p a ((1 + qp(zero)} g p Hana Rudová, Logické programování I, 20. května 2009 104 Predikátová logika Sémantika formulí -• Ohodnocení proměnné qp(X): každé proměnné X je přiřazen prvek \1\ M Hodnota termu qp(t): každému termu je přiřazen prvek univerza -• příklad: nechť qp(X) := 0 qp (plus (s (zero), X)) = qp(s(zero)) + qp(X) = (1 + qp(zero)) + 0 = (1 + 0)+ 0 = 1 *0 Každá dobře utvořená formule označuje pravdivostní hodnotu (pravda, nepravda) v závislosti na své struktuře a interpretaci Pravdivá formule 1 N^ Q: formule Q označena pravda Neravdivá formule 1 ^ Q: formule Q označena nepravda M příklad: pII predikátový symbol, tj. p q lil p := {(1), (3), (5),...} 1 \= p(zero) a p(s(zero)) iff 1 \= p(zero) a 1 \= p(s(zero)) iff (op(zero)) g p a (op(s(zero))) g p iff (op(zero)) g p a ((1 + qp(zero)} g p iff {0)epa{l)ep {1} g p ale (0) é p, tedy formule je nepravdivá v 1 Hana Rudová, Logické programování I, 20. května 2009 104 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/l: s(x):=x není modelem této formule Hana Rudová, Logické programování I, 20. května 2009 105 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/l: s(x):=x není modelem této formule M Teorie CT jazyka L je množina formulí jazyka Ľ, tzv. axiomů M -■ s(X) = 0 je jeden z axiomů teorie elementární aritmetiky Hana Rudová, Logické programování I, 20. května 2009 105 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/l: s(x):=x není modelem této formule M Teorie CT jazyka L je množina formulí jazyka Ľ, tzv. axiomů M -■ s(X) = 0 je jeden z axiomů teorie elementární aritmetiky -• Model teorie: libovolná interpretace, která je modelem všech jejích axiomů M všechny axiomy teorie musí být v této interpretaci pravdivé Hana Rudová, Logické programování I, 20. května 2009 105 Predikátová logika Model -• Interpretace se nazývá modelem formule, je-li v ní tato formule pravdivá 3 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/l: s(x):=x není modelem této formule M Teorie CT jazyka L je množina formulí jazyka Ľ, tzv. axiomů 3 -■ s(X) = 0 je jeden z axiomů teorie elementární aritmetiky -• Model teorie: libovolná interpretace, která je modelem všech jejích axiomů M všechny axiomy teorie musí být v této interpretaci pravdivé M Pravdivá formule v teorii Ť \= F: pravdivá v každém z modelů teorie CT M říkáme také formule platí v teorii nebo je splněna v teorii 3 formule 1 + s(0) = s(s(0)) je pravdivá v teorii elementárních čísel Hana Rudová, Logické programování I, 20. května 2009 105 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/l: s(x):=x není modelem této formule M Teorie CT jazyka L je množina formulí jazyka Ľ, tzv. axiomů M -■ s(X) = 0 je jeden z axiomů teorie elementární aritmetiky -• Model teorie: libovolná interpretace, která je modelem všech jejích axiomů M všechny axiomy teorie musí být v této interpretaci pravdivé M Pravdivá formule v teorii Ť \= F: pravdivá v každém z modelů teorie CT M říkáme také formule platí v teorii nebo je splněna v teorii 3 formule 1 + s(0) = s(s(0)) je pravdivá v teorii elementárních čísel -• Logicky pravdivá formule i= F: libovolná interpretace je jejím modelem M nebo-li F je pravdivá v každém modelu libovolné teorie M formule G v -> G je logicky pravdivá, formule 1 + s(0) = s(s(0)) není logicky pravdivá Hana Rudová, Logické programování I, 20. května 2009 105 Predikátová logika Zkoumání pravdivosti formulí -• Zjištění pravdivosti provádíme důkazem Důkaz: libovolná posloupnost F\,..., Fn formulí jazyka Ľ, v níž každé Fi je buď axiom teorie jazyka L nebo lze Fi odvodit z předchozích F j (j < í) použitím určitých odvozovacích pravidel Hana Rudová, Logické programování I, 20. května 2009 106 Predikátová logika Zkoumání pravdivosti formulí -• Zjištění pravdivosti provádíme důkazem Důkaz: libovolná posloupnost F\,..., Fn formulí jazyka Ľ, v níž každé Fi je buď axiom teorie jazyka L nebo lze Fi odvodit z předchozích F j (j < í) použitím určitých odvozovacích pravidel -• Odvozovací pravidla - príklady -• pravidlo modus ponens: z formulí F a F ^> G lze odvodit G Hana Rudová, Logické programování I, 20. května 2009 106 Predikátová logika Zkoumání pravdivosti formulí -• Zjištění pravdivosti provádíme důkazem Důkaz: libovolná posloupnost F\,..., Fn formulí jazyka Ľ, v níž každé Fi je buď axiom teorie jazyka L nebo lze Fi odvodit z předchozích F j (j < í) použitím určitých odvozovacích pravidel -• Odvozovací pravidla - príklady -• pravidlo modus ponens: z formulí F a F ^> G lze odvodit G -• rezoluční princip: z formulí F v A, G v ~^A odvodit F v G Hana Rudová, Logické programování I, 20. května 2009 106 Predikátová logika Zkoumání pravdivosti formulí -• Zjištění pravdivosti provádíme důkazem Důkaz: libovolná posloupnost Fu-.., Fn formulí jazyka Ľ, v níž každé Fi je buď axiom teorie jazyka L nebo lze Fi odvodit z předchozích F j (j < í) použitím určitých odvozovacích pravidel -• Odvozovací pravidla - príklady -• pravidlo modus ponens: z formulí F a F ^> G lze odvodit G -• rezoluční princip: z formulí F v A, G v ~^A odvodit F v G M F je dokazatelná z formulí Au ■ ■ ■ ,An Au ■ ■ ■ ,An \- F existuje-li důkaz F z Au • • • ,An Hana Rudová, Logické programování I, 20. května 2009 106 Predikátová logika Zkoumání pravdivosti formulí -• Zjištění pravdivosti provádíme důkazem Důkaz: libovolná posloupnost Fu-.., Fn formulí jazyka Ľ, v níž každé Fi je buď axiom teorie jazyka L nebo lze Fi odvodit z předchozích F j (j < í) použitím určitých odvozovacích pravidel -• Odvozovací pravidla - príklady -• pravidlo modus ponens: z formulí F a F ^> G lze odvodit G 3 rezoluční princip: z formulí F v A, G v ~^A odvodit F v G M F je dokazatelná z formulí Au ■ ■ ■ ,An Au ■ ■ ■ ,An \- F existuje-li důkaz F z Au • • • ,An M Dokazatelné formule v teorii Ť nazýváme teorémy teorie Ť Hana Rudová, Logické programování I, 20. května 2009 106 Predikátová logika Korektnost a úplnost M Uzavřená formule: neobsahuje volnou proměnnou (bez kvantifikace) * VY ((0 < Y) a ( 3X (X < Y))) je uzavřená formule 3 ( 3X (X < Y)) není uzavřená formule Hana Rudová, Logické programování I, 20. května 2009 107 Predikátová logika Korektnost a úplnost M Uzavřená formule: neobsahuje volnou proměnnou (bez kvantifikace) * VY ((0 < Y) a ( 3X (X < Y))) je uzavřená formule 3 ( 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í T a každou uzavřenou formuli F platí: jestliže T \- F pak T N F (jestliže je něco dokazatelné, pak to platí) Hana Rudová, Logické programování I, 20. května 2009 107 Predikátová logika Korektnost a úplnost M Uzavřená formule: neobsahuje volnou proměnnou (bez kvantifikace) * VY ((0 < Y) a ( 3X (X < Y))) je uzavřená formule 3 ( 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í T a každou uzavřenou formuli F platí: jestliže T \- F pak T N F (jestliže je něco dokazatelné, pak to platí) Odvozovací pravidla jsou úplná, jestliže jestliže T N F pak T \- F (jestliže něco platí, pak je to dokazatelné) Hana Rudová, Logické programování I, 20. května 2009 107 Predikátová logika Korektnost a úplnost M Uzavřená formule: neobsahuje volnou proměnnou (bez kvantifikace) * VY ((0 < Y) a ( 3X (X < Y))) je uzavřená formule 3 ( 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í T a každou uzavřenou formuli F platí: jestliže T V- F pak T N F (jestliže je něco dokazatelné, pak to platí) Odvozovací pravidla jsou úplná, jestliže jestliže T N F pak T V- F (jestliže něco platí, pak je to dokazatelné) M PLI: úplná a korektní dokazatelnost, tj. pro teorii CT s množinou axiomů JA platí: Ť \= F právě když JA \- F Hana Rudová, Logické programování I, 20. května 2009 107 Predikátová logika Rezoluce v predikátové logice I. řádu Rezoluce -• rezoluční princip: z F v A, G v ->A odvodit F v G M dokazovací metoda používaná M v Prologu 3 ve většině systémů pro automatické dokazování Hana Rudová, Logické programování I, 20. května 2009 109 Rezoluce -• rezoluční princip: z F v A, G v ->A odvodit F v G M dokazovací metoda používaná M v Prologu 3 ve většině systémů pro automatické dokazování -• procedura pro vyvrácení 3 hledáme důkaz pro negaci formule -• snažíme se dokázat, že negace formule je nesplnitelná => formule je vždy pravdivá Hana Rudová, Logické programování I, 20. května 2009 109 Formule M literal I M pozitivní literal = atomická formule p(ti, ■ ■ ■ , tn) M negativní literal = negace atomické formule ^p(t\, ■ ■ ■ , tn) Hana Rudová, Logické programování I, 20. května 2009 110 Rezoluce v PL1 Formule M literal I M pozitivní literal = atomická formule p(ti, ■ ■ ■ , tn) M negativní literal = negace atomické formule ^p(t\, ■ ■ ■ ,tn) -• klauzule C = konečná množina literálů reprezentující jejich disjunkci M příklad: p(X) v q(a,f) v ^p(Y) notace: {p(X),q(a,f),^p(Y)} M klauzule je pravdivá <=> je pravdivý alespoň jeden z jejích literálů 3 prázdná klauzule se značí D a je vždy nepravdivá (neexistuje v ní pravdivý literal) Hana Rudová, Logické programování I, 20. května 2009 110 Rezoluce v PL1 Formule M literal I M pozitivní literal = atomická formule p(ti, ■ ■ ■ , tn) M negativní literal = negace atomické formule ^p(t\, ■ ■ ■ ,tn) -• klauzule C = konečná množina literálů reprezentující jejich disjunkci M příklad: p(X) v q(a,f) v ^p(Y) notace: {p(X),q(a,f),^p(Y)} M klauzule je pravdivá <=> je pravdivý alespoň jeden z jejích literálů 3 prázdná klauzule se značí D a je vždy nepravdivá (neexistuje v ní pravdivý literal) -• formule F = množina klauzulí reprezentující jejich konjunkci M formule je v tzv. konjuktivní normální formě (konjunkce disjunkcí) M příklad: (p v q) a (^p) a (p v ->g v r) notace: {{p,q}, {^p}, {p, ^q,r}} Hana Rudová, Logické programování I, 20. května 2009 110 Rezoluce v PL1 Formule M literal I M pozitivní literal = atomická formule p(ti, ■ ■ ■ , tn) M negativní literal = negace atomické formule ^p(t\, ■ ■ ■ ,tn) -• klauzule C = konečná množina literálů reprezentující jejich disjunkci M příklad: p(X) v q(a,f) v ^p(Y) notace: {p(X),q(a,f),^p(Y)} M klauzule je pravdivá <=> je pravdivý alespoň jeden z jejích literálů 3 prázdná klauzule se značí D a je vždy nepravdivá (neexistuje v ní pravdivý literal) -• formule F = množina klauzulí reprezentující jejich konjunkci M formule je v tzv. konjuktivní normální formě (konjunkce disjunkcí) M příklad: (p v q) a (^p) a (p v ->g v r) notace: {{p,q}, {^p}, {p, ^q,r}} 3 formule je pravdivá <=> všechny klauzule jsou pravdivé -• prázdná formule je vždy pravdivá (neexistuje klauzule, která by byla nepravdivá) Hana Rudová, Logické programování I, 20. května 2009 110 Rezoluce v PL1 Formule M literal I M pozitivní literal = atomická formule p(ti, ■ ■ ■ , tn) M negativní literal = negace atomické formule ^p(t\, ■ ■ ■ ,tn) -• klauzule C = konečná množina literálů reprezentující jejich disjunkci M příklad: p(X) v q(a,f) v ^p(Y) notace: {p(X),q(a,f),^p(Y)} M klauzule je pravdivá <=> je pravdivý alespoň jeden z jejích literálů 3 prázdná klauzule se značí D a je vždy nepravdivá (neexistuje v ní pravdivý literal) -• formule F = množina klauzulí reprezentující jejich konjunkci M formule je v tzv. konjuktivní normální formě (konjunkce disjunkcí) M příklad: (p v q) a (^p) a (p v ->g v r) notace: {{p,q}, {^p}, {p, ^q,r}} 3 formule je pravdivá <=> všechny klauzule jsou pravdivé -• prázdná formule je vždy pravdivá (neexistuje klauzule, která by byla nepravdivá) M množinová notace: literal je prvek klauzule, klauzule je prvek formule, ... Hana Rudová, Logické programování I, 20. května 2009 110 Rezoluce v PL1 Splnitelnost -• [Opakování:] Interpretace 1 jazyka L je dána univerzem V a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v a predikátovému symbolu p/n n-ární relaci. * příklad: F = {{f(a,b) = f(b,a)}, {f(f(a,a),b) = a}} interpretace li: D = Z, a := 1, b := -l,f:= " + " Hana Rudová, Logické programování I, 20. května 2009 111 Rezoluce v Splnitelnost -• [Opakování:] Interpretace 1 jazyka L je dána univerzem V a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v V a predikátovému symbolu p/n n-ární relaci. * příklad: F = {{f(a,b) = f(b,a)}, {f(f(a,a),b) = a}} interpretace li. D = Z, a := 1, b := -l,f:= " + " -• Formule je splnitelná, existuje-li interpretace, pro kterou je pravdivá -• formule je konjunkce klauzulí, tj. všechny klauzule musí být v dané interpretaci pravdivé -• příklad (pokrač.): F je splnitelná (je pravdivá v li) Hana Rudová, Logické programování I, 20. května 2009 111 Rezoluce v PL1 Splnitelnost -• [Opakování:] Interpretace 1 jazyka L je dána univerzem V a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v V a predikátovému symbolu p/n n-ární relaci. * příklad: F = {{f(a,b) = f(b,a)}, {f(f(a,a),b) = a}} interpretace li. D = Z, a := 1, b := -l,f:= " + " -• Formule je splnitelná, existuje-li interpretace, pro kterou je pravdivá -• formule je konjunkce klauzulí, tj. všechny klauzule musí být v dané interpretaci pravdivé -• příklad (pokrač.): F je splnitelná (je pravdivá v li) 3 Formule je nesplnitelná, neexistuje-li interpretace, pro kterou je pravdivá M tj. formule je ve všech iterpretacích nepravdivá 3 tj. neexistuje interpretace, ve které by byly všechny klauzule pravdivé -• příklad: G = {{p(b)}, {p(a)}, {^p(a)}} je nesplnitelná ({p(a)} a {^p(a)} nemohou být zároveň pravdivé) Hana Rudová, Logické programování I, 20. května 2009 111 Rezoluce v PL1 Rezoluční princip ve výrokové logice -• Rezoluční princip = pravidlo, které umožňuje odvodit z klauzulí C\ u {í} a {^1} u C2 klauzuli C\ u C2 QU {ř} {n[}uC2 d uC2 «• Q u C2 se nazývá rezolventou původních klauzulí Hana Rudová, Logické programování I, 20. května 2009 112 Rezoluce v PLI Rezoluční princip ve výrokové logice Rezoluční princip = pravidlo, které umožňuje odvodit z klauzulí C\ u {í} a {^1} u C2 klauzuli C\ u C2 QU {ř} {n[}uC2 d uC2 Q u C2 se nazývá rezolventou původních klauzulí príklad: {p,r] {-■r,5} (p v r) a (->r v s) {p,s] pvs Hana Rudová, Logické programování I, 20. května 2009 11 2 Rezoluce v PLI Rezoluční princip ve výrokové logice Rezoluční princip = pravidlo, které umožňuje odvodit z klauzulí C\ u {í} a {^1} u C2 klauzuli C\ u C2 ClU{ř} {n[}uC2 Ci uC2 Q u C2 se nazývá rezolventou původních klauzulí příklad: {p,r} {^r,s} (p v r) a (->r v s) {p,s} pvs obě klauzule (p v r) a (->r v 5) musí být pravdivé protože r nestačí 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, 20. května 2009 11 2 Rezoluce v PL1 Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost L-\, ■ ■ ■ j {—ti = C- Kl auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C7, Q pro k,j < í. Hana Rudová, Logické programování I, 20. května 2009 113 Rezoluce v PL1 Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C,, Q pro k,j < í. M příklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, ->r}, {->g}} Hana Rudová, Logické programování I, 20. května 2009 11 3 Rezoluce v PLI Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C,, Q pro k,j < í. M příklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, ->r}, {->g}} Q = {p,r} klauzule z i7 Hana Rudová, Logické programování I, 20. května 2009 11 3 Rezoluce v PLI Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C,, Q pro k,j < í. M příklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, ->r}, {->g}} Q = {p,r} klauzule z i7 Q = {^, ~1^} klauzule z i7 Hana Rudová, Logické programování I, 20. května 2009 11 3 Rezoluce v PLI Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C,, Q pro k,j < í. M příklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, ->r}, {->g}} Q = {p,r} klauzule z i7 Q = {^, ~1^} klauzule z i7 C3 = {p, q} rezolventa C\ a C2 Hana Rudová, Logické programování I, 20. května 2009 11 3 Rezoluce v PLI Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C,, Q pro k,j < í. M příklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, ->r}, {->g}} Q = {p,r} klauzule z i7 Q = {^, ~1^} klauzule z i7 C3 = {p, q} rezolventa C\ a C2 C4 = {-"^} klauzule z i7 Hana Rudová, Logické programování I, 20. května 2009 11 3 Rezoluce v PLI Rezoluční důkaz 3 rezoluční důkaz klauzule C z formule F je konečná posloupnost auzulí taková, že Q je buď klauzule z i7 nebo rezolventa C,, Q pro k,j < í. M příklad: rezoluční důkaz {p} z formule F = {{p,r}, {q, ->r}, {->g}} Q = {p,r} klauzule z i7 Q = {^, ~1^} klauzule z i7 C3 = {p, q} rezolventa C\ a C2 C4 = {-"^} klauzule z i7 C5 = {p} = C rezolventa C3 a C4 Hana Rudová, Logické programování I, 20. května 2009 11 3 Rezoluce v PLI Rezoluční vyvrácení -• důkaz pravdivosti formule F spočívá v demonstraci nesplnitelnosti ->F M ^F nesplnitelná => ^F je nepravdivá ve všech interpretacích => F je vždy pravdivá Hana Rudová, Logické programování I, 20. května 2009 114 Rezoluce v PL1 Rezoluční vyvrácení -• důkaz pravdivosti formule F spočívá v demonstraci nesplnitelnosti ->F M ^F nesplnitelná => ^F je nepravdivá ve všech interpretacích => F je vždy pravdivá M začneme-li z klauzulí reprezentujících -"i7, musíme postupným uplatňováním rezolučního principu dospět k prázdné klauzuli D 3 Příklad: F... -"a v a Hana Rudová, Logické programování I, 20. května 2009 114 Rezoluce v PL1 Rezoluční vyvrácení -• důkaz pravdivosti formule F spočívá v demonstraci nesplnitelnosti ->F M ^F nesplnitelná => ^F je nepravdivá ve všech interpretacích => F je vždy pravdivá M začneme-li z klauzulí reprezentujících -"i7, musíme postupným uplatňováním rezolučního principu dospět k prázdné klauzuli D 3 Příklad: F... -"a v a -■i7... a a -"a ^F...{{a},{^a}} Hana Rudová, Logické programování I, 20. května 2009 114 Rezoluce v PL1 Rezoluční vyvrácení -• důkaz pravdivosti formule F spočívá v demonstraci nesplnitelnosti ->F M ^F nesplnitelná => ^F je nepravdivá ve všech interpretacích => F je vždy pravdivá M začneme-li z klauzulí reprezentujících -"i7, musíme postupným uplatňováním rezolučního principu dospět k prázdné klauzuli D 3 Příklad: F... -"a v a -■i7... a a -"a ^F...{{a},{^a}} Ci = {a}Xi = í^a] rezolventa C\ a C2 je D, tj. F je vždy pravdivá -• rezoluční důkaz D z formule G se nazývá rezoluční vyvrácení formule G .# a tedy G je nepravdivá ve všech interpretacích, tj. G je nesplnitelná Hana Rudová, Logické programování I, 20. května 2009 114 Rezoluce v PL1 Strom rezolučního důkazu -• strom rezolučního důkazu klauzule C z formule i7 je binární strom: M kořen je označen klauzulí C, M listy jsou označeny klauzulemi z F a M každý uzel, který není listem, X má bezprostředními potomky označené klauzulemi C\ a C2 varianty rezoluční metody Hana Rudová, Logické programování I, 20. května 2009 1 21 Rezoluce v PL1 Zefektivnění rezoluce -• rezoluce je intuitivně efektivnější než axiomatické systémy M axiomatické systémy: který z axiomů a pravidel použít? M rezoluce: pouze jedno pravidlo -• stále ale příliš mnoho možností, jak hledat důkaz v prohledávacím prostoru -• problém SAT= {S\S je splnitelná } NP úplný, nicméně: menší prohledávací prostor vede k rychlejšímu nalezení řešení -• strategie pro zefektivnění prohledávání => varianty rezoluční metody -• vylepšení prohledávání 3 zastavit prohledávání cest, které nejsou slibné M specifikace pořadí, jak procházíme alternativními cestami Hana Rudová, Logické programování I, 20. května 2009 1 21 Rezoluce v PL1 84 Varianty rezoluční metody -• Věta: Každé omezení rezoluce je korektní. M stále víme, že to, co jsme dokázali, platí Hana Rudová, Logické programování I, 20. května 2009 122 Rezoluce v PL1 Varianty rezoluční metody -• Věta: Každé omezení rezoluce je korektní. M stále víme, že to, co jsme dokázali, platí M r-rezoluce: klauzule účastnící se rezoluce nejsou tautologie úplná M tautologie nepomůže ukázat, že formule je nesplnitelná Hana Rudová, Logické programování I, 20. května 2009 1 22 Rezoluce v PL1 Varianty rezoluční metody -• Věta: Každé omezení rezoluce je korektní. M stále víme, že to, co jsme dokázali, platí M r-rezoluce: klauzule účastnící se rezoluce nejsou tautologie úplná M tautologie nepomůž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ž alespoň jednaje v této interpretaci nepravdivá 3 pokud jsou obě klauzule pravdivé, těžko odvodíme nesplnitelnost formule Hana Rudová, Logické programování I, 20. května 2009 1 22 Rezoluce v PL1 Varianty rezoluční metody -• Věta: Každé omezení rezoluce je korektní. M stále víme, že to, co jsme dokázali, platí M r-rezoluce: klauzule účastnící se rezoluce nejsou tautologie úplná M tautologie nepomůž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ž alespoň jednaje v této interpretaci nepravdivá M pokud jsou obě klauzule pravdivé, těžko odvodíme nesplnitelnost formule -• vstupní (input) rezoluce: neúplná alespoň jedna z klauzulí, použitá při rezoluci, je z výchozí vstupní množiny S Hana Rudová, Logické programování I, 20. května 2009 1 22 Rezoluce v PL1 Varianty rezoluční metody -• Věta: Každé omezení rezoluce je korektní. M stále víme, že to, co jsme dokázali, platí M r-rezoluce: klauzule účastnící se rezoluce nejsou tautologie úplná M tautologie nepomůž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ž alespoň jednaje v této interpretaci nepravdivá M pokud jsou obě klauzule pravdivé, těžko odvodíme nesplnitelnost formule -• vstupní (input) rezoluce: neúplná alespoň jedna z klauzulí, použitá při rezoluci, je z výchozí vstupní množiny S * {{p,q}, {^P,q}, {p,^q}, {^P,^q}} existuje rezoluční vyvrácení neexistuje rezoluční vyvrácení pomocí vstupní rezoluce Hana Rudová, Logické programování I, 20. května 2009 122 Rezoluce v PL1 Rezoluce a logické programování Lineární rezoluce varianta rezoluční metody snaha o generování lineární posloupnosti místo stromu v každém kroku kromě prvního můžeme použít bezprostředně předcházející rezolventu a k tomu buď některou z klauzulí vstupní množiny S nebo některou z předcházejících rezolvent C o B o C, Bj C2 B2 C n C B n Hana Rudová, Logické programování I, 20. května 2009 124 Rezoluce a logické programování Lineární rezoluce varianta rezoluční metody M snaha o generování lineární posloupnosti místo stromu -• v každém kroku kromě prvního můžeme použít bezprostředně předcházející rezolventu a k tomu buď některou z klauzulí vstupní množiny S nebo některou z předcházejících rezolvent lineární rezoluční důkaz C z S je posloupnost dvojic (Co,ßo>, ■ ■ ■ (Cn,Bn) taková, že C = Cn+i a 3 Co a každá ßi jsou prvky 5 nebo některé Cj,j < í -• každá Q+i, í < n je rezolventa Q a £í C o C C 2 c n C B o B B 2 B n Hana Rudová, Logické programování I, 20. května 2009 124 Rezoluce a logické programování Lineární rezoluce varianta rezoluční metody M snaha o generování lineární posloupnosti místo stromu -• v každém kroku kromě prvního můžeme použít bezprostředně předcházející rezolventu a k tomu buď některou z klauzulí vstupní množiny S nebo některou z předcházejících rezolvent lineární rezoluční důkaz C z S je posloupnost dvojic (Co,ßo>, ■ ■ ■ (Cn,Bn) taková, že C = Cn+i a 3 Co a každá ßi jsou prvky 5 nebo některé Cj,j < í -• každá Q+i, í < n je rezolventa Q a £í lineární vyvrácení 5 = lineární rezoluční důkaz D z S C o C C 2 C n C B o B B 2 B n Hana Rudová, Logické programování I, 20. května 2009 124 Rezoluce a logické programování Lineární -• příklad: 5 = {Ai,A2,A3,A4} Ai= {p,q} A2 = {p,^q} A3 = {^P,q} A4 = {^P,^q} Hana Rudová, Logické programování I, 20. května 2009 rezoluce I. 125 Rezoluce a logické programování Lineární -• příklad: 5 = {Ai,A2,A3,A4} Ai= {p,q} A2 = {p,^q} A3 = {^P,q} A4 = {^P,^q} Hana Rudová, Logické programování I, 20. května 2009 rezoluce I. C t B i {p,q} {p, ^q} \/ {p} {^p>qJ \/ \/ í^p} {p} D 125 Rezoluce a logické programování Lineární -• příklad: 5 = {Ai,A2,A3,A4} Ai= {p,q} A2 = {p,^q} A3 = {^P,q} A4 = {^P,^q} M S\ vstupní množina klauzulí -• Q: střední klauzule -• Bf boční klauzule Hana Rudová, Logické programování I, 20. května 2009 rezoluce I. {p,q} {p, ^q} \/ {p} {^p>qJ \/ \/ í^p} {p} D 125 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, Hana Rudová, Logické programování I, 20. května 2009 126 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.Ti,...,-.rn} {H} {-.7i,...,-.rn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.Ti,...,-.rn} {H} {-.7i,...,-.rn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal M Prolog: H \ - Ti, ■ ■ ■ ,Tn. Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.Ti,...,-.rn} {H} {-.7i,...,-.rn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a T, Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.Ti,...,-.rn} {H} {-.7i,...,-.rn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a T, Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.Ti,...,-.rn} {H} {-.7i,...,-.rn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a T, 3 H ^T Hv ->T Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} Hi V ■ ■ ■ vHmV-Ti V ■ ■ ■ v-T, -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.Ti,...,-.rn} {H} {-.7i,...,-.rn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a T, MH^T Hv^T Hv-ľiV---v-rn Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} HiV---vHmV-.7iV---V-Tn -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.7i,...,-.rn} {H} {-.Ti,...,-.Tn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a Tn MH^T Hv^T Hv-ľiV---v-rn Klauzule: {fí,-> Ti,...,->Tn} Hana Rudová, Logické programování I, 20. května 2009 1 26 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-.Tn} HiV---vHmV-.7iV---V-Tn -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.7i,...,-.rn} {H} {-.Ti,...,-.Tn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a Tn 3H^T Hv^T Hv-ľiV---v-rn Klauzule: {fí,-> Ti,...,->Tn} -• Fakt: pouze jeden pozitivní literal M Prolog: H. Matematická logika: H Klauzule: {H} Hana Rudová, Logické programování I, 20. května 2009 126 Rezoluce a logické programování Prologovská notace -• Klauzule v matematické logice * {Hi,- ■ ■ ,Hm,-.7i,- ■ ■ ,-Tn} HiV---vHmV-.7iV---V-Tn -• Hornova klauzule: nejvýše jeden pozitivní literal * {H,-.7i,...,-.rn} {H} {-.Ti,...,-.Tn} -• h v -Ti v ■ ■ ■ v -rn h -Ti v ■ ■ ■ v -rn -• Pravidlo: jeden pozitivní a alespoň jeden negativní literal -• Prolog: H : - T\, ■ ■ ■ , Tn. Matematická logika: H <= T\ a ■ ■ ■ a Tn 3H^T Hv^T Hv-ľiV---v-rn Klauzule: {ff,-Ti,...,-Tn} -• Fakt: pouze jeden pozitivní literal M Prolog: H. Matematická logika: H Klauzule: {H} M Cílová klauzule: žádný pozitivní literal M Prolog: : - Ti,... Tn. Matematická logika: -Ti v ■ ■ ■ v ^Tn Klauzule: {-Ti, ■ ■ ■ ^Tn} Hana Rudová, Logické programování I, 20. května 2009 126 Rezoluce a logické programování Logický program 3 Programová klauzule: právě jeden pozitivní literal (fakt nebo pravidlo) 3 Logický program: konečná množina programových klauzulí .» Príklad: .# logický program jako množina klauzulí: P = {Pl,P2,P3] Pi={p}, P2 = {p,^q}, Ps = {q} Hana Rudová, Logické programování I, 20. května 2009 1 27 Rezoluce a logické programování Logický program M Programová klauzule: právě jeden pozitivní literal (fakt nebo pravidlo) M Logický program: konečná množina programových klauzulí M Príklad: -• logický program jako množina klauzulí: P= {Pl,P2,Ps} Pi = {p}, P2 = {p,^q}, Pi = {q} M logický program v prologovske notaci: P- p: -q. q. 3 cílová klauzule: G = {->g, ->p} : -q, p. Hana Rudová, Logické programování I, 20. května 2009 127 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule M Začneme s cílovou klauzulí: Q = G M Boční klauzule vybíráme z programových klauzulí P M G= {^q^p} P= {Pi,P2,P3} • Pi = {p}, Pz = {p,^q}, P3 = {q} M :-q,p. p. p--q, q- Hana Rudová, Logické programování I, 20. května 2009 1 28 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule 3 Začneme s cílovou klauzulí: Q = G 3 Boční klauzule vybíráme z programových klauzulí P *G={^q,^p} P={P1,P2,P3}: Pi = {p}, P2 = {p,^q}, P3 = iq} -• :-q,p. p. p--q, a- {^q,^p} {q} >'-»< (Pl D Hana Rudová, Logické programování I, 20. května 2009 128 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule Začneme s cílovou klauzulí: Q = G Boční klauzule vybíráme z programových klauzulí P G = {^q,^p} P= {Pi,P2,P3) ■ Pi = {p}, Pz = {p,^q}, P3 = {q} q,p. P- p: -q, q D {^q,^p} {<Ö {^q^pj {q} {^p} fa^ti {^p} {p} í^qJ (q) D Hana Rudová, Logické programování I, 20. května 2009 128 Rezoluce a logické programování Lineární rezoluce pro Hornovy klauzule Začneme s cílovou klauzulí: Q = G Boční klauzule vybíráme z programových klauzulí P G = {^q,^p} P= {Pi,P2,P3) ■ Pi = {p}, Pz = {p,^q}, P3 = {q} q,p. P- p: -q, q D {^q,^p} {<Ö {^q^pj {q} {^p} fa^ti {^p} {p} í^qJ (q) D Střední klauzule jsou cílové klauzule Hana Rudová, Logické programování I, 20. května 2009 128 Rezoluce a logické programování Lineární vstupní rezoluce -• Vstupní rezoluce na P u {G} M (opakování:) alespoň jedna z klauzulí použitá při rezoluci je z výchozí vstupní množiny M začneme s cílovou klauzulí: Q = G M boční klauzule jsou vždy z P (tj. jsou to programové klauzule) Hana Rudová, Logické programování I, 20. května 2009 1 29 Rezoluce a logické programování Lineární vstupní rezoluce -• Vstupní rezoluce na P u {G} M (opakování:) alespoň jedna z klauzulí použitá při rezoluci je z výchozí vstupní množiny M začneme s cílovou klauzulí: Q = G M boční klauzule jsou vždy z P (tj. jsou to programové klauzule) M (Opakování:) Lineární rezoluční důkaz C z 5 je posloupnost dvojic {Co,B0), ... {Cn,Bn) taková, že C = Cn+i a M Co a každá Bi jsou prvky S nebo některé Cj,j < í M každá Q+i, í < n je rezolventa Q a £í Hana Rudová, Logické programování I, 20. května 2009 1 29 Rezoluce a logické programování Lineární vstupní rezoluce -• Vstupní rezoluce na P u {G} M (opakování:) alespoň jedna z klauzulí použitá při rezoluci je z výchozí vstupní množiny M začneme s cílovou klauzulí: Co = G M boční klauzule jsou vždy z P (tj. jsou to programové klauzule) M (Opakování:) Lineární rezoluční důkaz C z 5 je posloupnost dvojic {Co,B0), ... {Cn,Bn) taková, že C = Cn+i a M Co a každá Bi jsou prvky S nebo některé Cj,j < í M každá Q+i, í < n je rezolventa Q a £í «• Lineární vstupní (Linear Input) rezoluce (Ll-rezoluce) C z P u {G} posloupnost dvojic {Co,Bo), ... {Cn,Bn) taková, že C = Cn+i a «• Co = G a každá Bi jsou prvky P lineární rezoluce + vstupní rezoluce «• každá Ci+i, í < n je rezolventa Q a Bi Hana Rudová, Logické programování I, 20. května 2009 129 Rezoluce a logické programování Cíle a fakta při lineární rezoluci -• Věta:Je-li S nesplnitelná množina Hornovych klauzulí, pak S obsahuje alespoň jeden cíl a jeden fakt. -• pokud nepoužiji cíl, mám pouze fakta (1 požit.literal) a pravidla (1 požit.literal a alespoň jeden negat. literal), při rezoluci mi stále zůstává alespoň jeden požit, literal Hana Rudová, Logické programování I, 20. května 2009 1 30 Rezoluce a logické programování Cíle a fakta při lineární rezoluci -• Věta:Je-li S nesplnitelná množina Hornovych klauzulí, pak S obsahuje alespoň jeden cíl a jeden fakt. -• pokud nepoužiji cíl, mám pouze fakta (1 požit.literal) a pravidla (1 požit.literal a alespoň jeden negat. literal), při rezoluci mi stále zůstává alespoň jeden požit, literal -• pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 požit.literal a alespoň jeden negat. literal), v rezolventě mi stále zůstávají negativní literály Hana Rudová, Logické programování I, 20. května 2009 1 30 Rezoluce a logické programování Cíle a fakta při lineární rezoluci -• Věta:Je-li S nesplnitelná množina Hornovych klauzulí, pak S obsahuje alespoň jeden cíl a jeden fakt. -• pokud nepoužiji cíl, mám pouze fakta (1 požit.literal) a pravidla (1 požit.literal a alespoň jeden negat. literal), při rezoluci mi stále zůstává alespoň jeden požit, literal -• pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 požit.literal a alespoň jeden negat. literal), v rezolventě mi stále zůstávají negativní literály -• Věta: Existuje-li rezoluční důkaz prázdné množiny z množiny S Hornovych klauzulí, pak tento rezoluční strom má v listech jedinou cílovou klauzuli. -• pokud začnu důkaz pravidlem a faktem, pak dostanu zase pravidlo M pokud začnu důkaz dvěma pravidly, pak dostanu zase pravidlo M na dvou faktech rezolvovat nelze Hana Rudová, Logické programování I, 20. května 2009 1 30 Rezoluce a logické programování Cíle a fakta při lineární rezoluci -• Věta:Je-li S nesplnitelná množina Hornovych klauzulí, pak S obsahuje alespoň jeden cíl a jeden fakt. -• pokud nepoužiji cíl, mám pouze fakta (1 požit.literal) a pravidla (1 požit.literal a alespoň jeden negat. literal), při rezoluci mi stále zůstává alespoň jeden požit, literal -• pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 požit.literal a alespoň jeden negat. literal), v rezolventě mi stále zůstávají negativní literály -• Věta: Existuje-li rezoluční důkaz prázdné množiny z množiny S Hornovych klauzulí, pak tento rezoluční strom má v listech jedinou cílovou klauzuli. -• pokud začnu důkaz pravidlem a faktem, pak dostanu zase pravidlo M pokud začnu důkaz dvěma pravidly, pak dostanu zase pravidlo M na dvou faktech rezolvovat nelze => dokud nepoužiji cíl pracuji stále s množinou faktů a pravidel Hana Rudová, Logické programování I, 20. května 2009 1 30 Rezoluce a logické programování Cíle a fakta při lineární rezoluci -• Věta:Je-li S nesplnitelná množina Hornovych klauzulí, pak S obsahuje alespoň jeden cíl a jeden fakt. -• pokud nepoužiji cíl, mám pouze fakta (1 požit.literal) a pravidla (1 požit.literal a alespoň jeden negat. literal), při rezoluci mi stále zůstává alespoň jeden požit, literal -• pokud nepoužiji fakt, mám pouze cíle (negat.literály) a pravidla (1 požit.literal a alespoň jeden negat. literal), v rezolventě mi stále zůstávají negativní literály -• Věta: Existuje-li rezoluční důkaz prázdné množiny z množiny S Hornovych klauzulí, pak tento rezoluční strom má v listech jedinou cílovou klauzuli. -• pokud začnu důkaz pravidlem a faktem, pak dostanu zase pravidlo M pokud začnu důkaz dvěma pravidly, pak dostanu zase pravidlo M na dvou faktech rezolvovat nelze => dokud nepoužiji cíl pracuji stále s množinou faktů a pravidel -• pokud použiji v důkazu cílovou klauzulí, fakta mi ubírají negat.literály, pravidla mi je přidávají, v rezolventě mám stále samé negativní literály, tj. nelze rezolvovat s dalším cílem Hana Rudová, Logické programování I, 20. května 2009 130 Rezoluce a logické programování Korektnost a úplnost -• Věta: Množina S Hornových klauzulí je nesplnitelná, právě když existuje rezoluční vyvrácení S pomocí vstupní rezoluce. M Korektnost platí stejně jako pro ostatní omezení rezoluce -• Úplnost Ll-rezoluce pro Hornovy klauzule: Nechť P je množina programových klauzulí a G cílová klauzule. Je—I i množina P u {G} Hornových klauzulí nesplnitelná, pak existuje rezoluční vyvrácení P u {G} pomocí Ll-rezoluce. * vstupní rezoluce pro (obecnou) formuli sama o sobě není úplná => Ll-rezoluce aplikovaná na (obecnou) formuli nezaručuje, že nalezeneme důkaz, i když formule platí! Hana Rudová, Logické programování I, 20. května 2009 1 31 Rezoluce a logické programování Korektnost a úplnost -• Věta: Množina S Hornových klauzulí je nesplnitelná, právě když existuje rezoluční vyvrácení S pomocí vstupní rezoluce. M Korektnost platí stejně jako pro ostatní omezení rezoluce -• Úplnost Ll-rezoluce pro Hornovy klauzule: Nechť P je množina programových klauzulí a G cílová klauzule. Je—I i množina P u {G} Hornových klauzulí nesplnitelná, pak existuje rezoluční vyvrácení P u {G} pomocí Ll-rezoluce. * vstupní rezoluce pro (obecnou) formuli sama o sobě není úplná => Ll-rezoluce aplikovaná na (obecnou) formuli nezaručuje, že nalezeneme důkaz, i když formule platí! M Význam Ll-rezoluce pro Hornovy klauzule: M P = {Pi,... ,Pn], G = {Gi,..., Gm} M Ll-rezolucí ukážeme nesplnitelnost P\ a ■ ■ ■ a Pn a (->Gi v ■ ■ ■ v ^Gm) Hana Rudová, Logické programování I, 20. května 2009 1 31 Rezoluce a logické programování Korektnost a úplnost -• Věta: Množina S Hornových klauzulí je nesplnitelná, právě když existuje rezoluční vyvrácení S pomocí vstupní rezoluce. M Korektnost platí stejně jako pro ostatní omezení rezoluce -• Úplnost Ll-rezoluce pro Hornovy klauzule: Nechť P je množina programových klauzulí a G cílová klauzule. Je—I i množina P u {G} Hornových klauzulí nesplnitelná, pak existuje rezoluční vyvrácení P u {G} pomocí Ll-rezoluce. * vstupní rezoluce pro (obecnou) formuli sama o sobě není úplná => Ll-rezoluce aplikovaná na (obecnou) formuli nezaručuje, že nalezeneme důkaz, i když formule platí! M Význam Ll-rezoluce pro Hornovy klauzule: M P = {Pi,... ,Pn], G = {Gi,..., Gm} M Ll-rezolucí ukážeme nesplnitelnost P\ a ■ ■ ■ a Pn a (->Gi v ■ ■ ■ v ^Gm) ^ pokud tedy předpokládáme, že program {Pi,... ,Pn} platí, tak musí být nepravdivá (->Gi v ■ ■ ■ v ->Gm), tj. musí platit G\ a ■ ■ ■ a Gm Hana Rudová, Logické programování I, 20. května 2009 131 Rezoluce a logické programování Uspořádané klauzule (definite clauses) M Klauzule = množina literálu -• Uspořádaná klauzule (definite clause) = posloupnost literálu 3 nelze volně měnit pořadí literálu M Rezoluční princip pro uspořádané klauzule: ______{^Ap,...,^An}_______{£, -iBo,...,-iBm}______ {^Ao,..., -"Aí-i, ^Bqp, ..., ^Bmp^Ai+i,..., ^An}a M uspořádaná rezolventa: {^A0,..., -"Aí-i, ~^B0p,..., -^Bmp,^Ai+i,..., -^An} potenciální instanciace proměnné ve vstupní cílové klauzuli Výsledná substituce {answer substitution) 0 = 0Q01 • • • 0 n složení unifikací Hana Rudová, Logické programování I, 20. května 2009 140 Rezoluce a logické programování Význam SLD-rezolučního vyvrácení 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 Hana Rudová, Logické programování I, 20. května 2009 141 Rezoluce a logické programování Význam SLD-rezolučního vyvrácení 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 h- -G (3)Ph(BÍ)(G!(Í)A---AGn(Í)) Hana Rudová, Logické programování I, 20. května 2009 141 Rezoluce a logické programování Význam SLD-rezolučního vyvrácení P u {G} M Množina P programových klauzulí, cílová klauzule G M 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 h -G (3)Ph(3X)(Gi(X)A---AGn(X)) a jedná se tak o důkaz existence vhodných objektů, které na základě vlastností množiny P splňují konjunkci literálů v cílové klauzuli Hana Rudová, Logické programování I, 20. května 2009 141 Rezoluce a logické programování Význam SLD-rezolučního vyvrácení P u {G} M Množina P programových klauzulí, cílová klauzule G M 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 h -G (3)Ph(3X)(Gi(X)A---AGn(X)) a jedná se tak o důkaz existence vhodných objektů, které na základě vlastností množiny P splňují konjunkci literálů v cílové klauzuli M Důkaz nesplnitelnosti P u {G} znamená nalezení protipříkladu ten pomocí SLD-stromu konstruuje termy (odpověď) splňující konjunkci v (3) Hana Rudová, Logické programování I, 20. května 2009 141 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á, Logické programování I, 20. května 2009 142 Rezoluce a logické programování Výpočetní strategie -• Korektní výpočetní strategie prohledávání stromu výpočtu musí zaručit, že se každý (konečný) výsledek nalézt v konečném čase -• Korektní výpočetní strategie = prohledávání stromu do šířky M exponenciální paměťová náročnost M složité řídící struktury Hana Rudová, Logické programování I, 20. května 2009 142 Rezoluce a logické programování Výpočetní strategie -• Korektní výpočetní strategie prohledávání stromu výpočtu musí zaručit, že se každý (konečný) výsledek nalézt v konečném čase -• Korektní výpočetní strategie = prohledávání stromu do šířky M exponenciální paměťová náročnost M složité řídící struktury M Použitelná výpočetní strategie = prohledávání stromu do hloubky M jednoduché řídící struktury (zásobník) M lineární paměťová náročnost -• není ale úplná: nenalezne vyvrácení i když existuje s procházení nekonečné větve stromu výpočtu => na nekonečných stromech dojde k zacyklení s> nedostaneme se tak na jiné existující úspěšné uzly Hana Rudová, Logické programování I, 20. května 2009 142 Rezoluce a logické programování SLD-rezoluce v Prologu: úplnost -• Prolog: prohledávání stromu do hloubky => neúplnost použité výpočetní strategie -• Implementace SLD-rezoluce v Prologu 3 není úplná logický program: q : -r. (1) r:-q. (2) q. (3) dotaz: : -q. Hana Rudová, Logické programování I, 20. května 2009 143 Rezoluce a logické programování Test výskytu -• Kontrola, zda se proměnná vyskytuje v termu, kterým ji substituujeme 3 dotaz : -a(B,B). M logický program: a(X,f(X)). 3 vede k: [B/X], [X/f(X)] M Unifikátor pro g(Xu ...Jn)a g(f(X0,X0),f(Xi,Xi),... ,/(Xn_i,Xn_i)) X\ = f(Xo,Xo), X2 = f(X\,Xi),..., Xn = f(Xn-i,Xn-i) X2 = f(f(Xo,Xo),f(Xo,Xo)), ■ ■ ■ délka termu pro Xk exponenciálně narůstá Hana Rudová, Logické programování I, 20. května 2009 144 Rezoluce a logické programování Test výskytu -• Kontrola, zda se proměnná vyskytuje v termu, kterým ji substituujeme 3 dotaz : -a(B,B). M logický program: a(X,f(X)). 3 vede k: [B/X], [X/f(X)] M Unifikátor pro g(Xu ...Jn)a g(f(X0,X0),f(Xi,Xi),... ,/(Xn-i,*n-i)) X\ = f(Xo,Xo), X2 = f(X\,Xi),..., Xn = f(Xn-i,Xn-i) X2 = f(f(Xo,Xo),f(Xo,Xo)), ■ ■ ■ délka termu pro X^ exponenciálně narůstá => exponenciální složitost na ověření kontroly výskytu M Test výskytu se při unifikaci v Prologu neprovádí 3 Důsledek: ?-X = f(X) uspěje s X = f (f (f (f (f (f (f (f (f (f U)))))))))) Hana Rudová, Logické programování I, 20. května 2009 144 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost M Implementace SLD-rezoluce v Prologu nepoužívá při unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(Xj(X)). X = /(/(/(/(...)))))))))) problém se projeví Hana Rudová, Logické programování I, 20. května 2009 145 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost M Implementace SLD-rezoluce v Prologu nepoužívá při unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(Xj(X)). X = /(/(/(/(...)))))))))) 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, 20. května 2009 145 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost M Implementace SLD-rezoluce v Prologu nepoužívá při unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(Xj(X)). X = /(/(/(/(...)))))))))) 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) 3 Řešení: problém typu (2) převést na problém typu (1) ? Hana Rudová, Logické programování I, 20. května 2009 145 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost M Implementace SLD-rezoluce v Prologu nepoužívá při unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(Xj(X)). X = /(/(/(/(...)))))))))) 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) 3 Řešení: problém typu (2) převést na problém typu (1) ? -• každá proměnná v hlavě klauzule se objeví i v těle, aby se vynutilo hledání unifikátoru (přidáme X = X pro každou X, která se vyskytuje pouze v hlavě) t: -p(X,X). p(X,f(X)):-X = X. Hana Rudová, Logické programování I, 20. května 2009 145 Rezoluce a logické programování SLD-rezoluce v Prologu: korektnost M Implementace SLD-rezoluce v Prologu nepoužívá při unifikaci test výskytu => není korektní (1) t(X) : -p(X,X). : -t(X). p(Xj(X)). X = /(/(/(/(...)))))))))) 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) 3 Řešení: problém typu (2) převést na problém typu (1) ? 3 každá proměnná v hlavě klauzule se objeví i v těle, aby se vynutilo hledání unifikátoru (přidáme X = X pro každou X, která se vyskytuje pouze v hlavě) t: -p(X,X). p(X,f(X)):-X = X. M optimalizace v kompilátoru mohou způsobit opět odpověď „yes" Hana Rudová, Logické programování I, 20. května 2009 145 Rezoluce a logické programování Řízení implementace: řez řez se syntakticky chová jako kterýkoliv jiný literal nemá ale žádnou deklarativní sémantiku místo toho mění implementaci programu V ■ -q,\,v- ořezání Hana Rudová, Logické programování I, 20. května 2009 146 Rezoluce a logické programování Řízení implementace: řez řez se syntakticky chová jako kterýkoliv jiný literal nemá ale žádnou deklarativní sémantiku místo toho mění implementaci programu P ■ -q,\,v-snažíme se splnit g pokud uspěji => přeskočím řez a pokračuji jako by tam řez nebyl 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 rodiče : -p. a zkouším další větev Hana Rudová, Logické programování I, 20. května 2009 146 Rezoluce a logické programování Řízení implementace: řez řez se syntakticky chová jako kterýkoliv jiný literal nemá ale žádnou deklarativní sémantiku místo toho mění implementaci programu P ■ -q,Uv. snažíme se splnit q pokud uspěji => přeskočím řez a pokračuji jako by tam řez nebyl pokud ale neuspěji (a tedy i při backtrackingu) a vracím se přes řez => vracím se až na rodiče : -p. a zkouším další větev => nezkouším tedy další možnosti, jak splnit p upnutí => a nezkouším ani další možnosti, jak splnit q v SLD-stromu ořezání ořezání Hana Rudová, Logické programování I, 20. května 2009 146 Rezoluce a logické programování Příklad: řez t: -p,r. (D t: -s. (2) p : -q(X),\,v. (3) p : -u,w. (4) q(a). (5) q(b). (6) s. (7) u. (8) :- t. (1}/\(2) :-p,r. «x x :- q(X),!,v,r. a] (5) X • ■ /vr • • (!) - v, r. fail Hana Rudová, Logické programování I, 20. května 2009 147 Rezoluce a logické p a(X) : -b(X,Y),\,c(Y). a(X) : -c(X). M2,3). M1.2). c(2). 5(A") : -a(X). s(X) : -p(A). p(B):-q(A,B),r(B). p (A) : -íí(A,A). q(a,a). q(a,b). r(b). Hana Rudová, Logické programování I, 20. květn II .- b(X,Y),!,c(Y). [X/2.Y/3] (3) .- !,c(3). (rez) fail Rezoluce a logické programování a(X) : -b(X,Y),c(Y),\. a(X) : -c(X). M2,3). M1.2). c(2). 5(A") : -a(X). s(X) : -p(A). p(B):-q(A,B),r(B). p (A) : -íí(A,A). q(a,a). q(a,b). r(b). Hana Rudová, Logické programování I, 20. květn • • -b(X,Y),, c(Y),L (3)/ \ (4) [X/1 ,Y/2] • ■ c(3),!. • (5) fail • • _ / • • (rez) D [X/11 Rezoluce a logické programování Operační a deklarativní sémantika Operační sémantika -• Operační sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez proměnných, které lze pro nějaký cíl Ql odvodit nějakým rezolučním důkazem ze vstupní množiny P u {Q}. Hímto výrazem jsou míněny všechny cíle, pro něž zmíněný rezoluční důkaz existuje. Hana Rudová, Logické programování I, 20. května 2009 1 51 Sémantiky Operační sémantika -• Operační sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez proměnných, které lze pro nějaký cíl Ql odvodit nějakým rezolučním důkazem ze vstupní množiny P u {Q}. Hímto výrazem jsou míněny všechny cíle, pro něž zmíněný rezoluční důkaz existuje. -• Deklarativní sémantika logického programu P 11 Hana Rudová, Logické programování I, 20. května 2009 1 51 Sémantiky Opakování: interpretace M Interpretace 1 jazyka L je dána univerzem V a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v V a predikátovému symbolu p/n n-ární relaci. * příklad: F = {{f(a,b) = f(b,a)}, {f(f(a,a),b) = a}} interpretace li: D = Z, a := 1, b := -l,f:= " + " Hana Rudová, Logické programování I, 20. května 2009 1 52 Sémantiky Opakování: interpretace M Interpretace 1 jazyka L je dána univerzem V a zobrazením, které přiřadí konstantě c prvek D, funkčnímu symbolu f/n n-ární operaci v V a predikátovému symbolu p/nn-ávn\ relaci. * příklad: F = {{f(a,b) = f(b,a)}, {f(f(a,a),b) = a}} interpretace li: D = Z, a := 1, b := -l,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, 20. května 2009 1 52 Sémantiky Herbrandovy interpretace -• Omezení na obor skládající se ze symbolických výrazů tvořených z predikátových a funkčních symbolů daného jazyka M při zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretacemi Hana Rudová, Logické programování I, 20. května 2009 153 Sémantiky Herbrandovy interpretace -• Omezení na obor skládající se ze symbolických výrazů tvořených z predikátových a funkčních symbolů daného jazyka M při zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretacemi -• Herbrandovo univerzum: množina všech termů bez proměnných, které mohou být tvořeny funkčními symboly a konstantami daného jazyka 3 Herbrandova interpretace: libovolná interpretace, která přiřazuje M proměnným prvky Herbrandova univerza M konstantám sebe samé M funkčním symbolům funkce, které symbolu f pro argumenty ti, ■ ■ ■ , tn přiřadí term f(ti, • • • ,tn) M predikátovým symbolům libovolnou funkci z Herbrand. univerza do pravdivostních hodnot Hana Rudová, Logické programování I, 20. května 2009 1 53 Sémantiky Herbrandovy interpretace -• Omezení na obor skládající se ze symbolických výrazů tvořených z predikátových a funkčních symbolů daného jazyka M při zkoumání pravdivosti není nutné uvažovat modely nad všemi interpretacemi -• Herbrandovo univerzum: množina všech termů bez proměnných, které mohou být tvořeny funkčními symboly a konstantami daného jazyka 3 Herbrandova interpretace: libovolná interpretace, která přiřazuje M proměnným prvky Herbrandova univerza M konstantám sebe samé M funkčním symbolům funkce, které symbolu f pro argumenty ti, ■ ■ ■ , tn přiřadí term f(ti, • • • ,tn) M predikátovým symbolům libovolnou funkci z Herbrand. univerza do pravdivostních hodnot -• Herbrandův model množiny uzavřených formulí T\ Herbrandova interpretace taková, že každá formule z T je v ní pravdivá. Hana Rudová, Logické programování I, 20. května 2009 153 Sémantiky Specifikace Herbrandova modelu -• Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant M Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol Hana Rudová, Logické programování I, 20. května 2009 1 54 Sémantiky Specifikace Herbrandova modelu -• Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant M Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol -• Příklad: Herbrandova interpretace a Herbranduv model množiny formulí lichy(s(0)). % (1) lichy(s(s(X))) :- lichy(X). % (2) Hana Rudová, Logické programování I, 20. května 2009 1 54 Sémantiky Specifikace Herbrandova modelu -• Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant M Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol -• Příklad: Herbrandova interpretace a Herbranduv model množiny formulí lichy(s(0)). % (1) lichy(s(s(X))) :- lichy(X). % (2) 3 li = 0 není model (1) Hana Rudová, Logické programování I, 20. května 2009 1 54 Sémantiky Specifikace Herbrandova modelu -• Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant M Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol -• Příklad: Herbrandova interpretace a Herbranduv model množiny formulí lichy(s(0)). % (1) lichy(s(s(X))) :- lichy(X). % (2) 3 li = 0 není model (1) 3 12 = {líchy(s(0))} není model (2) Hana Rudová, Logické programování I, 20. května 2009 1 54 Sémantiky Specifikace Herbrandova modelu -• Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant M Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol -• Příklad: Herbrandova interpretace a Herbranduv model množiny formulí lichy(s(0)). % (1) lichy(s(s(X))) :- lichy(X). % (2) 3 li = 0 není model (1) 3 12 = {líchy(s(0))} není model (2) M 13 = {líchy(5(0)), líchy(5(5(5(0))))} není model (2) Hana Rudová, Logické programování I, 20. května 2009 1 54 Sémantiky Specifikace Herbrandova modelu -• Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant M Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol -• Příklad: Herbrandova interpretace a Herbranduv model množiny formulí lichy(s(0)). % (1) lichy(s(s(X))) :- lichy(X). % (2) 3 li = 0 není model (1) 3 12 = {líchy(s(0))} není model (2) M 13 = {líchy(5(0)), líchy(5(5(5(0))))} není model (2) M % = {líchy(sn(0))\ne {1,3,5,7,...}} Herbranduv model (1) i (2) Hana Rudová, Logické programování I, 20. května 2009 1 54 Sémantiky Specifikace Herbrandova modelu Herbrandovy interpretace mají předdefinovaný význam funktorů a konstant Pro specifikaci Herbrandovy interpretace tedy stačí zadat relace pro každý predikátový symbol Příklad: Herbrandova interpretace a Herbranduv model množiny formulí lichy(s(0)). % (1) lichy(s(s(X))) :- lichy(X). % (2) li = 0 12 = {líchy(s(0))} 13 = {líchy(5(0)), líchy(5(5(5(0))))} 14 = {líchy(sn(0))\ne {1,3,5,7,...}} 15 = {líchy(sn(0))\nGN}} není model (1) není model (2) není model (2) Herbranduv model (1) i (2) Herbranduv model (1) i (2) Hana Rudová, Logické programování I, 20. května 2009 154 Sémantiky Příklad: Herbrandovy interpretace rodič(a,b). rodic(b,c). predek(X,Y) :- rodic(X,Y). predek(X,Z) :- rodic(X,Y), predek(Y,Z). Hana Rudová, Logické programování I, 20. května 2009 1 55 Sémantiky Příklad: Herbrandovy interpretace rodic(a,b). rodic(b,c). predek(X,Y) :- rodic(X,Y). predek(X,Z) :- rodic(X,Y), predek(Y,Z). li = {rodíc(a,b),rodíc(b,c),predek(a,b),predek(b,c),predek(a,c li = {rodíc(a,b),rodíc(b,c), predek(a, b), predek(b, c), predek(a, c), predek(a, a)} li i ^2 jsou Herbrandovy modely klauzulí Hana Rudová, Logické programování I, 20. května 2009 1 55 Deklarativní a operační sémantika M Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelů S, pak průnik těchto modelů je opět Herbranduv model množiny S. M Důsledek: Existuje nejmenší Herbranduv model množiny S, který značíme M(S). Hana Rudová, Logické programování I, 20. května 2009 1 56 Sémantiky Deklarativní a operační sémantika M Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelů S, pak průnik těchto modelů je opět Herbranduv model množiny S. M Důsledek: Existuje nejmenší Herbranduv model množiny S, který značíme M(S). -• Deklarativní sémantikou logického programu P rozumíme jeho minimální Herbranduv model M(P). Hana Rudová, Logické programování I, 20. května 2009 1 56 Sémantiky Deklarativní a operační sémantika M Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelů S, pak průnik těchto modelů je opět Herbranduv model množiny S. M Důsledek: Existuje nejmenší Herbranduv model množiny S, který značíme M(S). -• Deklarativní sémantikou logického programu P rozumíme jeho minimální Herbranduv model M(P). -• Operační sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez proměnných, které lze pro nějaký cíl Ql odvodit nějakým rezolučním důkazem ze vstupní množiny P u {Q}. Hímto výrazem jsou míněny všechny cíle, pro něž zmíněný rezoluční důkaz existuje. Hana Rudová, Logické programování I, 20. května 2009 1 56 Sémantiky Deklarativní a operační sémantika M Je-li S množina programových klauzulí a M libovolná množina Herbrandových modelů S, pak průnik těchto modelů je opět Herbranduv model množiny S. M Důsledek: Existuje nejmenší Herbranduv model množiny S, který značíme M(S). -• Deklarativní sémantikou logického programu P rozumíme jeho minimální Herbranduv model M(P). -• Operační sémantikou logického programu P rozumíme množinu O(P) všech atomických formulí bez proměnných, které lze pro nějaký cíl Ql odvodit nějakým rezolučním důkazem ze vstupní množiny P u {Q}. Hímto výrazem jsou míněny všechny cíle, pro něž zmíněný rezoluční důkaz existuje. -• Pro libovolný logický program P platí M(P) = O(P) Hana Rudová, Logické programování I, 20. května 2009 1 56 Sémantiky Negace v logickém programování Negativní znalost -• logické programy vyjadřují pozitivní znalost M negativní literály: pozice určena definicí Hornových klauzulí => nelze vyvodit negativní informaci z logického programu -• každý predikát definuje úplnou relaci 3 negativní literal není logickým důsledkem programu Hana Rudová, Logické programování I, 20. května 2009 158 Negace v logickém programování Negativní znalost -• logické programy vyjadřují pozitivní znalost M negativní literály: pozice určena definicí Hornových klauzulí => nelze vyvodit negativní informaci z logického programu -• každý predikát definuje úplnou relaci 3 negativní literal není logickým důsledkem programu -• relace vyjádřeny explicitně v nejmenším Herbrandově modelu 3 nad(X,Y) : -na(X,Y). na(c,b). nad(X, Y) : -na(X, Z),nad(Z, Y). na(b, a). 3 nejmenší Herbranduv model: {na(b,a),na(c, b),nad(b,a),nad(c, b),nad(c,a)} Hana Rudová, Logické programování I, 20. května 2009 1 58 Negace v logickém programování Negativní znalost -• logické programy vyjadřují pozitivní znalost M negativní literály: pozice určena definicí Hornových klauzulí => nelze vyvodit negativní informaci z logického programu -• každý predikát definuje úplnou relaci 3 negativní literal není logickým důsledkem programu -• relace vyjádřeny explicitně v nejmenším Herbrandově modelu 3 nad(X,Y) : -na(X,Y). na(c,b). nad(X, Y) : -na(X, Z),nad(Z, Y). na(b, a). 3 nejmenší Herbranduv model: {na(b,a),na(c, b),nad(b,a),nad(c, b),nad(c,a)} «• ani program ani model nezahrnují negativní informaci -• a není nad c, a není na c 3 i v realitě je negativní informace vyjádřena explicitně zřídka, např. jízdní řád Hana Rudová, Logické programování I, 20. května 2009 1 58 Negace v logickém programování Předpoklad uzavřeného světa -• neexistence informace chápána jako opak: předpoklad uzavřeného světa (dosed world assumption, CWA) -• převzato z databází -• určitý vztah platí pouze když je vyvoditelný z programu. P \£ A & „odvozovací pravidlo" (A je (uzavřený) term):------— (CWA) Hana Rudová, Logické programování I, 20. května 2009 1 59 Negace v logickém programování Předpoklad uzavřeného světa -• neexistence informace chápána jako opak: předpoklad uzavřeného světa (dosed world assumption, CWA) -• převzato z databází -• určitý vztah platí pouze když je vyvoditelný z programu. P \£ A & „odvozovací pravidlo" (A je (uzavřený) term):-----— (CWA) ->A -• pro SLD-rezoluci: P \£ nad(a,c), tedy lze podle CWA odvodit ^nad(a,c) Hana Rudová, Logické programování I, 20. května 2009 1 59 Negace v logickém programování Předpoklad uzavřeného světa -• neexistence informace chápána jako opak: předpoklad uzavřeného světa (dosed world assumption, CWA) -• převzato z databází -• určitý vztah platí pouze když je vyvoditelný z programu. P \£ A & „odvozovací pravidlo" (A je (uzavřený) term):-----— (CWA) ->A -• pro SLD-rezoluci: P \£ nad(a,c), tedy lze podle CWA odvodit ^nad(a,c) M problém: není rozhodnutelné, zda daná atomická formule je logickým důsledkem daného logického programu. M nelze tedy určit, zda pravidlo CWA je aplikovatelné nebo ne M CWA v logickém programování obecně nepoužitelná. Hana Rudová, Logické programování I, 20. května 2009 1 59 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ě (konečně) neúspěšný SLD-strom -A normální cíl: cíl obsahující i negativní literály -• :-nad(c,a), ^nad(b,c). (negation as failure, NF) Hana Rudová, Logické programování I, 20. května 2009 160 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ě (konečně) neúspěšný SLD-strom , . . .. -------------------------------------------------------------------------- (negation as failure, NF) normální cíl: cíl obsahující i negativní literály -• :-nad(c,a),->nad(b,c). rozdíl mezi CWA a NF -• program nad(X,Y) : -nad(X,Y), cíl : -^nad(b,c) M neexistuje odvození cíle podle NF, protože SLD-strom : -nad(b,c) je nekonečný -• existuje odvození cíle podle CWA, protože neexistuje vyvrácení: -nad(b,c) Hana Rudová, Logické programování I, 20. května 2009 160 Negace v logickém programování Negace jako neúspěch (negation as failure) M slabší verze CWA: definitivně neúspěšný (finitely f ailed) SLD-strom cíle : -A : -A má definitivně (konečně) neúspěšný SLD-strom , . . .. -------------------------------------------------------------------------- (negation as failure, NF) -• normální cíl: cíl obsahující i negativní literály -• : -nad(c,a), ->nad(b,c). M rozdíl mezi CWA a NF -• program nad(X,Y) : -nad(X,Y), cíl : -^nad(b,c) M neexistuje odvození cíle podle NF, protože SLD-strom : -nad(b,c) je nekonečný -• existuje odvození cíle podle CWA, protože neexistuje vyvrácení: -nad(b,c) M CWA i NF jsou nekorektní: A není logickým důsledkem programu P M řešení: definovat programy tak, aby jejich důsledkem byly i negativní literály zúplnění logického programu Hana Rudová, Logické programování I, 20. května 2009 160 Negace v logickém programování Podstata zúplnění logického programu -• převod všech if příkazů v logickém programu na iff 3 nad(X,Y) : -na(X,Y). nad(X,Y) : -na(X,Z),nad(Z,Y). 3 lze psát jako: nad(X,Y) : -(na(X,Y)) v (na(X,Z),nad(Z,Y)). M zúplnění: nad(X,Y) ++ (na(X,Y)) v (na(X,Z),nad(Z,Y)). Hana Rudová, Logické programování I, 20. května 2009 1 61 Negace v logickém programování Podstata zúplnění logického programu -• převod všech if příkazů v logickém programu na iff 3 nad(X,Y) : -na(X,Y). nad(X,Y) : -na(X,Z),nad(Z,Y). 3 lze psát jako: nad(X,Y) : -(na(X,Y)) v (na(X,Z),nad(Z,Y)). M zúplnění: nad(X,Y) ++ (na(X,Y)) v (na(X,Z),nad(Z,Y)). M X je nad Y právě tehdy, když alespoň jedna z podmínek platí M tedy pokud žádná z podmínek neplatí, X není nad Y Hana Rudová, Logické programování I, 20. května 2009 1 61 Negace v logickém programování Podstata zúplnění logického programu -• převod všech if příkazů v logickém programu na iff 3 nad(X,Y) : -na(X,Y). nad(X,Y) : -na(X,Z),nad(Z,Y). 3 lze psát jako: nad(X,Y) : -(na(X,Y)) v (na(X,Z),nad(Z,Y)). M zúplnění: nad(X,Y) ++ (na(X,Y)) v (na(X,Z),nad(Z,Y)). M X je nad Y právě tehdy, když alespoň jedna z podmínek platí M tedy pokud žádná z podmínek neplatí, X není nad Y M kombinace klauzulí je možná pouze pokud mají identické hlavy M na(c,b). na(b,a). M lze psát jako: na(Xi,X2) : -X\ = c,X2 = b. na(Xi,X2) : -X\ = b,X2 = a. S zúplnění: na(Xi,X2) ^ (X\ = c,X2 = b) v (X\ = b,X2 = a). Hana Rudová, Logické programování I, 20. května 2009 161 Negace v logickém programování Zúplnění programu -• Zúplnění programu P je: comp(P) := IFF(P) u CET -• Základní vlastnosti: M comp (P) i= P -• do programuje přidána pouze negativní informace Hana Rudová, Logické programování I, 20. května 2009 1 62 Negace v logickém programování Zúplnění programu -• Zúplnění programu P je: comp(P) := IFF(P) u CET -• Základní vlastnosti: M comp (P) i= P -• do programuje přidána pouze negativní informace M IFF(P): spojka : - v IF(P) je nahrazena spojkou <- M IF(P): množina všech formulí IF(g,P) pro všechny predikátové symboly q v programu P M Cíl: definovat IF(g,P) M def(p/n) predikátu p/n je množina všech klauzulí predikátu p/n Hana Rudová, Logické programování I, 20. května 2009 162 Negace v logickém programování ma, p) na(Xi,X2) : -3Y(X1 = 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. X\,... ,Xn jsou „nové" proměnné, které se nevyskytují nikde v P Nechť C je klauzule ve tvaru q{ti,... ,tn) . —Li,...,Lm kde m > 0, ti,..., tn jsou termy a Li,... ,Lm jsou literály. Pak označme E(C) výraz 3Y\,..., Yk(X\ = ti,...,Xn = tn,Li,... ,Lm) kde Yi,...,Y]c jsou všechny proměnné v C. Hana Rudová, Logické programování I, 20. května 2009 163 Negace v logickém programování ma, p) na(Xi,X2) : -3Y(X1 = 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. M X\,... ,Xn jsou „nové" proměnné, které se nevyskytují nikde v P M Nechť C je klauzule ve tvaru q{ti,... ,tn) . —Li,...,Lm kde m > 0, ti,..., tn jsou termy a Li,... ,Lm jsou literály. Pak označme E(C) výraz 3Y\,..., Yk(X\ = ti,...,Xn = tn,Li,... ,Lm) kde Yi,...,Y]c jsou všechny proměnné v C. M Nechť def(q/n) = {Ci,..., Q}. Pak formuli l¥(q,P) získáme následujícím postupem: q(Xi, ...,Xn): -HCi) v E(C2) v ■ ■ ■ v E(Cj) pro j > 0 a í|(Xi, ... ,Xn) : - D pro j = 0 [g/n není v programu P] Hana Rudová, Logické programování I, 20. května 2009 163 Negace v logickém programování Čiarková Teorie Rovnosti (CET) všechny formule jsou univerzálně kvantifikovány: ].X = X 2.X =Y - y = X 3.X =Y AY = Z ^ X = Z 4. pro každý f/m: Xľ = Yľ a ■ ■ ■ a Xm = Ym - f(Xu ... ,Xm) = f(Yu...,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 Im a gin, {m,n > 0): f(Xi,... ,Xm) =/= g(Yi,..., Yn) 7. pro každý f/m: f(Xl,...,Xm) = f(Yl,..., Ym) - Xľ = Yľ a ■ ■ ■ AXm = Ym 8. pro každý term t obsahující X jako vlastní podterm: t =/= X X 41 Y je zkrácený zápis ->(X = Y) Hana Rudová, Logické programování I, 20. května 2009 1 64 Negace v logickém programování Korektnost a úplnost NF pravidla «• Korektnost NF pravidla: Nechť P logický program a : -A cíl. Jestliže : -A má definitivně neúspěšný SLD-strom, pak V(->A) je logickým důsledkem comp(P) (nebo-li comp(P) i= V(->A)) Hana Rudová, Logické programování I, 20. května 2009 165 Negace v logickém programování Korektnost a úplnost NF pravidla «• Korektnost NF pravidla: Nechť P logický program a : -A cíl. Jestliže : -A má definitivně neúspěšný SLD-strom, pak V(->A) je logickým důsledkem comp(P) (nebo-li comp(P) i= V(->A)) M Úplnost NF pravidla: Nechť P je logický program. Jestliže comp(P) i= V(->A), pak existuje definitivně neúspěšný SLD-strom : -A. * zůstává problém: není rozhodnutelné, zda daná atomická formule je logickým důsledkem daného logického programu. M teorém mluví pouze o existenci definitivně neúspěšného SLD-stromu M definitivně (konečně) neúspěšný SLD-strom sice existuje, ale nemusíme ho nalézt ± např. v Prologu: může existovat konečné odvození, ale program přesto cyklí (Prolog nenajde definitivně neúspěšný strom) Hana Rudová, Logické programování I, 20. května 2009 1 65 Negace v logickém programování Korektnost a úplnost NF pravidla «• Korektnost NF pravidla: Nechť P logický program a : -A cíl. Jestliže : -A má definitivně neúspěšný SLD-strom, pak V(->A) je logickým důsledkem comp(P) (nebo-li comp(P) i= V(->A)) M Úplnost NF pravidla: Nechť P je logický program. Jestliže comp(P) i= V(->A), pak existuje definitivně neúspěšný SLD-strom : -A. * zůstává problém: není rozhodnutelné, zda daná atomická formule je logickým důsledkem daného logického programu. M teorém mluví pouze o existenci definitivně neúspěšného SLD-stromu M definitivně (konečně) neúspěšný SLD-strom sice existuje, ale nemusíme ho nalézt ± např. v Prologu: může existovat konečné odvození, ale program přesto cyklí (Prolog nenajde definitivně neúspěšný strom) -• Odvození pomocí NF pouze test, nelze konstruovat výslednou substituci -• v(comp(P) i= V(-A)) je A všeob. kvantifikováno, v V(-A) nejsou volné proměnné Hana Rudová, Logické programování I, 20. května 2009 1 65 Negace v logickém programování Normální a stratifikované programy -• normální program: obsahuje negativní literaly v pravidlech -• problém: existence zúplnění, která nemají žádný model M p : -->p. zúplnění: p ++ ~^p M rozdělení programu na vrstvy M vynucují použití negace relace pouze tehdy pokud je relace úplně definovaná Hana Rudová, Logické programování I, 20. května 2009 1 66 Negace v logickém programování Normální a stratifikované programy -• normální program: obsahuje negativní literaly v pravidlech -• problém: existence zúplnění, která nemají žádný model M p : -->p. zúplnění: p ++ ~^p M rozdělení programu na vrstvy M vynucují použití negace relace pouze tehdy pokud je relace úplně definovaná M a. a. a:-^b,a. a:-^b,a. b. b : -->a. Hana Rudová, Logické programování I, 20. května 2009 1 66 Negace v logickém programování Normální a stratifikované programy -• normální program: obsahuje negativní literaly v pravidlech -• problém: existence zúplnění, která nemají žádný model M p : -->p. zúplnění: p ++ ~^p M rozdělení programu na vrstvy M vynucují použití negace relace pouze tehdy pokud je relace úplně definovaná M a. a. a:-^b,a. a:-^b,a. b. b : -->a. stratifikovaný není stratifikovaný Hana Rudová, Logické programování I, 20. května 2009 1 66 Negace v logickém programování Normální a stratifikované programy -• normální program: obsahuje negativní literaly v pravidlech -• problém: existence zúplnění, která nemají žádný model M p : -->p. zúplnění: p ++ ~^p M rozdělení programu na vrstvy M vynucují použití negace relace pouze tehdy pokud je relace úplně definovaná M 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 symbolů programu lze rozdělit do disjunktních množin So,...,Sm (Si = stratum) M p(...):-..., q(...),... e P, p e Sk => q £ So u ...u Sk M p(. ..):-■■■, ~^q{...),...eP,p e Sk ^qE So u...u Sk-i Hana Rudová, Logické programování I, 20. května 2009 166 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 symbolů z P M Věta: Zúplnění každého stratifikovaného programu má Herbrandův model. 3 p : --ip. nemá Herbrandův model M p : --ip. ale není stratifikovaný Hana Rudová, Logické programování I, 20. května 2009 167 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 symbolů z P M Věta: Zúplnění každého stratifikovaného programu má Herbrandův model. 3 p : --ip. nemá Herbrandův model M p : --ip. ale není stratifi kovaný «• stratifikované programy nemusí mít jedinečný minimální Herbrandův model 3 cyklí: -^zastaví. M dva minimální Herbrandovy modely: {cyklí}, {zastaví} M důsledek toho, že cyklí: -^zastaví, je ekvivalentní cyklí v zastaví Hana Rudová, Logické programování I, 20. května 2009 1 67 Negace v logickém programování SLDNF rezoluce: úspěšné odvození _# NF pravidlo: :-C. má konečně neúspěšný SLD-strom -• Pokud máme negativní podcíl ->C v dotazu G, pak hledáme důkaz pro C M Pokud odvození C selže (strom pro C je konečně neúspěšný), pak je odvození G (i ->C) celkově úspěšné nahore(X) : - ^blokov any (X). blokovany(X) : -ria(Y,X). na(a,Z?). Hana Rudová, Logické programování I, 20. května 2009 1 68 Negace v logickém programování SLDNF rezoluce: úspěšné odvození NF pravidlo: - C. má konečně neúspěšný SLD-strom -• Pokud máme negativní podcíl ->C v dotazu G, pak hledáme důkaz pro C M Pokud odvození C selže (strom pro C je konečně neúspěšný), pak je odvození G (i ->C) celkově úspěšné nahore(X) : - ^blokov any (X). blokovany(X) : -ria(Y,X). na(a,Z?). : -nahore(c) yes :— nahore(c). :——i blokovaný(c). Hana Rudová, Logické programování I, 20. května 2009 :- blokovaný(c). '— na(Y,c). FAIL 168 úspěšné odvození Negace v logickém programování SLDNF rezoluce: neúspěšné odvození 3 NF pravidlo: :-C. má konečně neúspěšný SLD-strom -• 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) celkově neúspěšné nahore(X) : - ^blokov any (X). blokovany(X) : -na(Y,X). na(_,_). Hana Rudová, Logické programování I, 20. května 2009 1 69 Negace v logickém programování SLDNF rezoluce: neúspěšné odvození 3 NF pravidlo: :-C. má konečně neúspěšný SLD-strom -• 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) celkově neúspěšné nahore(X) : - ^blokov any (X). blokovany(X) : -na(Y,X). na(_,_). : -nahore(X). no :- nahore(X). :- blokovaný(X). : - -i blokovaný(X). : - na(Y,X). ^ neúspěšné odvození Hana Rudová, Logické programování I, 20. května 2009 169 Negace v logickém programování SLDNF rezoluce: uvázlé odvození B NF pravidlo: :-C. má konečně neúspěšný SLD-strom -• 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 konečně úspěšný), pak je odvození G (i ->C) uvázlé nahore(X) : - ^blokov any (X). blokovany(X) : -na(Y,X). na(a,b). Hana Rudová, Logické programování I, 20. května 2009 1 70 Negace v logickém programování SLDNF rezoluce: uvázlé odvození B NF pravidlo: :-C. má konečně neúspěšný SLD-strom -• 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 konečně úspěšný), pak je odvození G (i ->C) uvázlé nahore(X) : - ^blokov any (X). blokovany(X) : -na(Y,X). na(a,b). : -nahore(X). :- nahore(X). :- blokovaný(X). : - -i blokovaný(X). : - na(Y,X). [Y/a,X/b] D «/M Hana Rudová, Logické programování I, 20. května 2009 1 70 => uvázlé odvození Negace v logickém programování SLD+ odvození -• P je normální program, Go normální cíl, R selekční pravidlo: SLD+-odvození Go je buď konečná posloupnost (Go; Co),..., (Gi-i; Q_i), Gí nebo nekonečná posloupnost (Go; Co), (Gi, Ci), (G2; C2),... kde v každém kroku m + l(m > 0), R vybírá pozitivní literal v Gm a dospívá k Gm+i obvyklým způsobem. Hana Rudová, Logické programování I, 20. května 2009 1 71 Negace v logickém programování SLD+ odvození -• P je normální program, Go normální cíl, R selekční pravidlo: SLD+-odvození Go je buď konečná posloupnost (Go; Co),..., (Gi-i; Q_i), Gí nebo nekonečná posloupnost (Go; Co), (Gi, Ci), (G2; C2),... kde v každém kroku m + l(m > 0), R vybírá pozitivní literal v Gm a dospívá k Gm+i obvyklým způsobem. -• konečné SLD+-odvození může být: 1. úspěšné: Gt = D 2. neúspěšné 3. blokované: Gí je negativní (např. ->A) Hana Rudová, Logické programování I, 20. května 2009 171 Negace v logickém programování SLDNF rezoluce: pojmy -• Úroveň cíle M P normální program, Go normální cíl, R selekční pravidlo: úroveň cíle Go se rovná ± 0 <^> žádné SLD+-odvození s pravidlem R není blokováno * k + 1 <^> maximální úroveň cílů : -A, které ve tvaru ->A blokují SLD+-odvození Go, je k 3 nekonečná úroveň cíle: blokované SLDNF odvození Hana Rudová, Logické programování I, 20. května 2009 1 72 Negace v logickém programování SLDNF rezoluce: pojmy -• Úroveň cíle M P normální program, Go normální cíl, R selekční pravidlo: úroveň cíle Go se rovná ± 0 <^> žádné SLD+-odvození s pravidlem R není blokováno * k + 1 <^> maximální úroveň cílů : -A, které ve tvaru ->A blokují SLD+-odvození Go, je k 3 nekonečná úroveň cíle: blokované SLDNF odvození -• Množina SLDNF odvození = {(SLDNF odvození G0) u (SLDNF odvození: -A)} 3 při odvozování Go jsme se dostali k cíli ->A -• SLDNF odvození cíle G ? Hana Rudová, Logické programování I, 20. května 2009 1 72 Negace v logickém programování SLDNF rezoluce P normální program, Go normální cíl, R selekční pravidlo: množina SLDNF odvození a podmnožina neúspěšných SLDNF odvození cíle Go jsou takové nejmenší množiny, že: -• každé SLD+-odvození Go je SLDNF odvození Go M je-li SLD+-odvození (Go; Co),..., Gi blokováno na ->A 3 tj. Gi je tvaru : - Li,... , Lm_i, ->A,Lm+i,... , Ln pak Hana Rudová, Logické programování I, 20. května 2009 1 73 Negace v logickém programování SLDNF rezoluce P normální program, Go normální cíl, R selekční pravidlo: množina SLDNF odvození a podmnožina neúspěšných SLDNF odvození cíle Go jsou takové nejmenší množiny, že: -• každé SLD+-odvození Go je SLDNF odvození Go M je-li SLD+-odvození (Go; Co),..., Gi blokováno na ->A 3 tj. Gi je tvaru : - Li,..., Lm_i, ->A,Lm+i,... ,Ln pak 3 existuje-li SLDNF odvození: -A (pod R) s prázdnou cílovou substitucí, pak (Go; Co),..., Gi je neúspěšné SLDNF odvození Hana Rudová, Logické programování I, 20. května 2009 1 73 Negace v logickém programování SLDNF rezoluce P normální program, Go normální cíl, R selekční pravidlo: množina SLDNF odvození a podmnožina neúspěšných SLDNF odvození cíle Go jsou takové nejmenší množiny, že: -• každé SLD+-odvození Go je SLDNF odvození Go M je-li SLD+-odvození (Go; Co),..., Gi blokováno na ->A 3 tj. Gi je tvaru : - Li,..., Lm_i, ->A,Lm+i,... ,Ln pak 3 existuje-li SLDNF odvození: -A (pod R) s prázdnou cílovou substitucí, pak (Go; Co),..., Gi je neúspěšné SLDNF odvození 3 je-li každé úplné SLDNF odvození: -A (pod R) neúspěšné pak \Go; Co), ■ ■ ■ , \Gí, €),('. — Li, ... , Lm_i, Lm+i,. .., Ln) je (úspěšné) SLDNF odvození cíle Go ±> e označuje prázdnou cílovou substituci Hana Rudová, Logické programování I, 20. května 2009 173 Negace v logickém programování Typy SLDNF odvození Konečné SLDNF-odvození může být: 1. úspěšné: Gi = D 2. neúspěšné 3. uvázlé (flounder): Gi je negativní (->A) a : -A je úspěšné s neprázdnou cílovou substitucí 4. blokované: Gi je negativní (->A) a : -A nemá konečnou úroveň. Hana Rudová, Logické programování I, 20. května 2009 1 74 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 0 cílová substituce SLDNF-odvození cíle : -G, pak GO je logickým důsledkem comp(P) Hana Rudová, Logické programování I, 20. května 2009 1 75 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 0 cílová substituce SLDNF-odvození cíle : -G, pak GO je logickým důsledkem comp(P) M implementace SLDNF v Prologu není korektní -• Prolog neřeší uvázlé SLDNF-odvození (neprázdná substituce) M použití bezpečných cílů (negace neobsahuje proměnné) Hana Rudová, Logické programování I, 20. května 2009 1 75 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 0 cílová substituce SLDNF-odvození cíle : -G, pak GO je logickým důsledkem comp(P) M implementace SLDNF v Prologu není korektní -• Prolog neřeší uvázlé SLDNF-odvození (neprázdná substituce) M použití bezpečných cílů (negace neobsahuje proměnné) -• úplnost SLDNF-odvození: SLDNF-odvození není úplné -• pokud existuje konečný neúspěšný strom : -A, pak ^A platí ale místo toho se odvozování: -A může zacyklit, tj. SLDNF rezoluce ^A neodvodí => ^A tedy sice platí, ale SLDNF rezoluce ho nedokáže odvodit Hana Rudová, Logické programování I, 20. května 2009 175 Negace v logickém programování Logické programování s omezujícími podmínkami Constraint Logic Programming: CLP CP: elektronické materiály M Dechter, R. Constraint Processing. Morgan Kaufmann Publishers, 2003. 3 http://www.ics.uci.edu/~dechter/books/ -• Barták R. Přednáška Omezující podmínky na MFF UK, Praha. -• http://kti.ms.mff.cuni.cz/~bartak/podminky/prednaska.html M SICStus Prolog User's Manual, 2004. Kapitola o CLP(FD). -• http://www.fi.muni.cz/~hanka/sicstus/doc/html/ -• Příklady v distribuci SICStus Prologu: cca 25 příkladů, zdrojový kód M ai sa:/software/si cstus-3.10.1/1 i b/si cstus-3.10.1/1 i brary/clpfd/examples/ M Constraint Programming Online M http://si ash.math.uni pd.i t/cp/i ndex.php Hana Rudová, Logické programování I, 20. května 2009 1 77 Logické programování s omezujícími podmínkami Probírané oblasti -• Obsah * úvod: od LP k CLP M základy programování M základní algoritmy pro řešení problémů s omezujícími podmínkami Hana Rudová, Logické programování I, 20. května 2009 1 78 Logické programování s omezujícími podmínkami Probírané oblasti -• Obsah * úvod: od LP k CLP M základy programování M základní algoritmy pro řešení problémů s omezujícími podmínkami -• Příbuzné přednášky na Fl M PA163 Programování s omezujícími podmínkami ± http://www.fi.muni.cz/~hanka/cp M PA1 67 Rozvrhování -i* http://www.fi .muni . cz/~hanka/rozvrhovani ± zahrnuty CP techniky pro řešení rozvrhovacích problémů Hana Rudová, Logické programování I, 20. května 2009 1 78 Logické programování s omezujícími podmínkami Historie a současnost -• 1963 interaktivní grafika (Sutherland: Sketchpad) 3 Polovina 80. let: logické programování omezujícími podmínkami M Od 1990: komerční využití -• Už v roce 1996: výnos řádově stovky milionů dolarů -• Aplikace - příklady -• Lufthansa: krátkodobé personální plánování «£< reakce na změny při dopravě (zpoždění letadla, ...) «i* minimalizace změny v rozvrhu, minimalizace ceny 3 Nokia: automatická konfigurace sw pro mobilní telefony 3 Renault: krátkodobé plánování výroby, funkční od roku 1995 Hana Rudová, Logické programování I, 20. května 2009 1 79 Logické programování s omezujícími podmínkami Omezení (constraint) -• Dána M množina (doménových) proměnných Y = {yi,... ,3/jJ 3 konečná množina hodnot (doména) D = {D\,... ,Dfc} Omezení c na Y je podmnožina D\ x ... x Dk M omezuje hodnoty, kterých mohou proměnné nabývat současně Hana Rudová, Logické programování I, 20. května 2009 180 Logické programování s omezujícími podmínkami Omezení (constraint) -• Dána M množina (doménových) proměnných Y = {yi,... ,3/jJ 3 konečná množina hodnot (doména) D = {D\,... ,Dfc} Omezení c na Y je podmnožina D\ x ... x Dk M omezuje hodnoty, kterých mohou proměnné nabývat současně -• Příklad: -• proměnné: A,B M domény: {0,1} pro A {1,2} pro B .•omezení: A^B nebo (A,B) g {(0,1),(0,2),(1,2)} Hana Rudová, Logické programování I, 20. května 2009 180 Logické programování s omezujícími podmínkami Omezení (constraint) -• Dána M množina (doménových) proměnných Y = {yi,... ,yk) 3 konečná množina hodnot (doména) D = {D\,... ,Dk\ Omezení c na Y je podmnožina D\ x ... x Dk M omezuje hodnoty, kterých mohou proměnné nabývat současně -• Příklad: -• proměnné: A,B M 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 splněno, pokud pro d\ e D\, ...dk e Dk platí (d\,... dk) e c Hana Rudová, Logické programování I, 20. května 2009 180 Logické programování s omezujícími podmínkami Omezení (constraint) -• Dána M množina (doménových) proměnných Y = {yi,... ,yk) 3 konečná množina hodnot (doména) D = {D\,... ,Dk\ Omezení c na Y je podmnožina D\ x ... x Dk M omezuje hodnoty, kterých mohou proměnné nabývat současně -• Příklad: -• proměnné: A,B M 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 splněno, pokud pro d\ e D\, ...dk e Dk platí (d\,... dk) e c M příklad (pokračování): omezení splněno pro (0,1), (0, 2), (1,2), není splněno pro (1,1) Hana Rudová, Logické programování I, 20. května 2009 180 Logické programování s omezujícími podmínkami Problém splňování podmínek (CSP) -• Dána M konečná množina proměnných X = {xi,... ,xn} M konečná množina hodnot (doména) D = {Di,... ,Dn} «• konečná množina omezení C = {ci,..., cm} ± omezení je definováno na podmnožině X Problém splňování podmínek je trojice (X,D,C) (constraint satisfaction problem) Hana Rudová, Logické programování I, 20. května 2009 181 Logické programování s omezujícími podmínkami Problém splňování podmínek (CSP) -• Dána M konečná množina proměnných X = {xi,... ,xn} M konečná množina hodnot (doména) D = {Di,... ,Dn} «• konečná množina omezení C = {ci,..., 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: M proměnné: A,B,C .•domény: {0,1} pro A {1,2} pro B {0,2} pro C M omezení: A^B, B^C Hana Rudová, Logické programování I, 20. května 2009 181 Logické programování s omezujícími podmínkami Řešení CSP -• Částečné ohodnocení proměnných (du..., du), k < n M některé proměnné mají přiřazenu hodnotu M Úplné ohodnocení proměnných (du ..., dn) M všechny proměnné mají přiřazenu hodnotu Hana Rudová, Logické programování I, 20. května 2009 182 Logické programování s omezujícími podmínkami Řešení CSP -• Částečné ohodnocení proměnných (du..., du), k < n M některé proměnné mají přiřazenu hodnotu M Úplné ohodnocení proměnných (du ..., dn) M všechny proměnné mají přiřazenu hodnotu M Řešení CSP M úplné ohodnocení proměnných, které splňuje všechna omezení -• (du ■ ■ ■, dn) g Di x ... x Dn je řešení (X, D, C) * pro každé d e C na Xix,...Xik platí (di^.-.d^) e c* Hana Rudová, Logické programování I, 20. května 2009 182 Logické programování s omezujícími podmínkami Řešení CSP -• Částečné ohodnocení proměnných (du..., du), k < n M některé proměnné mají přiřazenu hodnotu M Úplné ohodnocení proměnných (du ..., dn) M všechny proměnné mají přiřazenu hodnotu M Řešení CSP M úplné ohodnocení proměnných, které splňuje všechna omezení -• (du ■ ■ ■, dn) g Di x ... x Dn je řešení (X, D, C) * pro každé d e C na Xix,...Xik platí (di^.-.d^) e c* -• Hledáme: jedno nebo všechna řešení nebo optimální řešení (vzhledem k objektivní funkci) Hana Rudová, Logické programování I, 20. května 2009 182 Logické programování s omezujícími podmínkami Příklad: jednoducl M proměnné: Jan, Petr, ... M domény: {3,4, 5,6}, {3,4},... M omezení: al l_di sti net([Jan, Petr, . Hana Rudová, Logické programování I, 20. května 2009 1 83 hý školní rozvrh ]) učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 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í: al l_di sti net([Jan, Petr, . . . ]) částečné ohodnocení: Jan=6, Anna=5, Marie=l úplné ohodnocení: Jan=6, Petr=3, Anna=5, 0ta=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, 20. května 2009 183 Logické programování s omezujícími podmínkami Příklad: jednoduchý školní rozvrh M proměnné: Jan, Petr, ... M domény: {3,4, 5,6}, {3,4},... -• omezení: al l_di sti net([Jan, Petr, . . . ]) «• částečné ohodnocení: Jan=6, Anna=5, Marie=l M úplné ohodnocení: Jan=6, Petr=3, Anna=5, 0ta=2, Eva=4, Marie=6 M řešení CSP: Jan=6, Petr=3, Anna=5, 0ta=2, Eva=4, Marie=l -• všechna řešení: ještě Jan=6, Petr=4, Anna=5, 0ta=2, Eva-3, Marie=l Hana Rudová, Logické programování I, 20. května 2009 183 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 Příklad: jednoduchý školní rozvrh M proměnné: Jan, Petr, ... M domény: {3,4, 5,6}, {3,4},... -• omezení: al l_di sti net([Jan, Petr, . . . ]) «• částečné ohodnocení: Jan=6, Anna=5, Marie=l M úplné ohodnocení: Jan=6, Petr=3, Anna=5, 0ta=2, Eva=4, Marie=6 M řešení CSP: Jan=6, Petr=3, Anna=5, 0ta=2, Eva=4, Marie=l -• všechna řešení: ještě Jan=6, Petr=4, Anna=5, 0ta=2, Eva-3, Marie=l -• optimalizace: ženy učí co nejdříve Hana Rudová, Logické programování I, 20. května 2009 183 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 Příklad: jednoduchý školní rozvrh M proměnné: Jan, Petr, ... M domény: {3,4, 5,6}, {3,4},... -• omezení: al l_di sti net([Jan, Petr, . . . ]) «• částečné ohodnocení: Jan=6, Anna=5, Marie=l M úplné ohodnocení: Jan=6, Petr=3, Anna=5, 0ta=2, Eva=4, Marie=6 M řešení CSP: Jan=6, Petr=3, Anna=5, 0ta=2, Eva=4, Marie=l -• všechna řešení: ještě Jan=6, Petr=4, Anna=5, 0ta=2, Eva-3, Marie=l -• optimalizace: ženy učí co nejdříve Anna+Eva+Marie #= Cena minimalizace hodnoty proměnné Cena optimální řešení: Jan=6, Petr=4, Anna=5, 0ta=2, Eva=3, Marie=l Hana Rudová, Logické programování I, 20. května 2009 183 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í řešení Hana Rudová, Logické programování I, 20. května 2009 184 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í řešení -• (1) a (2) deklarativní část 3 modelování problému M vyjádření problému splňování podmínek Hana Rudová, Logické programování I, 20. května 2009 184 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í řešení -• (1) a (2) deklarativní část 3 modelování problému M vyjádření problému splňování podmínek -• (3) řídící část •• prohledávání stavového prostoru řešení 3 procedura pro hledání řešení (enumeraci) se nazývá labeling 3 umožní nalézt jedno, všechna nebo optimální řešení Hana Rudová, Logické programování I, 20. května 2009 184 Logické programování s omezujícími podmínkami Kód CLP(FD) programu % základní struktura CLP programu sol ve( Variables ) :- declare_variables( Variables ), domain ([Jan] ,3,6], Hana Rudová, Logické programování I, 20. května 2009 185 Logické programování s omezujícími podmínkami Kód CLP(FD) programu % základní struktura CLP programu sol ve( Variables ) :- declare_variables( Variables ), domain ([Jan] ,3,6], ... post_constraints( Variables ), all_distinct([Jan,Petr,...]) Hana Rudová, Logické programování I, 20. května 2009 185 Logické programování s omezujícími podmínkami Kód CLP(FD) programu % základní struktura CLP programu sol ve( Variables ) :- declare_variables( Variables ), domain ([Jan] ,3,6], ... post_constraints( Variables ), all_distinct([Jan,Petr,...]) labelingC Variables ). Hana Rudová, Logické programování I, 20. května 2009 185 Logické programování s omezujícími podmínkami Kód CLP(FD) % základní struktura CLP programu sol ve( Variables ) :- declare_variables( Variables ) post_constraints( Variables ), labelingC Variables ). % triviální labeling labelingC [] ). labelingC [Var|Rest] ) :- fd_minCVar,Min), C Var#=Min, labelingC Rest ) Hana Rudová, Logické programování I, 20. května 2009 1 85 programu domain([Jan],3,6], ... all _ch'sti net ([Jan, Petr, . . .]) % výběr nejmenší hodnoty z domény Logické programování s omezujícími podmínkami Kód CLP(FD) programu % základní struktura CLP programu sol ve( Variables ) :- declare_variables( Variables ), post_constraints( Variables ), labelingC Variables ). % triviální labeling labelingC [] ). labelingC [Var|Rest] ) :- fd_minCVar,Min) , % výběr nejmenší hodnoty z domény C Var#=Min, labelingC Rest ) ■ Var#>Min , labelingC [Var|Rest] ) ). Hana Rudová, Logické programování I, 20. května 2009 185 Logické programování s omezujícími podmínkami domain([Jan],3,6], ... all _ch'sti net ([Jan, Petr, . . .]) Příklad: algebrogram -• Přiřaďte cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: M SEND + MORE= MONEY M různá písmena mají přiřazena různé cifry i SaM nejsou 0 Hana Rudová, Logické programování I, 20. května 2009 186 Logické programování s omezujícími podmínkami Příklad: algebrogram -• Přiřaďte cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: M SEND + MORE= MONEY M různá písmena mají přiřazena různé cifry i SaM nejsou 0 -• domain([E,N,D,0,R,Y], 0, 9), domain([S,M],1,9) Hana Rudová, Logické programování I, 20. května 2009 186 Logické programování s omezujícími podmínkami Příklad: algebrogram -• Přiřaďte cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: M SEND + MORE= MONEY M různá písmena mají přiřazena různé cifry i SaM nejsou 0 M domain([E,N,D,0,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, 20. května 2009 186 Logické programování s omezujícími podmínkami Příklad: algebrogram -• Přiřaďte cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: M SEND + MORE= MONEY M různá písmena mají přiřazena různé cifry i SaM nejsou 0 M domain([E,N,D,0,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, 20. května 2009 186 Logické programování s omezujícími podmínkami Příklad: algebrogram -• Přiřaďte cifry 0, ... 9 písmenům S, E, N, D, M, O, R, Y tak, aby platilo: M SEND + MORE= MONEY M různá písmena mají přiřazena různé cifry i SaM nejsou 0 M domain([E,N,D,0,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] ) -• labelingC [S,E,N,D,M,0,R,Y] ) Hana Rudová, Logické programování I, 20. května 2009 186 Logické programování s omezujícími podmínkami Od LP k CLP I. -• CLP: rozšíření logického programování o omezující podmínky -• CLP systémy se liší podle typu domény 3 CLP(J4.) generický jazyk 3 CLP(FD) domény proměnných jsou konečné (Finite Domains) 3 CLP(M) doménou proměnných je množina reálných čísel Hana Rudová, Logické programování I, 20. května 2009 187 Logické programování s omezujícími podmínkami Od LP k CLP I. -• CLP: rozšíření logického programování o omezující podmínky -• CLP systémy se liší podle typu domény 3 CLP(J4.) generický jazyk 3 CLP(FD) domény proměnných jsou konečné (Finite Domains) 3 CLP(M) doménou proměnných je množina reálných čísel -• Cíl 3 využít syntaktické a výrazové přednosti LP 3 dosáhnout větší efektivity Hana Rudová, Logické programování I, 20. května 2009 187 Logické programování s omezujícími podmínkami Od LP k CLP I. -• CLP: rozšíření logického programování o omezující podmínky -• CLP systémy se liší podle typu domény 3 CLP(J4.) generický jazyk 3 CLP(FD) domény proměnných jsou konečné (Finite Domains) 3 CLP(M) doménou proměnných je množina reálných čísel -• Cíl 3 využít syntaktické a výrazové přednosti LP 3 dosáhnout větší efektivity -• Unifikace v LP je nahrazena splňováním podmínek 3 unifikace se chápe jako jedna z podmínek 3 A = B 3 A #< B, A in 0..9, domain([A, B] ,0,9), all_distinct([A,B,C]) Hana Rudová, Logické programování I, 20. května 2009 187 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M omezení: A in 0..2, B in 0..2, B #< A Hana Rudová, Logické programování I, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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 3 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky Hana Rudová, Logické programování I, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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 3 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky -0 Prohledávání doplněno konzistenčními technikami M A in 1. .2, B in 0. .1, B #< A Hana Rudová, Logické programování I, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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 3 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky -0 Prohledávání doplněno konzistenčními technikami M A in 1. .2, B in 0. .1, B #< A 3 po provedení A #= 1 se z B #< A se odvodí: B #= 0 Hana Rudová, Logické programování I, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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 3 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky -0 Prohledávání doplněno konzistenčními technikami M A in 1. .2, B in 0. .1, B #< A 3 po provedení A #= 1 se z B #< A se odvodí: B #= 0 -• Podmínky jako výstup 3 kompaktní reprezentace nekonečného počtu řešení, výstup lze použít jako vstup Hana Rudová, Logické programování I, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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 3 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky -0 Prohledávání doplněno konzistenčními technikami M A in 1. .2, B in 0. .1, B #< A 3 po provedení A #= 1 se z B #< A se odvodí: B #= 0 -• Podmínky jako výstup 3 kompaktní reprezentace nekonečného počtu řešení, výstup lze použít jako vstup -• 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, 20. května 2009 188 Logické programování s omezujícími podmínkami Od LP k CLP II. -• Pro řešení podmínek se používají konzistenční techniky -• consistency techniques, propagace omezení (constraint propagation) M 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 3 Podmínky jsou deterministicky vyhodnoceny v okamžiku volání podmínky -0 Prohledávání doplněno konzistenčními technikami M A in 1. .2, B in 0. .1, B #< A 3 po provedení A #= 1 se z B #< A se odvodí: B #= 0 -• Podmínky jako výstup 3 kompaktní reprezentace nekonečného počtu řešení, výstup lze použít jako vstup -• 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, 20. května 2009 188 Logické programování s omezujícími podmínkami Syntaxe CLP -• Výběr jazyka omezení M CLP klauzule jako LP klauzule, ale její tělo může obsahovat omezení daného jazyka p(X,Y) :- X #< Y+l, q(X), r(X,Y,Z). -• Rezoluční krok v LP M kontrola existence mgu mezi cílem a hlavou -• Krok odvození v CLP také zahrnuje -• kontrola konzistence aktuální množiny omezení s omezeními v těle klauzule => Vyvolání dvou řešičů: unifikace + řešič omezení Hana Rudová, Logické programování I, 20. května 2009 189 Logické programování s omezujícími podmínkami Operační sémantika CLP -• CLP výpočet cíle G M Store množina aktivních omezení = prostor omezení (constraint store) M inicializace Store = 0 3 seznamy cílů v G prováděny v obvyklém pořadí -• pokud narazíme na cíl s omezením c: NewStore = Store u {c} M snažíme se splnit c vyvoláním jeho řešiče s* při neúspěchu se vyvolá backtracking s* při úspěchu se podmínky v NewStore zjednoduší propagací omezení 3 zbývající cíle jsou prováděny s upraveným NewStore M CLP výpočet cíle G je úspěš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, 20. května 2009 190 Logické programování s omezujícími podmínkami CLP(FD) v SICStus Prologu Nejpoužívanější systémy a jazyky pro CP -• Swedish Institute of Computer Science: SICStus Prolog 1 985 -• silná CLP(FD) knihovna, komerční i akademické použití pro širokou škálu platforem Hana Rudová, Logické programování I, 20. května 2009 192 CLP(FD) v SICStus Prologu Nejpoužívanější systémy a jazyky pro CP -• Swedish Institute of Computer Science: SICStus Prolog 1 985 -• silná CLP(FD) knihovna, komerční i akademické použití pro širokou škálu platforem M IC-PARC, Imperial College London, Cisco Systems: ECL*PSe 1 984 M široké možnosti kooperace mezi různými řešičemi: konečné domény, reálná čísla, repai r -• od 2004 vlastní Cisco Systems volně dostupné pro akademické použití, rozvoj na IC-PARC, platformy: Windows, Linux, Solaris Hana Rudová, Logické programování I, 20. května 2009 1 92 CLP(FD) v SICStus Prologu Nejpoužívanější systémy a jazyky pro CP -• Swedish Institute of Computer Science: SICStus Prolog 1 985 -• silná CLP(FD) knihovna, komerční i akademické použití pro širokou škálu platforem M IC-PARC, Imperial College London, Cisco Systems: ECL*PSe 1 984 M široké možnosti kooperace mezi různými řešičemi: konečné domény, reálná čísla, repai r -• od 2004 vlastní Cisco Systems volně dostupné pro akademické použití, rozvoj na IC-PARC, platformy: Windows, Linux, Solaris -• ILOG, omezující podmínky v C++ 1987 M komerční společnost, vznik ve Francie, nyní rozšířená po celém světě M implementace podmínek založena na objektově orientovaném programování Hana Rudová, Logické programování I, 20. května 2009 1 92 CLP(FD) v SICStus Prologu Nejpoužívanější systémy a jazyky pro CP -• Swedish Institute of Computer Science: SICStus Prolog 1 985 -• silná CLP(FD) knihovna, komerční i akademické použití pro širokou škálu platforem M IC-PARC, Imperial College London, Cisco Systems: EClJPS6 1 984 M široké možnosti kooperace mezi různými řešičemi: konečné domény, reálná čísla, repai r -• od 2004 vlastní Cisco Systems volně dostupné pro akademické použití, rozvoj na IC-PARC, platformy: Windows, Linux, Solaris -• ILOG, omezující podmínky v C++ 1987 M komerční společnost, vznik ve Francie, nyní rozšířená po celém světě M implementace podmínek založena na objektově orientovaném programování M http://www.fi.muni.cz/~hanka/bookmarks.html#tools -• cca 50 odkazů na nejrůznější systémy: Prolog, C++, Java, Lisp, ... M COSYTEC: CHIP, ProloglA: Prolog IV, Siemens: IF Prolog, akademický: Mozart (objektově orientované, deklarativní programování, concurrency), ... Hana Rudová, Logické programování I, 20. května 2009 192 CLP(FD) v SICStus Prologu CLP(FD) v SICStus Prologu -• CLP není dostupné v SWI Prologu -• CLP knihovna v ECLiPSe se liší -• Vestavěné predikáty jsou dostupné v separátním modulu (knihovně) :- use_module(library(clpfd)). -• Obecné principy platné všude -• Stejné/podobné vestavěné predikáty existují i jinde -• POZOR: popis vestavěných predikátů vychází z verze 3.* nová verze 4* má syntaxi některých predikátů odlišnou (zejména omezení serialized a cumulative) Hana Rudová, Logické programování I, 20. května 2009 1 93 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy M ?- domainC [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1. . 3 B in 1..3 Hana Rudová, Logické programování I, 20. května 2009 194 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy M ?- domainC [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1. . 3 B in 1..3 i ?- Ain 1..8, A#\=4. ?X in +Min. .+Max A in (1..3) \/ (5..8) Hana Rudová, Logické programování I, 20. května 2009 1 94 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy M ?- domainC [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1. . 3 B in 1..3 i ?- Ain 1..8, A#\=4. ?X in +Min. .+Max A in (1..3) \/ (5..8) -• Doména reprezentována jako posloupnost intervalů celých čísel -• ?- A in (1..3) \/ (8..15) \/ (5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} Hana Rudová, Logické programování I, 20. května 2009 1 94 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy M ?- domainC [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1. . 3 B in 1..3 i ?- Ain 1..8, A#\=4. ?X in +Min. .+Max A in (1..3) \/ (5..8) -• Doména reprezentována jako posloupnost intervalů celých čísel -• ?- A in (1..3) \/ (8..15) \/ (5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} M Zjištění domény Range proměnné Var: fd_dom(?Var,?Range) 3 A in 1..8, A #\= 4, fd_dom(A,Range). Range=(1..3) \/ (5..8) Hana Rudová, Logické programování I, 20. května 2009 1 94 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy M ?- domainC [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1. . 3 B in 1..3 i ?- Ain 1..8, A#\=4. ?X in +Min. .+Max A in (1..3) \/ (5..8) -• Doména reprezentována jako posloupnost intervalů celých čísel -• ?- A in (1..3) \/ (8..15) \/ (5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} M Zjištění domény Range proměnné 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,(l..3) \/ (5..8)). no Hana Rudová, Logické programování I, 20. května 2009 1 94 CLP(FD) v SICStus Prologu Příslušnost k doméně: Range termy ?- domainC [A,B], 1,3). domain( +Variables, +Min, +Max) A in 1..3 B in 1..3 ?- 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 čísel ?- A in (1..3) \/ (8..15) \/ (5..9) \/ {100}. ?X in +Range A in (1..3) \/ (5..15) \/ {100} Zjištění domény Range proměnné Var: fd_dom(?Var,?Range) «• A in 1..8, A #\= 4, fd_dom(A,Range). Range=(1..3) \/ (5..8) 3 A in 2..10, fd_dom(A,(l..3) \/ (5..8)). no Range term: reprezentace nezávislá na implementaci Hana Rudová, Logické programování I, 20. května 2009 1 94 CLP(FD) v SICStus Prologu Příslušnost k doméně: FDSet termy -• 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) \/ (5..8) FDSet = [[113],[5|8]] Hana Rudová, Logické programování I, 20. května 2009 1 95 CLP(FD) v SICStus Prologu Příslušnost k doméně: FDSet termy -• 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) \/ (5..8) FDSet = [[113],[5|8]] J ?- A in 1..8,A#\=4, fd_set(A,FDSet),B in_set FDSet. ?X i n_set +FDSet A in (1..3) \/ (5..8) FDSet = [[113],[5|8]] B in (1..3) \/ (5..8) Hana Rudová, Logické programování I, 20. května 2009 1 95 CLP(FD) v SICStus Prologu Příslušnost k doméně: FDSet termy -• 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) \/ (5..8) FDSet = [[113],[5|8]] J ?- A in 1..8,A#\=4, fd_set(A,FDSet),B in_set FDSet. ?X i n_set +FDSet A in (1..3) \/ (5..8) FDSet = [[113],[5|8]] B in (1..3) \/ (5..8) M FDSet termy představují nízko-úrovňovou implementaci M FDSet termy nedoporučeny v programech 3 používat pouze predikáty pro manipulaci s nimi ^ omezit použití A in_set [[1| 2] , [6| 9]] «• Range termy preferovány Hana Rudová, Logické programování I, 20. května 2009 195 CLP(FD) v SICStus Prologu Další fcL. . . predikáty -• fdset_to_list(+FDset, -List) vrací do seznamu prvky FDset M list_to_fdset(+List, -FDset) vrací FDset odpovídající seznamu -• fd_var(?Var) je Var doménová proměnná? -• fd_min(?Var ,?Min) nejmenší hodnota v doméně -• fd_max(?Var,?Max) největší hodnota v doméně M fd_size(?Var,?Size) velikost domény -• fd_degree(?Var ,?Degree) počet navázaných omezení na proměnné Hana Rudová, Logické programování I, 20. května 2009 1 96 CLP(FD) v SICStus Prologu Další fcL. . . predikáty -• fdset_to_list(+FDset, -List) vrací do seznamu prvky FDset M list_to_fdset(+List, -FDset) vrací FDset odpovídající seznamu -• fd_var(?Var) je Var doménová proměnná? -• fd_min(?Var ,?Min) nejmenší hodnota v doméně -• fd_max(?Var,?Max) největší hodnota v doméně M fd_size(?Var,?Size) velikost domény -• fd_degree(?Var ,?Degree) počet navázaných omezení na proměnné 3 mění se během výpočtu: pouze aktivní omezení, i odvozená aktivní omezení Hana Rudová, Logické programování I, 20. května 2009 1 96 CLP(FD) v SICStus Prologu Aritmetická omezení -• Expr RelOp Expr RelOp -> #= | #\= | #< | #=< | #> | #>= M A + B #=< 3, A #\= (C - 4) * ( D - 5) , A/2 #= 4 Hana Rudová, Logické programování I, 20. května 2009 1 97 CLP(FD) v SICStus Prologu Aritmetická omezení -• Expr RelOp Expr RelOp -> #= | #\= | #< | #=< | #> | #>= -• A + B #=< 3, A #\= (C - 4) * ( D - 5) , A/2 #= 4 -• sum(Variables,RelOp,Suma) -• domain ([A, B, C, F] ,1,3) , sum([A,B,C],#= ,F) Hana Rudová, Logické programování I, 20. května 2009 1 97 CLP(FD) v SICStus Prologu Aritmetická omezení -• Expr RelOp Expr RelOp -> #= | #\= | #< | #=< | #> | #>= -• A + B #=< 3, A #\= (C - 4) * ( D - 5) , A/2 #= 4 -• sum(Variables,RelOp,Suma) -• domain ([A, B, C, F] ,1,3) , sum([A,B,C],#= ,F) -• scalar_product(Coeffs,Variables,RelOp,ScalarProduct) 3 domain([A,B,C,F],1,6), scalar_product( [1,2,3],[A,B,C],#= ,F) Hana Rudová, Logické programování I, 20. května 2009 1 97 CLP(FD) v SICStus Prologu Výroková omezení, reifikace -• Výroková omezení pozor na efektivitu -• \# negace, #/\ konjunkce, #\/ disjunkce, #<=> ekvivalence, ... ^ X #> 4 #/\ Y #< 6 Hana Rudová, Logické programování I, 20. května 2009 1 98 CLP(FD) v SICStus Prologu Výroková omezení, reifikace -• Výroková omezení pozor na efektivitu -• \# negace, #/\ konjunkce, #\/ disjunkce, #<=> ekvivalence, ... ^ X #> 4 #/\ Y #< 6 «• příklad: A#\= 3, A#\= 4 A#\= 3 #/\ A#\= 4 A#=l #\/ A#=2 A in (inf..2)\/ (5..sup) A in (inf..2)\/ (5..sup) A in inf..sup Hana Rudová, Logické programování I, 20. května 2009 1 98 CLP(FD) v SICStus Prologu Výroková omezení, reifikace -• Výroková omezení pozor na efektivitu -• \# negace, #/\ konjunkce, #\/ disjunkce, #<=> ekvivalence, ... ^ X #> 4 #/\ Y #< 6 «• příklad: A#\= 3, A#\= 4 A#\= 3 #/\ A#\= 4 A#=l #\/ A#=2 A in (inf..2)\/ (5..sup) A in (inf..2)\/ (5..sup) A in inf..sup tj. propagace disjunkce A#=l #\/ A#=2 je příliš slabá (propagační algoritmy příliš obecné) Hana Rudová, Logické programování I, 20. května 2009 1 98 CLP(FD) v SICStus Prologu Výroková omezení, reifikace -• Výroková omezení pozor na efektivitu -• \# negace, #/\ konjunkce, #\/ disjunkce, #<=> ekvivalence, ... ^ X #> 4 #/\ Y #< 6 «• příklad: A#\= 3, A#\= 4 A#\= 3 #/\ A#\= 4 A#=l #\/ A#=2 A in (inf..2)\/ (5..sup) A in (inf..2)\/ (5..sup) A in inf..sup tj. propagace disjunkce A#=l #\/ A#=2 je příliš slabá (propagační algoritmy příliš obecné) M Reifikace pozor na efektivitu M Constraint #<=> Bool Bool in 0. .1 v závislosti na tom, zda je Constraint splněn M příklad: A in 1..10 #<=> Bool Hana Rudová, Logické programování I, 20. května 2009 1 98 CLP(FD) v SICStus Prologu Výroková omezení, reifikace -• Výroková omezení pozor na efektivitu -• \# negace, #/\ konjunkce, #\/ disjunkce, #<=> ekvivalence, ... ^ X #> 4 #/\ Y #< 6 «• příklad: A#\= 3, A#\= 4 A#\= 3 #/\ A#\= 4 A#=l #\/ A#=2 A in (inf..2)\/ (5..sup) A in (inf..2)\/ (5..sup) A in inf..sup tj. propagace disjunkce A#=l #\/ A#=2 je příliš slabá (propagační algoritmy příliš obecné) M Reifikace pozor na efektivitu M Constraint #<=> Bool Bool in 0. .1 v závislosti na tom, zda je Constraint splněn M příklad: A in 1..10 #<=> Bool M za předpokladu X in 3.. 10, Y in 1..4, Bool in 0..1 porovnej rozdíl mezi X# Bool Hana Rudová, Logické programování I, 20. května 2009 1 98 CLP(FD) v SICStus Prologu Výroková omezení, reifikace -• Výroková omezení pozor na efektivitu -• \# negace, #/\ konjunkce, #\/ disjunkce, #<=> ekvivalence, ... ^ X #> 4 #/\ Y #< 6 «• příklad: A#\= 3, A#\= 4 A#\= 3 #/\ A#\= 4 A#=l #\/ A#=2 A in (inf..2)\/ (5..sup) A in (inf..2)\/ (5..sup) A in inf..sup tj. propagace disjunkce A#=l #\/ A#=2 je příliš slabá (propagační algoritmy příliš obecné) M Reifikace pozor na efektivitu M Constraint #<=> Bool Bool in 0. .1 v závislosti na tom, zda je Constraint splněn M příklad: A in 1..10 #<=> Bool M za předpokladu X in 3.. 10, Y in 1..4, Bool in 0..1 porovnej rozdíl mezi X# Bool X= 3, Y = 4 X in 3..10, Yin 1..4, Bool in 0..1 Hana Rudová, Logické programování I, 20. května 2009 198 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) Hana Rudová, Logické programování I, 20. května 2009 199 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace N #= M+B, % doménová proměnná místo akumulátoru exactly(X, L, M). Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace N #= M+B, % doménová proměnná místo akumulátoru exactly(X, L, M). M | ?- domain([A,B,C,D,E,N],1,2), exactlyCl,[A,B,C,D,E],N), Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace N #= M+B, % doménová proměnná místo akumulátoru exactly(X, L, M). M | ?- domain([A,B,C,D,E,N],1,2), exactlyCl,[A,B,C,D,E],N),A#< 2, Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace N #= M+B, % doménová proměnná místo akumulátoru exactly(X, L, M). M | ?- domain([A,B,C,D,E,N],1,2), exactlyCl,[A,B,C,D,E],N),A#< 2,B#< 2. Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace N #= M+B, % doménová proměnná místo akumulátoru exactly(X, L, M). M | ?- domain([A,B,C,D,E,N],1,2), exactlyCl,[A,B,C,D,E],N),A#< 2,B#< 2. A=l, B=l, C=2, D=2, E=2, N=2 Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Příklad: reifikace -• Přesně N prvků v seznamu S je rovno X: exactly(X,S,N) exactly(_, [], 0). exactly(X, [Y|L], N) :- X #= Y #<=> B, % reifikace N #= M+B, % doménová proměnná místo akumulátoru exactly(X, L, M). M | ?- domain([A,B,C,D,E,N],1,2), exactlyCl,[A,B,C,D,E],N),A#< 2,B#< 2. A=l, B=l, C=2, D=2, E=2, N=2 -• Vyzkoušejte si M greaters(X,S,N): přesně N prvků v seznamu S je větší než X -• atleast(X,S,N): alespoň N prvků v seznamu S je rovno X M atmost(X,S,N): nejvýše N prvků v seznamu S je rovno X Hana Rudová, Logické programování I, 20. května 2009 1 99 CLP(FD) v SICStus Prologu Základní kombinatorická omezení -• element(N,List,X) -• omezení na konkrétní prvek seznamu M global_cardinality(l_ist, [Key-Count I _ ]) * omezení na počet prvků daného typu v seznamu Hana Rudová, Logické programování I, 20. května 2009 200 CLP(FD) v SICStus Prologu Základní kombinatorická omezení -• element(N,List,X) -• omezení na konkrétní prvek seznamu M global_cardinality(l_ist, [Key-Count I _ ]) 3 omezení na počet prvků daného typu v seznamu -• all_distinet(List) 3 všechny proměnné různé Hana Rudová, Logické programování I, 20. května 2009 200 CLP(FD) v SICStus Prologu Základní kombinatorická omezení -• element(N,List,X) -• omezení na konkrétní prvek seznamu M global_cardinality(List, [Key-Count I _ ]) 3 omezení na počet prvků daného typu v seznamu -• all_distinet(List) 3 všechny proměnné různé -• serialized(Starts,Durations) M disjunktivní rozvrhování -• disjoint2(Rectangles) -• nepřekrývání obdélníků M cumulative(Starts,Durations,Resources,Limit) M kumulativní rozvrhování Hana Rudová, Logické programování I, 20. května 2009 200 CLP(FD) v SICStus Prologu Výskyty prvků v seznamu -• element(N,List,X) M N-tý prvek v seznamu Li st je roven X M | ?- A in 2..10, B in 1..3, elementC N, [A,B], X ), Hana Rudová, Logické programování I, 20. května 2009 201 CLP(FD) v SICStus Prologu Výskyty prvků v seznamu -• element(N,List,X) M N-tý prvek v seznamu Li st je roven X 3 I ?- A in 2..10, B in 1..3, elementC N, [A,B], X ), X#< 2. B= 1, N = 2,X= 1, Ain 2..10 Hana Rudová, Logické programování I, 20. května 2009 201 CLP(FD) v SICStus Prologu Výskyty prvků v seznamu -• element(N,List,X) M N-tý prvek v seznamu Li st je roven X 3 I ?- A in 2..10, B in 1..3, elementC N, [A,B], X ), X#< 2. B= 1, N = 2,X= 1, Ain 2..10 -• global_cardinality(l_ist, KeyCounts) M pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key M každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou Hana Rudová, Logické programování I, 20. května 2009 201 CLP(FD) v SICStus Prologu Výskyty prvků v seznamu -• element(N,List,X) M N-tý prvek v seznamu Li st je roven X 3 I ?- A in 2..10, B in 1..3, elementC N, [A,B], X ), X#< 2. B= 1, N = 2,X= 1, Ain 2..10 -• global_cardinality(l_ist, KeyCounts) M pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key M každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou M global_cardinality(S, [X-N] ) je obdobné omezení exactly(X,S,N) Hana Rudová, Logické programování I, 20. května 2009 201 CLP(FD) v SICStus Prologu Výskyty prvků v seznamu -• element(N,List,X) M N-tý prvek v seznamu Li st je roven X 3 I ?- A in 2..10, B in 1..3, elementC N, [A,B], X ), X#< 2. B= 1, N = 2,X= 1, Ain 2..10 -• global_cardinality(l_ist, KeyCounts) M pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key M každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou M global_cardinality(S, [X-N] ) je obdobné omezení exactly(X,S,N) M | ?- A in 1..3, B in 1..3, global_cardinality( [A,B], [l-N,2-2]). Hana Rudová, Logické programování I, 20. května 2009 201 CLP(FD) v SICStus Prologu Výskyty prvků v seznamu -• element(N,List,X) M N-tý prvek v seznamu Li st je roven X 3 I ?- A in 2..10, B in 1..3, elementC N, [A,B], X ), X#< 2. B= 1, N = 2,X= 1, Ain 2..10 -• global_cardinality(l_ist, KeyCounts) M pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key M každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou M global_cardinality(S, [X-N] ) je obdobné omezení exactly(X,S,N) M | ?- A in 1..3, B in 1..3, global_cardinality( [A,B], [l-N,2-2]). A=2, B=2, N=0 Hana Rudová, Logické programování I, 20. května 2009 201 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, PetrUt, ..., PavelPo,... Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, PetrUt, ..., PavelPo,... Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, Petrllt, ..., PavelPo,... -• každý den: minimální a maximální počet zaměstnanců každou směnu Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, Petrllt, ..., PavelPo,... -• každý den: minimální a maximální počet zaměstnanců každou směnu Rl in MinRanol..MaxRanol, Dl in MinDenl..MaxDenl, ... Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, Petrllt, ..., PavelPo,... -• každý den: minimální a maximální počet zaměstnanců každou směnu Rl in MinRanol..MaxRanol, Dl in MinDenl..MaxDenl, ... global_cardinality( [PetrPo,Pavel Po,MariePo,...], [1-R1.2-D1,...,5-V1] ) Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, Petrllt, ..., PavelPo,... -• každý den: minimální a maximální počet zaměstnanců každou směnu Rl in MinRanol..MaxRanol, Dl in MinDenl..MaxDenl, ... global_cardinality( [PetrPo,Pavel Po,MariePo,...], [1-R1.2-D1,...,5-V1] ) -• pro každého zaměstnance: minimální a maximální počet typu směny za týden Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, Petrllt, ..., PavelPo,... -• každý den: minimální a maximální počet zaměstnanců každou směnu Rl in MinRanol..MaxRanol, Dl in MinDenl..MaxDenl, ... global_cardinality( [PetrPo,Pavel Po,MariePo,...], [1-R1.2-D1,...,5-V1] ) -• pro každého zaměstnance: minimální a maximální počet typu směny za týden R2 in MinRano2..MaxRano2, D2 in MinDen2..MaxDen2, ... Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Příklad: rozvrhování zaměstnanců -• vytvoření rozvrhu pro zaměstnance pracující na směny 3 A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno •• P = {Petr, Pavel , Marie, . . .} M W = {Po,Út,St,Čt,...} -• matice doménových proměnných: PetrPo, Petrllt, ..., PavelPo,... -• každý den: minimální a maximální počet zaměstnanců každou směnu Rl in MinRanol..MaxRanol, Dl in MinDenl..MaxDenl, ... global_cardinality( [PetrPo,Pavel Po,MariePo,...], [1-R1.2-D1,...,5-V1] ) -• pro každého zaměstnance: minimální a maximální počet typu směny za týden R2 in MinRano2..MaxRano2, D2 in MinDen2..MaxDen2, ... global_cardinality( [PetrPo, Petrllt, ..., PetrNe] , [1-R2 , 2-D2 , . . . , 5-V2] ) Hana Rudová, Logické programování I, 20. května 2009 202 CLP(FD) v SICStus Prologu Po Út St Čt ... Petr R N v R Pavel R Z R N Marie N V D D ... Všechny proměnné různé -• all_distinct(Variables), all_different(Variables) -• Proměnné v seznamu Variables jsou různé M all_distinct a all_different se liší úrovní propagace M all_distinct má úplnou propagaci M all_different má slabší (neúplnou) propagaci Hana Rudová, Logické programování I, 20. května 2009 203 CLP(FD) v SICStus Prologu Všechny proměnné různé all_di sti net(Vari ables), all_di fferent(Vari ables) Proměnné v seznamu Variables jsou různé all_distinct a all_different se liší úrovní propagace M all_distinct má úplnou propagaci M all_different má slabší (neúplnou) propagaci Příklad: učitelé musí učit v různé hodiny 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, 20. května 2009 203 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é M all_distinct a all_different se liší úrovní propagace M all_distinct má úplnou propagaci M all_different má slabší (neúplnou) propagaci -• Příklad: učitelé musí učit v různé hodiny -• all_distinct([Ilan, Petr,Anna,Ota, Eva,Marie]) Jan = 6, Ota = 2, Anna = 5, Marie = 1, Petr in 3..4, Eva in 3..4 Hana Rudová, Logické programování I, 20. května 2009 203 CLP(FD) v SICStus Prologu učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Všechny proměnné různé -• all_distinct(Variables), all_different(Variables) -• Proměnné v seznamu Variables jsou různé M all_distinct a all_different se liší úrovní propagace M all_distinct má úplnou propagaci M all_different má slabší (neúplnou) propagaci -• Příklad: učitelé musí učit v různé 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 M 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 Hana Rudová, Logické programování I, 20. května 2009 203 CLP(FD) v SICStus Prologu učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Disjunktivní rozvrhování -• serialized(Starts,Durations) M Rozvržení úloh zadaných startovním časem (seznam Starts) a dobou trvání (seznam nezáporných Durations) tak, aby se nepřekrývaly Hana Rudová, Logické programování I, 20. května 2009 204 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování sen" al i zed (Starts, Durati ons) Rozvržení úloh zadaných startovním časem (seznam Starts) a dobou trvání (seznam nezáporných Durations) tak, aby se nepřekrývaly příklad s konstantami: serial i zed([0,3,5],[2,1,1]) 2 - L--------------------------------------------1 I-------------------1 I------------------- i. 2 3 1 2 5 Hana Rudová, Logické programování I, 20. května 2009 204 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování sen" al i zed (Starts, Durati ons) Rozvržení úloh zadaných startovním časem (seznam Starts) a dobou trvání (seznam nezáporných Durations) tak, aby se nepřekrývaly příklad s konstantami: serialized([0,3,5],[2,l ,1]) 2 - L--------------------------------------------1 I-------------------1 I------------------- i. 2 3 L 2 5 příklad: vytvoření rozvrhu, za předpokladu, že doba trvání hodin není stejná Hana Rudová, Logické programování I, 20. května 2009 204 CLP(FD) v SICStus Prologu Disjunktivní rozvrhování sen" al i zed (Starts, Durati ons) Rozvržení úloh zadaných startovním časem (seznam Starts) a dobou trvání (seznam nezáporných Durations) tak, aby se nepřekrývaly M příklad s konstantami: serialized([0,3,5],[2,l ,1]) 2 - L--------------------------------------------1 I-------------------1 I------------------- 1. 2 3 L 2 5 6 příklad: vytvoření rozvrhu, za předpokladu, že doba trvání hodin není stejná i* D in 1. .2, C = 3, se ri ali zed([3 an,Pet r,Anna,Ota,Eva,Mari e], [D,D,D,C,C,C]) Hana Rudová, Logické programování I, 20. května 2009 204 CLP(FD) v SICStus Prologu Nepřekrývání obdélníků -• disjoint2(Rectangles) disjointl(Lines) disjoint2( [Name(X, Délka, Y, Vyska) | _ ] ) -• umístění obdélníků ve dvourozměrném prostoru doménové proměnné X,Y,Délka,Vyska mohou být z oboru celých čísel Hana Rudová, Logické programování I, 20. května 2009 205 CLP(FD) v SICStus Prologu Nepřekrývání obdélníku di sjoi nt2(Rectangles) di sjoi ntl(Li nes) disjoint2( [Name(X, Délka, Y, Vyska) | _ ] ) umístění obdélníků ve dvourozměrném prostoru doménové proměnné X,Y,Délka,Vyska mohou být z oboru celých čísel 3 příklad s konstantami: disjoint2([rect(0,3,0,l),rect(l,3,l,2),rect(4,2,2,-2)]) 2 _ 2 ------------ 1----------'----------------1-------- 3 1 6 Hana Rudová, Logické programování I, 20. května 2009 205 CLP(FD) v SICStus Prologu Nepřekrývání obdélníků di sj oi nt2(Rectangles) disjoint2( [Name(X, Délka, Y, Vyska) | _ ] ) disjointl(Lines) umístění obdélníků ve dvourozměrném prostoru doménové proměnné X,Y,Délka,Vyska mohou být z oboru celých čísel 3 příklad s konstantami: disjoint2([rect(0,3,0,l),rect(l,3,l,2),rect(4,2,2,-2)]) 2 _ 2 ------------ 1----------'----------------1-------- 3 1 12 3 4 5 6 3 příklad: vytvoření rozvrhu za předpokladu, že učitelé učiv různých místnostech D in 1..2, C = 3, disjoint2( class(Jan,D,Ml,l), class(Petr,D,M2,1), class(Petr,D,M3,l), ...] ) Hana Rudová, Logické programování I, 20. května 2009 205 CLP(FD) v SICStus Prologu Kumulativní rozvrhování M cumulative(Starts,Durations,Resources,Limit) -• Úlohy jsou zadány startovním časem (seznam Starts), dobou trvání (seznam Durations) a požadovanou kapacitou zdroje (seznam Resources) -• Rozvržení úloh tak, aby celková kapacita zdroje nikdy nepřekročila Limit Hana Rudová, Logické programování I, 20. května 2009 206 CLP(FD) v SICStus Prologu Kumulativní rozvrhování M cumulative(Starts,Durations,Resources,Limit) -• Úlohy jsou zadány startovním časem (seznam Starts), dobou trvání (seznam Durations) a požadovanou kapacitou zdroje (seznam Resources) -• Rozvržení úloh tak, aby celková kapacita zdroje nikdy nepřekročila Limit -• Příklad s konstantami: cumulative([0,l ,3],[4,2,3],[1,2,2],3) 2 3 i. 12 3 4 5 6 Hana Rudová, Logické programování I, 20. května 2009 206 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování M Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování M Vytvořte rozvrh pro následující schedulers, End) :- úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování M Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu schedule(Ss, End) :-length(Ss, 7), Příklad: kumulativní rozvrhování M Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], Příklad: kumulativní rozvrhování Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5 Rs = [ 2, 9, 3, 7, 10 domain(Ss, 0, 51), domain([End], 0, 69), 18, 4], 1, 11], Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], domain(Ss, 0, 51), domain([End], 0, 69), after(Ss, Ds, End), % koncový čas Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování M Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], domain(Ss, 0, 51), domain([End], 0, 69), after(Ss, Ds, End), % koncový čas cumulative(Ss, Ds, Rs, 13), Příklad: kumulativní rozvrhování Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], domain(Ss, 0, 51), domain([End], 0, 69), after(Ss, Ds, End), % koncový čas cumulative(Ss, Ds, Rs, 13), append(Ss, [End], Vars), labeling([mi ni mi ze(End)], Vars). Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování -• Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti t2 t3 t4 t5 t6 X.7 16 6 13 7 5 18 4 2 9 3 7 10 1 11 schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], domain(Ss, 0, 51), domain([End], 0, 69), after(Ss, Ds, End), % koncový čas cumulative(Ss, Ds, Rs, 13), append(Ss, [End], Vars), labeling([mi ni mi ze(End)], Vars). after([], [] , _) . after([S|Ss], [D|Ds], E) :- E #>= S+D, after(Ss, Ds, E). ti X2 t3 t4 t5 t6 X7 16 6 13 7 5 18 4 2 9 3 7 10 1 11 Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Příklad: kumulativní rozvrhování -• Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita ti 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 X.7 4 11 schedule(Ss, End) :-length(Ss, 7), Ds = [16, 6, 13, 7, 5, 18, 4], Rs = [ 2, 9, 3, 7, 10, 1, 11], domain(Ss, 0, 51), domain([End], 0, 69), after(Ss, Ds, End), % koncový čas cumulative(Ss, Ds, Rs, 13), append(Ss, [End], Vars), labeling([mi ni mi ze(End)], Vars). after([], [] , _) . after([S|Ss], [D|Ds], E) :- E #>= S+D, after(Ss, Ds, E). | ?- schedule(Ss, End). Ss = Ss = [0,16,9,9,4,4,0], End = 22 ? Hana Rudová, Logické programování I, 20. května 2009 207 CLP(FD) v SICStus Prologu Vestavěné predikáty pro labeling -• Instanciace proměnné Variable hodnotami v její doméně indomain( Variable ) hodnoty jsou instanciovány při backtrackingu ve vzrůstajícím pořadí ?- X in 4..5, indomain(X). X = 4 ? ; X = 5 ? Hana Rudová, Logické programování I, 20. května 2009 208 CLP(FD) v SICStus Prologu Vestavěné predikáty pro labeling -• Instanciace proměnné Variable hodnotami v její doméně indomain( Variable ) hodnoty jsou instanciovány při backtrackingu ve vzrůstajícím pořadí ?- X in 4..5, indomain(X). X = 4 ? ; X = 5 ? labelingC [] ). labelingC [Var | Rest] ) :- % výběr nejlevější proměnné k instanciaci indomain( Var ), % výběr hodnot ve vzrůstajícím pořadí labelingC Rest ). Hana Rudová, Logické programování I, 20. května 2009 208 CLP(FD) v SICStus Prologu Vestavěné predikáty pro labeling -• Instanciace proměnné Variable hodnotami v její doméně indomain( Variable ) hodnoty jsou instanciovány při backtrackingu ve vzrůstajícím pořadí ?- X in 4..5, indomain(X). X = 4 ? ; X = 5 ? labelingC [] ). labelingC [Var | Rest] ) :- % výběr nejlevější proměnné k instanciaci indomain( Var ), % výběr hodnot ve vzrůstajícím pořadí labelingC Rest ). -• labelingC Options, Variables ) ?- A in 0..2, B in 0..2, B#< A, labeling([], [A,B]). Hana Rudová, Logické programování I, 20. května 2009 208 CLP(FD) v SICStus Prologu Uspořádání hodnot a proměnných -• Při prohledávání je rozhodující uspořádání hodnot a proměnných -• Určují je heuristiky výběru hodnot a výběru proměnných labelingC [] ). labelingC Variables ) :- sel ect_vari able(Vari ables,Var,Rest), select_value(Var,Value), Hana Rudová, Logické programování I, 20. května 2009 209 CLP(FD) v SICStus Prologu Uspořádání hodnot a proměnných -• Při prohledávání je rozhodující uspořádání hodnot a proměnných -• Určují je heuristiky výběru hodnot a výběru proměnných labelingC [] ). labelingC Variables ) :- sel ect_vari able(Vari ables,Var,Rest), select_value(Var,Value), ( Var #= Value, labelingC Rest ) Hana Rudová, Logické programování I, 20. května 2009 209 CLP(FD) v SICStus Prologu Uspořádání hodnot a proměnných Při prohledávání je rozhodující uspořádání hodnot a proměnných Určují je heuristiky výběru hodnot a výběru proměnných labelingC [] ). labelingC Variables ) :- sel ect_vari able(Vari ables,Var,Rest), select_value(Var,Value), ( Var #= Value, labelingC Rest ) Var #\= Value , % nemusí dojít k instanciaci Var labelingC Variables ) % proto pokračujeme se všemi proměnnými včetně Var )■ Hana Rudová, Logické programování I, 20. května 2009 209 CLP(FD) v SICStus Prologu Uspořádání hodnot a proměnných -• Při prohledávání je rozhodující uspořádání hodnot a proměnných -• Určují je heuristiky výběru hodnot a výběru proměnných labelingC [] ). labelingC Variables ) :- sel ect_vari able(Vari ables,Var,Rest), select_value(Var,Value), ( Var #= Value, labelingC Rest ) Var #\= Value , % nemusí dojít k instanciaci Var labelingC Variables ) % proto pokračujeme se všemi proměnnými včetně Var )■ -• Statické uspořádání: určeno už před prohledáváním -• Dynamické uspořádání: počítá se během prohledávání Hana Rudová, Logické programování I, 20. května 2009 209 CLP(FD) v SICStus Prologu Výběr hodnoty -• Obecný princip výběru hodnoty: první úspěch (succeed first) M volíme pořadí tak, abychom výběr nemuseli opakovat M ?- domain([A,B,C],1,2), A#=B+C. Hana Rudová, Logické programování I, 20. května 2009 210 CLP(FD) v SICStus Prologu Výběr hodnoty -• Obecný princip výběru hodnoty: první úspěch (succeed first) M volíme pořadí tak, abychom výběr nemuseli opakovat M ?- domain([A, B,C] ,1, 2) , A#=B+C. optimální výběr A=2,B=1 ,C=1 je bez backtrackingu Hana Rudová, Logické programování I, 20. května 2009 210 CLP(FD) v SICStus Prologu Výběr hodnoty -• Obecný princip výběru hodnoty: první úspěch (succeed first) M volíme pořadí tak, abychom výběr nemuseli opakovat M ?- domain([A, B,C] ,1, 2) , A#=B+C. optimální výběr A=2,B=1 ,C=1 je bez backtrackingu -• Parametry label i ng/2 ovlivňující výběr hodnoty př. label i ng( [down], Vars) M up: doména procházena ve vzrůstajícím pořadí (default) -• down: doména procházena v klesajícím pořadí Hana Rudová, Logické programování I, 20. května 2009 210 CLP(FD) v SICStus Prologu Výběr hodnoty -• Obecný princip výběru hodnoty: první úspěch (succeed first) M volíme pořadí tak, abychom výběr nemuseli opakovat M ?- domain([A, B,C] ,1, 2) , A#=B+C. optimální výběr A=2,B=1 ,C=1 je bez backtrackingu -• Parametry label i ng/2 ovlivňující výběr hodnoty př. label i ng( [down], Vars) M up: doména procházena ve vzrůstajícím pořadí (default) -• down: doména procházena v klesajícím pořadí -• Parametry 1 abel i ng/2 řídící, jak je výběr hodnoty realizován M step: volba mezi X #= M, X #\= M (default) X viz dřívější příklad u "Uspořádání hodnot a proměnných" -• enum: vícenásobná volba mezi všemi hodnotami v doméně St podobně jako při i ndomain/1 «• bisect: volba mezi X #=< Mid, X #> Mid ± vjednom kroku labelingu nedochází nutně k instanciaci proměnné Hana Rudová, Logické programování I, 20. května 2009 210 CLP(FD) v SICStus Prologu Výběr proměnné -• Obecný princip výběru proměnné: first-fail 3 výběr proměnné, pro kterou je nejobtížnější nalézt správnou hodnotu pozdější výběr hodnoty pro tuto proměnnou by snadněji vedl k failu 3 vybereme proměnnou s nejmenší doménou -• ?- domain([A,B,C],1,3), A#<3, A#=B+C. Hana Rudová, Logické programování I, 20. května 2009 211 CLP(FD) v SICStus Prologu Výběr proměnné -• Obecný princip výběru proměnné: first-fail 3 výběr proměnné, pro kterou je nejobtížnější nalézt správnou hodnotu pozdější výběr hodnoty pro tuto proměnnou by snadněji vedl k failu 3 vybereme proměnnou s nejmenší doménou M ?- domain ([A, B, C] ,1, 3) , A#<3, A#=B+C. nejlépe je začít s výběrem A Hana Rudová, Logické programování I, 20. května 2009 211 CLP(FD) v SICStus Prologu Výběr proměnné -• Obecný princip výběru proměnné: first-fail 3 výběr proměnné, pro kterou je nejobtížnější nalézt správnou hodnotu pozdější výběr hodnoty pro tuto proměnnou by snadněji vedl k failu 3 vybereme proměnnou s nejmenší doménou M ?- domain ([A, B, C] ,1, 3) , A#<3, A#=B+C. nejlépe je začít s výběrem A -• Parametry label i ng/2 ovlivňující výběr proměnné 3 leftmost: nejlevější (default) -• ff: s (a) nejmenší velikostí domény fd_size(Var,Size) (b) nejlevější z nich Hana Rudová, Logické programování I, 20. května 2009 211 CLP(FD) v SICStus Prologu Výběr proměnné -• Obecný princip výběru proměnné: first-fail 3 výběr proměnné, pro kterou je nejobtížnější nalézt správnou hodnotu pozdější výběr hodnoty pro tuto proměnnou by snadněji vedl k failu 3 vybereme proměnnou s nejmenší doménou M ?- domain ([A, B, C] ,1, 3) , A#<3, A#=B+C. nejlépe je začít s výběrem A -• Parametry label i ng/2 ovlivňující výběr proměnné * leftmost: nejlevější (default) -• ff: s (a) nejmenší velikostí domény fd_size(Var,Size) (b) nejlevější z nich M f f c: s (a) nejmenší velikostí domény (b) největším množstvím omezením „čekajících" na proměnné fd_degree(Var,Size) (c) nejlevější z nich M min/max: s (a) nejmenší/největší hodnotou v doméně proměnné (b) nejlevnější z nich fd_min(Var,Min)/fd_max(Var,Max) Hana Rudová, Logické programování I, 20. května 2009 211 CLP(FD) v SICStus Prologu 95 Hledání optimálního řešení (předpokládejme minimaliz -• Parametry labeling/2 pro optimalizaci: minimize(F)/maxirrrize(F) M Cena #= A+B+C, labeling([mi ni mi ze(Cena)], [A,B,C]) -• Metoda větví a mezí (branch&bound) branch_and_bound(Vars, Cost) -• uvažujeme nejhorší možnou cenu řešení UB (např. cena už nalezeného řešení) 3 počítáme dolní odhad LB ceny částečného řešení LB je tedy nejlepší možná cena pro rozšíření tohoto řešení «• procházíme strom a vyžadujeme, aby prozkoumávaná větev měla cenu LB < UB pokud je LB > UB, tak víme, že v této větvi není lepší řešení a odřízneme ji Hana Rudová, Logické programování I, 20. května 2009 21 2 CLP(FD) v SICStus Prologu Hledání optimálního řešení (předpokládejme minimalizaci -• Parametry labeling/2 pro optimalizaci: minimize(F)/maxirrrize(F) M Cena #= A+B+C, labeling([mi ni mi ze(Cena)], [A,B,C]) -• Metoda větví a mezí (branch&bound) branch_and_bound(Vars, Cost) -• uvažujeme nejhorší možnou cenu řešení UB (např. cena už nalezeného řešení) 3 počítáme dolní odhad LB ceny částečného řešení LB je tedy nejlepší možná cena pro rozšíření tohoto řešení «• procházíme strom a vyžadujeme, aby prozkoumávaná větev měla cenu LB < UB pokud je LB > UB, tak víme, že v této větvi není lepší řešení a odřízneme ji M Iniciálně je Bound je předem známá nejhorší cena (např. krajní hodnota v doméně) branch_and_bound( Bound, Vars, Cost ) :- % jednoduchá implementace Cost #< Bound, findall( Vars-Cost, (labeling( Vars ), ! ), [ Solution-FoundCost ]), !, asserta( solution( Solution, FoundCost ) ), branch_and_bound( FoundCost, Vars, Cost ). branch_and_bound( _, Vars, Cost ) :- solution( Vars, Cost ), !. Hana Rudová, Logické programování I, 20. května 2009 212 CLP(FD) v SICStus Prologu Hledání optimálního řešení (předpokládejme minimalizaci -• Parametry labeling/2 pro optimalizaci: minimize(F)/maxirrrize(F) M Cena #= A+B+C, labeling([mi ni mi ze(Cena)], [A,B,C]) -• Metoda větví a mezí (branch&bound) branch_and_bound(Vars, Cost) -• uvažujeme nejhorší možnou cenu řešení UB (např. cena už nalezeného řešení) 3 počítáme dolní odhad LB ceny částečného řešení LB je tedy nejlepší možná cena pro rozšíření tohoto řešení «• procházíme strom a vyžadujeme, aby prozkoumávaná větev měla cenu LB < UB pokud je LB > UB, tak víme, že v této větvi není lepší řešení a odřízneme ji M Iniciálně je Bound je předem známá nejhorší cena (např. krajní hodnota v doméně) branch_and_bound( Bound, Vars, Cost ) :- % jednoduchá implementace Cost #< Bound, findall( Vars-Cost, (labeling( Vars ), ! ), [ Solution-FoundCost ]), !, asserta( solution( Solution, FoundCost ) ), branch_and_bound( FoundCost, Vars, Cost ). branch_and_bound( _, Vars, Cost ) :- solution( Vars, Cost ), !. Hana Rudová, Logické programování I, 20. května 2009 212 CLP(FD) v SICStus Prologu Algoritmy pro řešení problému splňování podmínek (CSP) Grafová reprezentace CSP -• Reprezentace podmínek M intenzionální (matematická/logická formule) M extenzionální (výčet k-tic kompatibilních hodnot, 0-1 matice) Hana Rudová, Logické programování I, 20. května 2009 214 Algoritmy pro CSP Grafová reprezentace CSP -• Reprezentace podmínek M intenzionální (matematická/logická formule) M extenzionální (výčet k-tic kompatibilních hodnot, 0-1 matice) -• Graf: vrcholy, hrany (hrana spojuje dva vrcholy) M Hypergraf: vrcholy, hrany (hrana spojuje množinu vrcholů) -• Reprezentace CSP pomocí hypergrafu podmínek M vrchol = proměnná, hyperhrana = podmínka Hana Rudová, Logické programování I, 20. května 2009 214 Algoritmy pro CSP Grafová reprezentace CSP Reprezentace podmínek M intenzionální (matematická/logická formule) M extenzionální (výčet k-tic kompatibilních hodnot, 0-1 matice) -• Graf: vrcholy, hrany (hrana spojuje dva vrcholy) M Hypergraf: vrcholy, hrany (hrana spojuje množinu vrcholů) -• Reprezentace CSP pomocí hypergrafu podmínek M vrchol = proměnná, hyperhrana = podmínka -• Příklad °1 M proměnné X\,...,Xq s doménou {0,1 3 omezení c\ : X\ + %2 + Xq = 1 C2 : X\ - X3 + X4 = 1 C3 : X4 + Xs - Xq > 0 Ca : X2 + Xs - Xq = 0 Hana Rudová, Logické programování I, 20. května 2009 214 3 Algoritmy pro CSP Binární CSP Binární CSP M CSP, ve kterém jsou pouze binární podmínky M unární podmínky zakódovány do domény proměnné Graf podmínek pro binární CSP M není nutné uvažovat hypergraf, stačí graf (podmínka spojuje pouze dva vrcholy) Hana Rudová, Logické programování I, 20. května 2009 21 5 Algoritmy pro CSP Binární CSP -• Binární CSP M CSP, ve kterém jsou pouze binární podmínky M unární podmínky zakódovány do domény proměnné M Graf podmínek pro binární CSP M není nutné uvažovat hypergraf, stačí graf (podmínka spojuje pouze dva vrcholy) M Každý CSP lze transformovat na "korespondující" binární CSP M Výhody a nevýhody binarizace M získáváme unifikovaný tvar CSP problému, řada algoritmů navržena pro binární CSP -• bohužel ale značné zvětšení velikosti problému Hana Rudová, Logické programování I, 20. května 2009 21 5 Algoritmy pro CSP Binární CSP -• Binární CSP M CSP, ve kterém jsou pouze binární podmínky M unární podmínky zakódovány do domény proměnné M Graf podmínek pro binární CSP M není nutné uvažovat hypergraf, stačí graf (podmínka spojuje pouze dva vrcholy) M Každý CSP lze transformovat na "korespondující" binární CSP M Výhody a nevýhody binarizace M získáváme unifikovaný tvar CSP problému, řada algoritmů navržena pro binární CSP -• bohužel ale značné zvětšení velikosti problému -• Nebinární podmínky -• složitější propagační algoritmy M lze využít jejich sémantiky pro lepší propagaci S* příklad: all_different vs. množina binárních nerovností Hana Rudová, Logické programování I, 20. května 2009 215 Algoritmy pro CSP Vrcholová a hranová konzistence -• Vrcholová konzistence (node consistency) NC -• každá hodnota z aktuální domény Vt proměnné splňuje všechny unární podmínky s proměnnou Vt Hana Rudová, Logické programování I, 20. května 2009 216 Algoritmy pro CSP Vrcholová a hranová konzistence -• Vrcholová konzistence (node consistency) NC -• každá hodnota z aktuální domény Vt proměnné splňuje všechny unární podmínky s proměnnou Vt M Hranová konzistence (arc consistency) AC pro binární CSP 3 hrana (Ví, V/) je hranově konzistentní, právě když pro každou hodnotu x z aktuální domény Dt existuje hodnota y tak, že ohodnocení [Vt = x,Vj = y] splňuje všechny binární podmínky nad Ví, V). Hana Rudová, Logické programování I, 20. května 2009 21 6 Algoritmy pro CSP Vrcholová a hranová konzistence Vrcholová konzistence (node consistency) NC -• každá hodnota z aktuální domény Vt proměnné splňuje všechny unární podmínky s proměnnou Vt Hranová konzistence (arc consistency) AC pro binární CSP 3 hrana (Ví, V/) je hranově konzistentní, právě když pro každou hodnotu x z aktuální domény Dt existuje hodnota y tak, že ohodnocení [Vt = x,Vj = y] splňuje všechny binární podmínky nad Ví, V), M hranová konzistence je směrová 3 konzistence hrany (V*, V}) nezaručuje konzistenci hrany (V/, V*) A řešení neexistuje -i- všechny domény jsou jednoprvkové => máme řešení -• v obecném případě se alespoň zmenší prohledávaný prostor Hana Rudová, Logické programování I, 20. května 2009 220 Algoritmy pro CSP k-konzistence M Mají NC a AC něco společného? -• NC: konzistence jedné proměnné M AC: konzistence dvou proměnných M ... můžeme pokračovat Hana Rudová, Logické programování I, 20. května 2009 221 k-konzistence M Mají NC a AC něco společného? -• NC: konzistence jedné proměnné M AC: konzistence dvou proměnných M ... můžeme pokračovat -• CSP je k-konzistentní právě tehdy, když můžeme libovolné konzistentní ohodnocení (k-1) různých proměnných rozšířit do libovolné k-té proměnné Hana Rudová, Logické programování I, 20. května 2009 221 Algoritmy pro CSP k-konzistence Mají NC a AC něco společného? -• NC: konzistence jedné proměnné M AC: konzistence dvou proměnných M ... můžeme pokračovat CSP je k-konzistentní právě tehdy, když můžeme libovolné konzistentní ohodnocení (k-1) různých proměnných rozšířit do libovolné k-té proměnné * / 9 ¥ 1,2,3-------1,2,3-------1,2,3------- 4 4-konzistentní graf Pro obecné CSP, tedy i pro nebinární podmínky Hana Rudová, Logické programování I, 20. května 2009 221 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf není 2-konzistentní Hana Rudová, Logické programování I, 20. května 2009 222 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1.1) lze rozšířit na (1,1,1) (2.2) lze rozšířit na (2,2,2) není 2-konzistentní (3) nelze rozšířit (1,3) ani (2,3) nejsou konzistentní dvojice (nerozšiřujeme je) Hana Rudová, Logické programování I, 20. května 2009 222 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1.1) lze rozšířit na (1,1,1) (2.2) lze rozšířit na (2,2,2) (1.3) ani (2,3) nejsou konzistentní dvojice (nerozšiřujeme je) není 2-konzistentní (3) nelze rozšířit CSPje silně k-konzistentní právě 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, 20. května 2009 222 Algoritmy pro CSP Silná k-konzistence 3-konzistentní graf (1.1) lze rozšířit na (1,1,1) (2.2) lze rozšířit na (2,2,2) (1.3) ani (2,3) nejsou konzistentní dvojice (nerozšiřujeme je) není 2-konzistentní (3) nelze rozšířit CSPje silně k-konzistentní právě 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, 20. května 2009 222 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í? M silná n-konzistence je nutná pro graf s n vrcholy Hana Rudová, Logické programování I, 20. května 2009 223 Algoritmy pro CSP Konzistence pro nalezení řešení -• Máme-li graf s n vrcholy, jak silnou konzistenci potřebujeme, abychom přímo našli řešení? M silná n-konzistence je nutná pro graf s n vrcholy s* n-konzistence nestačí (viz předchozí příklad) Hana Rudová, Logické programování I, 20. května 2009 223 Algoritmy pro CSP Konzistence pro nalezení řešení Máme-li graf s n vrcholy, jak silnou konzistenci potřebujeme, abychom přímo našli řešení? M silná n-konzistence je nutná pro graf s n vrcholy s* n-konzistence nestačí (viz předchozí příklad) s> silná k-konzistence pro k silná k-konzistence pro k B => min(A) = min(B)+l, max(B) = max(A)-l 3 příklad: A in 4.. 10, B in 6.. 18, A #> B mi n (A) = 6+1 => A in 7.. 10 max(B) = 10-1 => B in 6. .9 Hana Rudová, Logické programování I, 20. května 2009 227 Algoritmy pro CSP Konzistence mezí -• Bounds consistency BC: slabší než obecná hranová konzistence -• podmínka má konzistentní meze (BC), právě když pro každou proměnnou Vj z této podmínky a každou hodnou x e Dj existuje ohodnocení zbylých proměnných v podmínce tak, že je podmínka splněna a pro vybrané ohodnocení yi proměnné Ví platí min(Di) < yt< max(Di) M stačí propagace pouze při změně minimální nebo maximální hodnoty (při změně mezí) v doméně proměnné M Konzistence mezí pro nerovnice M A #> B => min(A) = min(B)+l, max(B) = max(A)-l 3 příklad: A in 4.. 10, B in 6.. 18, A #> B mi n (A) = 6+1 => A in 7.. 10 max(B) = 10-1 => B in 6. .9 3 podobně: A #< B, A #>= B, A #=< B Hana Rudová, Logické programování I, 20. května 2009 227 Algoritmy pro CSP Konzistence mezí a aritmetická omezení -• A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) Hana Rudová, Logické programování I, 20. května 2009 228 Algoritmy pro CSP Konzistence mezí a aritmetická omezení -• A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) M změna mi n (A) vyvolá pouze změnu mi n (B) a mi n (C) M změna max(A)vyvolá pouze změnu max(B) a max(C) , ... Hana Rudová, Logické programování I, 20. května 2009 228 Algoritmy pro CSP Konzistence mezí a aritmetická omezení -• A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) M změna mi n (A) vyvolá pouze změnu mi n (B) a mi n (C) M změna max(A)vyvolá pouze změnu max(B) a max(C) , ... 3 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, 20. května 2009 228 Algoritmy pro CSP Konzistence mezí a aritmetická omezení A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) M změna mi n (A) vyvolá pouze změnu mi n (B) a mi n (C) M změna max(A)vyvolá pouze změnu max(B) a max(C) , ... Příklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 ^> min(A)=l+2, max(A)=10+2 => A in 3.. 10 => min(B)=l-2, max(B)=10-2 => B in 1..8 Hana Rudová, Logické programování I, 20. května 2009 228 Algoritmy pro CSP Konzistence mezí a aritmetická omezení -• A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) M změna mi n (A) vyvolá pouze změnu mi n (B) a mi n (C) M změna max(A)vyvolá pouze změnu max(B) a max(C) , ... 3 Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 ^> min(A)=l+2, max(A)=10+2 => A in 3.. 10 => min(B)=l-2, max(B)=10-2 => B in 1..8 A #> 5 => mi n (A) =6 => A in 6.. 10 => mi n (B) =6-2 => B in 4.. 8 (nové vyvolání A #= B + 2) Hana Rudová, Logické programování I, 20. května 2009 228 Algoritmy pro CSP Konzistence mezí a aritmetická omezení -• A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) M změna mi n (A) vyvolá pouze změnu mi n (B) a mi n (C) M změna max(A)vyvolá pouze změnu max(B) a max(C) , ... 3 Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 ^> min(A)=l+2, max(A)=10+2 => A in 3.. 10 => min(B)=l-2, max(B)=10-2 => B in 1..8 A #> 5 => mi n (A) =6 => A in 6.. 10 => mi n (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, 20. května 2009 228 Algoritmy pro CSP Konzistence mezí a aritmetická omezení -• A #= B + C => mi n(A) = min(B)+min(C), max(A) = max(B)+max(C) mi n (B) = mi n (A)-max (C) , max (B) = max (A)-mi n (C) mi n(C) = mi n(A)-max(B), max(C) = max(A)-mi n(B) M změna mi n (A) vyvolá pouze změnu mi n (B) a mi n (C) M změna max(A)vyvolá pouze změnu max(B) a max(C) , ... 3 Príklad: A in 1..10, B in 1..10, A #= B + 2, A #> 5, A #\= 8 A #= B + 2 ^> min(A)=l+2, max(A)=10+2 => A in 3.. 10 => min(B)=l-2, max(B)=10-2 => B in 1..8 A #> 5 => mi n (A) =6 => A in 6.. 10 => mi n (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) M Vyzkoušejte si: A #= B - C, A #>= B + C Hana Rudová, Logické programování I, 20. května 2009 228 Algoritmy pro CSP Globální podmínky M Propagace je lokální M pracuje se s jednotlivými podmínkami M interakce mezi podmínkami je pouze přes domény proměnných M Jak dosáhnout více, když je silnější propagace drahá? -• Seskupíme několik podmínek do jedné tzv. globální podmínky -• Propagaci přes globální podmínku řešíme speciálním algoritmem navrženým pro danou podmínku -• Příklady: M all_different omezení: hodnoty všech proměnných různé 3 serialized omezení: rozvržení úloh zadaných startovním časem a dobou trvání tak, aby se nepřekrývaly Hana Rudová, Logické programování I, 20. května 2009 229 Algoritmy pro CSP Propagace pro all_distinct -• U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 Hana Rudová, Logické programování I, 20. května 2009 230 Alg Propagace pro all_distinct -• U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) Hana Rudová, Logické programování I, 20. května 2009 230 Alg Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: \/{Xi,... ,Xk} c V : card{Di u ■ ■ ■ u D^} > k Hana Rudová, Logické programování I, 20. května 2009 230 Alg Propagace pro all_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: \/{Xi,... ,Xk} c V : card{Di u ■ ■ ■ u D^} > k stačí hledat Halluv interval ľ. velikost intervalu /je rovna počtu proměnných, jejichž doména je v I Hana Rudová, Logické programování I, 20. května 2009 230 Alg Propagace pro a~N_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: \/{Xi,... ,Xk} c V : card{D\ u ■ ■ ■ u D^} > k stačí hledat Halluv interval ľ. velikost intervalu /je rovna počtu proměnných, jejichž doména je v I Inferenční pravidlo M U = {Xu ... ,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, 20. května 2009 230 Algoritmy pro CSP Propagace pro all_distinct -• U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) -• Konzistence: \/{Xi,... ,Xk} c V : card{D\ u ■ ■ ■ u D^} > k stačí hledat Halluv interval ľ. velikost intervalu /je rovna počtu proměnných, jejichž doména je v I -• Inferenční pravidlo M U = {Xu ... ,Xk], dom(U) = {Di u ■ ■ ■ u Dk] 3 card(U) = card(dom(U)) => Vv g dom{U),\/X g (V - U),X + v M 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, 20. května 2009 230 Algoritmy pro CSP Propagace pro a~N_distinct U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) Konzistence: \/{Xi,... ,Xk} c V : card{D\ u ■ ■ ■ u D^} > k stačí hledat Hallův interval ľ. velikost intervalu /je rovna počtu proměnných, jejichž doména je v I Inferenční pravidlo M U = {Xu ... ,Xk], dom(U) = {Di u ■ ■ ■ u Dk] 3 card(U) = card(dom(U)) => Vv g dom{U),\/X g (V - U),X + v M 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 Složitost: 0(2n) - hledání všech podmnožin množiny n proměnných (naivní) Hana Rudová, Logické programování I, 20. května 2009 230 Algoritmy pro CSP Propagace pro all_distinct -• U = {X2, X4, X5}, dom(U) = {2, 3, 4}: {2,3,4} nelze pro XI, X3, X6 XI in 5..6, X3 = 5, X6 in {1} \/ (5..6) -• Konzistence: \/{Xi,... ,Xk} c V : card{D\ u ■ ■ ■ u D^} > k stačí hledat Hallův interval ľ. velikost intervalu /je rovna počtu proměnných, jejichž doména je v I -• Inferenční pravidlo M U = {Xu ... ,Xk], dom(U) = {Di u ■ ■ ■ u Dk] 3 card(U) = card(dom(U)) => Vv g dom{U),\/X g (V - U),X + v M hodnoty v Hallově intervalu jsou pro ostatní proměnné nedostupné M Složitost: 0(2n) - hledání všech podmnožin množiny n proměnných (naivní) 0(n\ogn) - kontrola hraničních bodů Hallových intervalů (1998) Hana Rudová, Logické programování I, 20. května 2009 230 Algoritmy pro CSP učitel min max Jan 3 6 Petr 4 Anna 2 5 Ota 4 Eva 4 Marie 1 6 Prohledávání + konzistence -• Splňování podmínek prohledáváním prostoru řešení M podmínky jsou užívány pasivně jako test -• přiřazuji hodnoty proměnných a zkouším co se stane M vestavěný prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj Hana Rudová, Logické programování I, 20. května 2009 231 Algoritmy pro CSP Prohledávání + konzistence -• Splňování podmínek prohledáváním prostoru řešení M podmínky jsou užívány pasivně jako test -• přiřazuji hodnoty proměnných a zkouším co se stane M vestavěný prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj M úplná metoda (nalezneme řešení nebo dokážeme jeho neexistenci) M zbytečně pomalé (exponenciální): procházím i „evidentně" špatná ohodnocení Hana Rudová, Logické programování I, 20. května 2009 231 Algoritmy pro CSP Prohledávání + konzistence -• Splňování podmínek prohledáváním prostoru řešení M podmínky jsou užívány pasivně jako test -• přiřazuji hodnoty proměnných a zkouším co se stane M vestavěný prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj M úplná metoda (nalezneme řešení nebo dokážeme jeho neexistenci) M zbytečně pomalé (exponenciální): procházím i „evidentně" špatná ohodnocení -• Konzistenční (propagační) techniky M umožňují odstranění nekonzistentních hodnot z domény proměnných -• neúplná metoda (v doméně zůstanou ještě nekonzistentní hodnoty) M relativně rychlé (polynomiální) Hana Rudová, Logické programování I, 20. května 2009 231 Algoritmy pro CSP Prohledávání + konzistence -• Splňování podmínek prohledáváním prostoru řešení M podmínky jsou užívány pasivně jako test -• přiřazuji hodnoty proměnných a zkouším co se stane M vestavěný prohledávací algoritmus Prologu: backtracking, triviální: generuj & testuj M úplná metoda (nalezneme řešení nebo dokážeme jeho neexistenci) M zbytečně pomalé (exponenciální): procházím i „evidentně" špatná ohodnocení -• Konzistenční (propagační) techniky M umožňují odstranění nekonzistentních hodnot z domény proměnných -• neúplná metoda (v doméně zůstanou ještě nekonzistentní hodnoty) M relativně rychlé (polynomiální) -• Používá se kombinace obou metod M postupné přiřazování hodnot proměnným M po přiřazení hodnoty odstranění nekonzistentních hodnot konzistenčními technikami Hana Rudová, Logické programování I, 20. května 2009 231 Algoritmy pro CSP Prohledávání do hloubky -• Základní prohledávací algoritmus pro problémy splňování podmínek -• Prohledávání stavového prostoru do hloubky (depth first search) M Dvě fáze prohledávání s navracením -• dopredná fáze: proměnné jsou postupně vybírány, rozšiřuje se částečné řešení přiřazením konzistení hodnoty (pokud existuje) další proměnné po vybrání hodnoty testujeme konzistenci M zpětná fáze: pokud neexistuje konzistentní hodnota pro aktuální proměnnou, algoritmus se vrací k předchozí přiřazené hodnotě Hana Rudová, Logické programování I, 20. května 2009 232 Algoritmy pro CSP Prohledávání do hloubky -• Základní prohledávací algoritmus pro problémy splňování podmínek -• Prohledávání stavového prostoru do hloubky (depth first search) M Dvě fáze prohledávání s navracením -• dopredná fáze: proměnné jsou postupně vybírány, rozšiřuje se částečné řešení přiřazením konzistení hodnoty (pokud existuje) další proměnné po vybrání hodnoty testujeme konzistenci M zpětná fáze: pokud neexistuje konzistentní hodnota pro aktuální proměnnou, algoritmus se vrací k předchozí přiřazené hodnotě M Proměnné dělíme na 3 minulé - proměnné, které už byly vybrány (a mají přiřazenu hodnotu) M aktuální- proměnná, která je právě vybrána a je jí přiřazována hodnota M budoucí - proměnné, které budou vybrány v budoucnosti Hana Rudová, Logické programování I, 20. května 2009 232 Algoritmy pro CSP Základní algoritmus prohledávání do hloubky M Pro jednoduchost proměnné očíslujeme a ohodnocujeme je v daném pořadí -• Na začátku voláno jako labeling(G,l) proceduře labeling(G,a) if a > |uzly(G)| then return uzly(G) for y x g Da do if consistent(G,a) then % consistent(G,a) je nahrazeno FC(G,a), LA(G,a), R := labeling(G,a +1) if R ^ fail then return R return fail end labeling Po přiřazení všech proměnných vrátíme jejich ohodnocení -• Procedury consistent uvedeme pouze pro binární podmínky Hana Rudová, Logické programování I, 20. května 2009 233 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í proměnné 3 Backtracking tedy zajišťuje konzistenci podmínek M na všech minulých proměnných -• na podmínkách mezi minulými proměnnými a aktuální proměnnou Hana Rudová, Logické programování I, 20. května 2009 234 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í proměnné 3 Backtracking tedy zajišťuje konzistenci podmínek M na všech minulých proměnných -• na podmínkách mezi minulými proměnnými a aktuální proměnnou -• procedure BT(G,a) Q:={(Vú V a) £ hrany(G) , í < a] % hrany vedoucí z minulých proměnných do aktuální Consistent := true while Q neni prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q Consistent := not revise^,Vm) % pokud vyřadíme prvek, bude doména prázdná return Consistent end BT Hana Rudová, Logické programování I, 20. května 2009 234 Algoritmy pro CSP Příklad: backtracking Omezení: Vi, V2, V3 in 1... 3, Vi# = 3 x V3 Stavový prostor červené čtverečky: chybný pokus o instanciaci, řešení neexistuje nevyplněná kolečka: nalezeno řešení černá kolečka: vnitřní uzel, máme pouze částečné přiřazení Hana Rudová, Logické programování I, 20. května 2009 235 Algoritmy pro CSP Kontrola dopředu (FC - forward checking) M FC je rozšíření backtrackingu M FC navíc zajišťuje konzistenci mezi aktuální proměnnou a budoucími proměnnými, které jsou s ní spojeny dosud nesplněnými podmínkami Hana Rudová, Logické programování I, 20. května 2009 236 Algoritmy pro CSP Kontrola dopředu (FC - forward checking) M FC je rozšíření backtrackingu M FC navíc zajišťuje konzistenci mezi aktuální proměnnou a budoucími proměnnými, které jsou s ní spojeny dosud nesplněnými podmínkami M procedure FC(G,a) Q;={(Yi, V a) e hrany(G) , í > a] % přidání hran z budoucích do aktuální proměnné Consistent := true while Q neni prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q if revise((Vfc,Vm)) then Consistent := (|Dfcl>0) % vyprázdnění domény znamená nekonzistenci return Consistent end FC M Hrany z minulých proměnných do aktuální proměnné není nutno testovat Hana Rudová, Logické programování I, 20. května 2009 236 Algoritmy pro CSP Príklad: kontrola dopředu Omezení: Vi,V2, V3 in 1 ...3, c : Vi# = 3 x V3 Stavový prostor: V 1 c => fail c => fail V- V, Hana Rudová, Logické programování I, 20. května 2009 237 Algoritmy pro CSP Pohled dopředu (LA - looking ahead) M LA je rozšíření FC, navíc ověřuje konzistenci hran mezi budoucími proměnnými M procedure LA(G,a) Q := {(Vi,Va) e hrany(G), í > a] % začínáme s hranami do a Consistent := true while Q není prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q if revise((Vfc,ym)) then Q := Q u {(Vi,Vk)\(Vi,Vk) g hrany(G), i ŕ k,i ŕ m,i> a} Consistent := (|Dfcl>0) return Consistent end LA Hana Rudová, Logické programování I, 20. května 2009 238 Algoritmy pro CSP Pohled dopředu (LA - looking ahead) M LA je rozšíření FC, navíc ověřuje konzistenci hran mezi budoucími proměnnými M procedure LA(G,a) Q := {(Vi,Va) e hrany(G), í > a] % začínáme s hranami do a Consistent := true while Q neni prázdná a Consistent do vyber a smaž libovolnou hranu (Vk,Vm) z Q if revise((Vfc,ym)) then Q := Q u {(Vi,Vk)\(Vi,Vk) e hrany(G), i ŕ k,i ŕ m,i> a} Consistent := (|Dfcl>0) return Consistent end LA -• Hrany z minulých proměnných do aktuální proměnné opět netestujeme 3 Tato LA procedura je založena na AC-3, lze použít i jiné AC algoritmy -• LA udržuje hranovou konzistenci: protože ale LA(G,a) používá AC-3, musíme zajistit iniciální konzistenci pomocí AC-3 ještě před startem prohledávání Hana Rudová, Logické programování I, 20. května 2009 238 Algoritmy pro CSP Příklad: pohled dopředu (pomocí AC-3) Omezení: Ví, V2, V3 in 1... 4, c\ : Vi# > V2, c2:V2#=3x V3 Stavový prostor (spouští se iniciální konzistence se před startem prohledávání) i , d => V1 in 2..4 V2in 1..3 c2=>V2=3 V3=1 d => V1= 4 1 4< » 2 3. ► 3 1c S Hana Rudová, Logické programování I, 20. května 2009 239 Algoritmy pro CSP Príklad: pohled dopředu pomocí AC-1 Omezení: Vi,V2,V3 in 1...4, cl:Vi#>V2, c2:V2#=3xV3 Stavový prostor, pokud bychom použili místo AC-3 algoritmus AC-1 M iniciální konzistence se před startem prohledávání nespouští -• algorimus AC-1 opakuje revize všech hran, dokud se změnila doména alespoň jedné proměnné => AC-1 vynutí hranovou konzistenci, jakmile je přiřazena hodnota aktuální proměnné V- c1 = V, > fail c1 => V2=1 c1 c2 => fail c2 :>V2=1..2 :> fail 4 d c2 :>V2=1..3 :>V2=3 V3=1 V. Hana Rudová, Logické programování I, 20. května 2009 Ó 240 Algoritmy pro CSP Přehled algoritmů Backtracking (BT) kontroluje v kroku a podmínky c(Vi,Va),...,c(Va_i,Va) z minulých proměnných do aktuální proměnné proměnné C N ^ CD aktuálni ? CD Š-"š o =^ C Q) O N ^ CD CD Hana Rudová, Logické programování I, 20. května 2009 241 Algoritmy pro CSP Přehled algoritmů Backtracking (BT) kontroluje v kroku a podmínky c(Vi,Va),...,c(Va_i,Va) z minulých proměnných do aktuální proměnné BT Kontrola dopředu (FC) kontroluje v kroku a podmínky c(Va+i,Va),---,c(Vn,Va) z budoucích proměnných do aktuální proměnné proměnné C N Ä =3 ^ CD aktuálni £" CD Š-"š o =v C Q) O N C^ CD CD Hana Rudová, Logické programování I, 20. května 2009 241 Algoritmy pro CSP Přehled algoritmů Backtracking (BT) kontroluje v kroku a podmínky c(Vi,Va),...,c(Va_i,Va) z minulých proměnných do aktuální proměnné BT Kontrola dopředu (FC) kontroluje v kroku a podmínky c(Va+i,Va),---,c(Vn,Va) z budoucích proměnných do aktuální proměnné Pohled dopředu (LA) kontroluje v kroku a podmínky Ví(a< l 10. 2. Ukažte, jak je dosaženo hranové konzistence v následujícím příkladu: domain([X,Y,Z],l ,5]), X #< Y, Z#= Y+l . Hana Rudová, Logické programování I, 20. května 2009 243 Algoritmy pro CSP Implementace Prologu Literatura: M Matýska L, Toman D.: Implementační techniky Prologu, Informační systémy, (1 990), 21-59. http://www.i es.muni.cz/people/matyska/vyuka/1p/l p.html Opakování: základní pojmy M Konečná množina klauzulí Hlava :- Tělo tvoří program P. -• Hlava je literal M Tělo je (eventuálně prázdná) konjunkce literálů Ti,...Ta, a> 0 M Literal je tvořen m-árním predikátovým symbolem (m/p) a m termy (argumenty) -• Term je konstanta, proměnná nebo složený term. -• Složený term s n termy na místě argumentů -• Dotaz (cíl) je neprázdná množina literálů. Hana Rudová, Logické programování I, 20. května 2009 245 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literály těla. Hana Rudová, Logické programování I, 20. května 2009 246 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literalytela. Procedurální (imperativní) sémantika: Entry: Hlava:: { call Ti ■ ■ ■ call Ta } Volání procedury s názvem Hl ava uspěje, pokud uspěje volání všech procedur (literálů) v těle. Hana Rudová, Logické programování I, 20. května 2009 246 Implementace Prologu Interpretace Deklarativní sémantika: Hlava platí, platí-li jednotlivé literalytela. Procedurální (imperativní) sémantika: Entry: Hlava:: { call Ti ■ ■ ■ call Ta } Volání procedury s názvem Hl ava uspěje, pokud uspěje volání všech procedur (literálů) v těle. Procedurální sémantika = podklad pro implementaci Hana Rudová, Logické programování I, 20. května 2009 246 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 : A 0) z programu P takovou, že 3a : A každá instanciace ekvivalentní zdrojovému termu M zdrojový term s proměnnými => dvě instance se mohou lišit aktuálními hodnotami proměnných, jedinečnost zajišťuje kopírování struktur nebo sdílení struktur Hana Rudová, Logické programování I, 20. května 2009 253 Implementace Prologu Príklad a(b(X),c(X,Y),d) Kopírování struktur FUNCT a/3 REF REF CONST d FUNCT c/2 REF FREE Y FUNCT b/1 FREEX Hana Rudová, Logické programování I, 20. května 2009 254 Implementace Prologu Kopírování struktur II -• Term F s aritou A reprezentován A+l slovy: M funktor a arita v prvním slově M 2. slovo nese první argument (resp. odkaz na jeho hodnotu) i M A+l slovo nese hodnotu A-tého argumentu -• Reprezentace vychází z orientovaných acyklických grafů: a/3 d t c/2 Y b/1 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, 20. května 2009 255 Implementace Prologu Sdílení struktur M Vychází z myšlenky, že při reprezentaci je třeba řešit přítomnost proměnných -• Instance termu < kostra_termu; rámec > -• kostra_termu je zdrojový term s očíslovanými proměnnými M rámec je vektor aktuálních hodnot těchto proměnných A í-tá položka nese hodnotu í-té proměnné v původním termu Hana Rudová, Logické programování I, 20. května 2009 256 Implementace Prologu Sdílení struktur II Příklad: a(b(X),c(X,Y),d) reprezentuje < a(b($l),c($l,$2),d) ; [FREE, FREE] > kde symbolem $i označujeme í-tou proměnnou. Hana Rudová, Logické programování I, 20. května 2009 257 Implementace Prologu Sdílení struktur II Příklad: a(b(X),c(X,Y),d) reprezentuje < a(b($l),c($l,$2),d) ; [FREE, FREE] > kde symbolem $i označujeme í-tou proměnnou. Implementace: < &kostra_termu; &rámec > (& vrací adresu objektu) Všechny instance sdílí společnou kostru_termu => sdílení struktur Hana Rudová, Logické programování I, 20. května 2009 257 Implementace Prologu Srovnání: příklad -• Naivní srovnání: sdílení paměťově méně náročné Hana Rudová, Logické programování I, 20. května 2009 258 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 přítomné ve zdrojovém kódu Hana Rudová, Logické programování I, 20. května 2009 258 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 přítomné ve zdrojovém kódu M Postupná tvorba termů: A = a(K,L,M), K = b(X), L = c(X,Y), M = d 3 Sdílení termů: A kostra_a A 1/ kostra_b i\ L - M:d —►■ kostra_c Hana Rudová, Logické programování I, 20. května 2009 258 I Srovnání: příklad - pokračování -• 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, 20. května 2009 259 Implementace Prologu Srovnání: příklad - pokračování -• 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 tj. identické jako přímé vytvoření termu a(b(X) ,c(X,Y) ,d) Hana Rudová, Logické programování I, 20. května 2009 259 Implementace Prologu Srovnání II -• Složitost algoritmů pro přístup k jednotlivým argumentům 3 sdílení struktur: nutná víceúrovňová nepřímá adresace M kopírování struktur: bez problémů 3 jednodušší algoritmy usnadňují i optimalizace Hana Rudová, Logické programování I, 20. května 2009 260 Implementace Prologu Srovnání II -• Složitost algoritmů pro přístup k jednotlivým argumentům 3 sdílení struktur: nutná víceúrovňová nepřímá adresace M kopírování struktur: bez problémů 3 jednodušší algoritmy usnadňují i optimalizace -• Lokalita přístupů do paměti -• sdílení struktur: přístupy rozptýleny po paměti -• kopírování struktur: lokalizované přístupy 3 při stránkování paměti - rozptýlení vyžaduje přístup k více stránkám Hana Rudová, Logické programování I, 20. května 2009 260 Implementace Prologu Srovnání II -• Složitost algoritmů pro přístup k jednotlivým argumentům 3 sdílení struktur: nutná víceúrovňová nepřímá adresace M kopírování struktur: bez problémů 3 jednodušší algoritmy usnadňují i optimalizace -• Lokalita přístupů do paměti -• sdílení struktur: přístupy rozptýleny po paměti -• kopírování struktur: lokalizované přístupy 3 při stránkování paměti - rozptýlení vyžaduje přístup k více stránkám 3 Z praktického hlediska neexistuje mezi těmito přístupy zásadní rozdíl Hana Rudová, Logické programování I, 20. května 2009 260 Implementace Prologu Řízení výpočtu -• Dopřed ný výpočet -• po úspěchu (úspěšná redukce) -i* jednotlivá volání procedur skončí úspěchem •• klasické volání rekurzivních procedur Hana Rudová, Logické programování I, 20. května 2009 261 Implementace Prologu Řízení výpočtu -• Dopřed ný výpočet -• po úspěchu (úspěšná redukce) -i* jednotlivá volání procedur skončí úspěchem •• klasické volání rekurzivních procedur -• Zpětný výpočet (backtracking) M po neúspěchu vyhodnocení literalu (neúspěšná redukce) A nepodaří se unifikace aktuálních a formálních parametrů hlavy •• návrat do bodu, kde zůstala nevyzkoušená alternativa výpočtu St je nutná obnova původních hodnot jednotlivých proměnných po nalezení místa s dosud nevyzkoušenou klauzulí pokračuje dále dopředný výpočet Hana Rudová, Logické programování I, 20. května 2009 261 Implementace Prologu Aktivační záznam -• Volání (=aktivace) procedury -• Aktivace sdílí společný kód, liší se obsahem aktivačního záznamu -• Aktivační záznam uložen na lokálním zásobníku Hana Rudová, Logické programování I, 20. května 2009 262 Implementace Prologu Aktivační záznam -• Volání (=aktivace) procedury -• Aktivace sdílí společný kód, liší se obsahem aktivačního záznamu -• Aktivační záznam uložen na lokálním zásobníku -• Dopředný výpočet 3 stav výpočtu v okamžiku volání procedury 3 aktuální parametry 3 lokální proměnné 3 pomocné proměnné ('a la registry) Hana Rudová, Logické programování I, 20. května 2009 262 Implementace Prologu Aktivační záznam -• Volání (=aktivace) procedury -• Aktivace sdílí společný kód, liší se obsahem aktivačního záznamu -• Aktivační záznam uložen na lokálním zásobníku -• Dopředný výpočet 3 stav výpočtu v okamžiku volání procedury 3 aktuální parametry 3 lokální proměnné 3 pomocné proměnné ('a la registry) M Zpětný výpočet (backtracking) M hodnoty parametrů v okamžiku zavolání procedury M následující klauzule pro zpracování při neúspěchu Hana Rudová, Logické programování I, 20. května 2009 262 Implementace Prologu Aktivační záznam a roll-back -• Neúspěšná klauzule mohla nainstanciovat nelokální proměnné M a(X) :- X = b(c,Y), Y = d. ?- W = b(Z,e), a(W). Hana Rudová, Logické programování I, 20. května 2009 263 Implementace Prologu Aktivační záznam a roll-back -• Neúspěšná klauzule mohla nainstanciovat nelokální proměnné M a(X) :- X = b(c,Y), Y = d. ?- W = b(Z,e), a(W) . (viz instanciace Z) Hana Rudová, Logické programování I, 20. května 2009 263 Implementace Prologu Aktivační záznam a roll-back -• Neúspěšná klauzule mohla nainstanciovat nelokální proměnné M a(X) :- X = b(c,Y), Y = d. ?- W = b(Z,e), a(W) . (viz instanciace Z) -• Při návratu je třeba obnovit (roll-back) původní hodnoty proměnných -• Využijeme vlastností logických proměnných 3 instanciovat lze pouze volnou proměnnou M jakmile proměnná získá hodnotu, nelze ji změnit jinak než návratem výpočtu => původní hodnoty všech proměnných odpovídají volné proměnné Hana Rudová, Logické programování I, 20. května 2009 263 Implementace Prologu Aktivační záznam a roll-back -• Neúspěšná klauzule mohla nainstanciovat nelokální proměnné M a(X) :- X = b(c,Y), Y = d. ?- W = b(Z,e), a(W) . (viz instanciace Z) -• Při návratu je třeba obnovit (roll-back) původní hodnoty proměnných -• Využijeme vlastností logických proměnných 3 instanciovat lze pouze volnou proměnnou M jakmile proměnná získá hodnotu, nelze ji změnit jinak než návratem výpočtu => původní hodnoty všech proměnných odpovídají volné proměnné -• Stopa (trail): zásobník s adresami instanciovaných proměnných * ukazatel na aktuální vrchol zásobníku uchováván v aktivačním záznamu M při neúspěchu jsou hodnoty proměnných na stopě v úseku mezi aktuálním a uloženým vrcholem zásobníku změněny na „volná" Hana Rudová, Logické programování I, 20. května 2009 263 Implementace Prologu Aktivační záznam a roll-back -• Neúspěšná klauzule mohla nainstanciovat nelokální proměnné M a(X) :- X = b(c,Y), Y = d. ?- W = b(Z,e), a(W) . (viz instanciace Z) -• Při návratu je třeba obnovit (roll-back) původní hodnoty proměnných -• Využijeme vlastností logických proměnných 3 instanciovat lze pouze volnou proměnnou M jakmile proměnná získá hodnotu, nelze ji změnit jinak než návratem výpočtu => původní hodnoty všech proměnných odpovídají volné proměnné -• Stopa (trail): zásobník s adresami instanciovaných proměnných * ukazatel na aktuální vrchol zásobníku uchováván v aktivačním záznamu M při neúspěchu jsou hodnoty proměnných na stopě v úseku mezi aktuálním a uloženým vrcholem zásobníku změněny na „volná" -• Globální zásobník: pro uložení složených termů M ukazatel na aktuální vrchol zásobníku uchováván v aktivačním záznamu M při neúspěchu vrchol zásobníku snížen podle uschované hodnoty v aktivačním záznamu Hana Rudová, Logické programování I, 20. května 2009 263 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: -• okolí (environment) - informace nutné pro dopředný běh programu M bod volby (choice point) - informace nezbytné pro zotavení po neúspěchu Hana Rudová, Logické programování I, 20. května 2009 264 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: -• okolí (environment) - informace nutné pro dopředný 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 -• samostatně provázány (odkaz na předchozí okolí resp. bod volby) Hana Rudová, Logické programování I, 20. května 2009 264 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: -• okolí (environment) - informace nutné pro dopředný 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 -• samostatně provázány (odkaz na předchozí okolí resp. bod volby) Důsledky: -• samostatná práce s každou částí aktivačního záznamu (optimalizace) Hana Rudová, Logické programování I, 20. května 2009 264 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: -• okolí (environment) - informace nutné pro dopředný 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 -• samostatně provázány (odkaz na předchozí okolí resp. bod volby) Důsledky: -• samostatná práce s každou částí aktivačního záznamu (optimalizace) -• alokace pouze okolí pro deterministické procedury Hana Rudová, Logické programování I, 20. května 2009 264 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: -• okolí (environment) - informace nutné pro dopředný 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 -• samostatně provázány (odkaz na předchozí okolí resp. bod volby) Důsledky: -• samostatná práce s každou částí aktivačního záznamu (optimalizace) -• alokace pouze okolí pro deterministické procedury -• možnost odstranění okolí po úspěšném vykonání (i nedeterministické) procedury (pokud okolí následuje po bodu volby dané procedury) M pokud je okolí na vrcholu zásobníku Hana Rudová, Logické programování I, 20. května 2009 264 Implementace Prologu Řez -• Prostředek pro ovlivnění běhu výpočtu programátorem -• a(X) :- b(X), !, c(X). a(3). b(l). b(2). cd). c(2). Hana Rudová, Logické programování I, 20. května 2009 265 Implementace Prologu Řez -• Prostředek pro ovlivnění běhu výpočtu programátorem -• a(X) :- b(X), !, c(X). a(3). b(l). b(2). cd). c(2). M Řez: neovlivňuje dopředný výpočet, má vliv pouze na zpětný výpočet M Odstranění alternativních větví výpočtu => odstranění odpovídajících bodů volby M tj. odstranění bodů volby mezi současným vrcholem zásobníku a bodem volby procedury, která řez vyvolala (včetně bodu volby procedury s řezem) => změna ukazatele na „nejmladší" bod volby Hana Rudová, Logické programování I, 20. května 2009 265 Implementace Prologu Řez -• Prostředek pro ovlivnění běhu výpočtu programátorem -• a(X) :- b(X), !, c(X). a(3). b(l). b(2). cd). c(2). M Řez: neovlivňuje dopředný výpočet, má vliv pouze na zpětný výpočet M Odstranění alternativních větví výpočtu => odstranění odpovídajících bodů volby M tj. odstranění bodů volby mezi současným vrcholem zásobníku a bodem volby procedury, která řez vyvolala (včetně bodu volby procedury s řezem) => změna ukazatele na „nejmladší" bod volby => Vytváření deterministických procedur => Optimalizace využití zásobníku Hana Rudová, Logické programování I, 20. května 2009 265 Implementace Prologu Interpret Prologu Základní principy: -• klauzule uloženy jako termy -• programová databáze M pro uložení klauzulí M má charakter haldy přidej všechny literaly klauzule k cíli („doleva", tj. na místo redukovaného literalu). Tělo prázdné => výpočet se s úspěchem vrací do klauzule, jejíž adresa je v aktuálním okolí. 7. Neúspěch unifikace => z bodu volby se obnoví stav a pokračuje se v hledání další vhodné klauzule v databázi. Hana Rudová, Logické programování I, 20. května 2009 267 Implementace Prologu 03 Interpret - Základní princip 1. Vyber redukovaný literal („první", tj. nejlevější literal cíle) 2. Lineárním průchodem od začátku databáze najdi klauzuli, jejíž hlava má stejný funktor a stejný počet argumentů jako redukovaný literal 3. V případě nalezení klauzule založ bod volby procedury 4. Založ dále okolí první klauzule (velikost odvozena od počtu lokálních proměnných v klauzuli) 5. Proveď unifikaci literalu a hlavy klauzule 6. Úspěch => přidej všechny literaly klauzule k cíli („doleva", tj. na místo redukovaného literalu). Tělo prázdné => výpočet se s úspěchem vrací do klauzule, jejíž adresa je v aktuálním okolí. 7. Neúspěch unifikace => z bodu volby se obnoví stav a pokračuje se v hledání další vhodné klauzule v databázi. 8. Pokud není nalezena odpovídající klauzule, výpočet se vrací na předchozí bod volby (krátí se lokální i globální zásobník). 9. Výpočet končí neúspěchem: neexistuje již bod volby, k němuž by se výpočet mohl vrátit. 1 0. Výpočet končí úspěchem, jsou-li úspěšně redukovány všechny literaly v cíli. Hana Rudová, Logické programování I, 20. května 2009 267 Implementace Prologu 03 Interpret - vlastnosti -• Lokální i globální zásobník -• při dopředném výpočtu roste M při zpětném výpočtu se zmenšuje Lokální zásobník se může zmenšit při dopředném úspěšném výpočtu deterministické procedury. Hana Rudová, Logické programování I, 20. května 2009 268 Implementace Prologu Interpret - vlastnosti -• Lokální i globální zásobník -• při dopředném výpočtu roste M při zpětném výpočtu se zmenšuje Lokální zásobník se může zmenšit při dopředném úspěšném výpočtu deterministické procedury. -• Unifikace argumentů hlavy - obecný unifikační algoritmus Současně poznačí adresy instanciovaných proměnných na stopu. Hana Rudová, Logické programování I, 20. května 2009 268 Implementace Prologu Interpret - vlastnosti -• Lokální i globální zásobník -• při dopředném výpočtu roste M při zpětném výpočtu se zmenšuje Lokální zásobník se může zmenšit při dopředném úspěšném výpočtu deterministické procedury. -• Unifikace argumentů hlavy - obecný unifikační algoritmus Současně poznačí adresy instanciovanych proměnných na stopu. -• „Interpret": interpret(Query, Vars) :- call(Query), success(Query, Vars). interpret(_,_) :- failure. 3 dotaz vsazen do kontextu této speciální nedeterministické procedury -• tato procedura odpovídá za korektní reakci systému v případě úspěchu i neúspěchu Hana Rudová, Logické programování I, 20. května 2009 268 Implementace Prologu Optimalizace: Indexace M Zřetězení klauzulí podle pořadí načtení velmi neefektivní -• Provázání klauzulí se stejným funktorem a aritou hlavy (tvoří jednu proceduru) 3 tj., indexace procedur -• Hash tabulka pro vyhledání první klauzule -• Možno rozhodnout (parciálně) determinismus procedury Hana Rudová, Logické programování I, 20. května 2009 269 Implementace Prologu Indexace argumentů a(l) :- q(l). a(a) :- b(X). a([A|T]) :- c(A,T). -• Obecně nedeterministická -• Při volání s alespoň částečně instanciovaným argumentem vždy deterministická (pouze jedna klauzule může uspět) Hana Rudová, Logické programování I, 20. května 2009 270 Implementace Prologu Indexace argumentů a(l) :- q(l). a(a) :- b(X). a([A|T]) :- c(A,T). -• Obecně nedeterministická -• Při volání s alespoň částečně instanciovaným argumentem vždy deterministická (pouze jedna klauzule může uspět) -• Indexace podle prvního argumentu Základní typy zřetězení: M podle pořadí klauzulí (aktuální argument je volná proměnná) -• dle konstant (aktuální je argument konstanta) M formální argument je seznam (aktuální argument je seznam) «• dle struktur (aktuální argument je struktura) Hana Rudová, Logické programování I, 20. května 2009 270 Implementace Prologu Indexace argumentů II -• Složitější indexační techniky M podle všech argumentů 3 podle nejvíce diskriminujícího argumentu M kombinace argumentů (indexové techniky z databází) -i* zejména pro přístup k faktům Hana Rudová, Logické programování I, 20. května 2009 271 Tail Recursion Optimization, TRO Iterace prováděna pomocí rekurze => lineární paměťová náročnost cyklů Hana Rudová, Logické programování I, 20. května 2009 272 Implementace Prologu Tail Recursion Optimization, TRO Iterace prováděna pomocí rekurze => lineární paměťová náročnost cyklů Optimalizace koncové rekurze (Tail Recursion Optimisation), TRO: Okolí se odstraní před rekurzivním voláním posledního literálu klauzule, pokud je klauzule resp. její volání deterministické. Řízení se nemusí vracet: -• v případě úspěchu se rovnou pokračuje -• v případě neúspěchu se vrací na předchozí bod volby („nad" aktuální klauzulí) M aktuální klauzule nemá dle předpokladu bod volby Rekurzivně volaná klauzule může být volána přímo z kontextu volající klauzule. Hana Rudová, Logické programování I, 20. května 2009 272 Implementace Prologu 63 TRO - pří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, 20. května 2009 273 Implementace Prologu TRO - pří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 rekurzivně 4krát -• bez TRO: 4 okolí, lineární paměťová náročnost M s TRO: 1 okolí, konstatní paměťová náročnost Hana Rudová, Logické programování I, 20. května 2009 273 Implementace Prologu Optimalizace posledního volání TRO pouze speciální případ obecné optimalizace posledního volání (Last Call Optimization), LCO Hana Rudová, Logické programování I, 20. května 2009 274 Implementace Prologu Optimalizace posledního volání TRO pouze speciální případ obecné optimalizace posledního volání (Last Call Optimization), LCO Okolí (před redukcí posledního literálu) odstraňováno vždy, když leží na vrcholu zásobníku. Hana Rudová, Logické programování I, 20. května 2009 274 Implementace Prologu Optimalizace posledního volání TRO pouze speciální případ obecné optimalizace posledního volání (Last Call Optimization), LCO Okolí (před redukcí posledního literálu) odstraňováno vždy, když leží na vrcholu zásobníku. Nutné úpravy interpretu -• disciplina směrování ukazatelů M vždy „mladší" ukazuje na „starší" („mladší" budou odstraněny dříve) M z lokálního do globálního zásobníku vyhneme se vzniku „visících odkazů" při předčasném odstranění okolí Hana Rudová, Logické programování I, 20. května 2009 274 Implementace Prologu Optimalizace posledního volání TRO pouze speciální případ obecné optimalizace posledního volání (Last Call Optimization), LCO Okolí (před redukcí posledního literálu) odstraňováno vždy, když leží na vrcholu zásobníku. Nutné úpravy interpretu -• disciplina směrování ukazatelů M vždy „mladší" ukazuje na „starší" („mladší" budou odstraněny dříve) M z lokálního do globálního zásobníku vyhneme se vzniku „visících odkazů" při předčasném odstranění okolí M „globalizace" lokálních proměnných: lokální proměnné posledního literálu M nutno přesunout na globální zásobník -• pouze pro neinstanciované proměnné Hana Rudová, Logické programování I, 20. května 2009 274 Implementace Prologu Překlad Překlad -• Motivace: 3 dosažení vyšší míry optimalizace 3 kompaktní kód 3 částečná nezávislost na hardware Hana Rudová, Logické programování I, 20. května 2009 276 Preklad Překlad -• Motivace: 3 dosažení vyšší míry optimalizace 3 kompaktní kód 3 částečná nezávislost na hardware -• Etapy překladu: 1. zdrojový text => kód abstraktního počítače 2. kód abstraktního počítače => kód (instrukce) cílového počítače Hana Rudová, Logické programování I, 20. května 2009 276 Překlad -• Motivace: 3 dosažení vyšší míry optimalizace 3 kompaktní kód 3 částečná nezávislost na hardware -• Etapy překladu: 1. zdrojový text => kód abstraktního počítače 2. kód abstraktního počítače => kód (instrukce) cílového počítače -• Výhody: 3 snazší přenos jazyka (nutno přepsat jen druhou část) -• kód abstraktního počítače možno navrhnout s ohledem na jednoduchost překladu; prostor pro strojově nezávislou optimalizaci Hana Rudová, Logické programování I, 20. května 2009 276 Preklad Překlad -• Motivace: 3 dosažení vyšší míry optimalizace 3 kompaktní kód 3 částečná nezávislost na hardware -• Etapy překladu: 1. zdrojový text => kód abstraktního počítače 2. kód abstraktního počítače => kód (instrukce) cílového počítače -• Výhody: 3 snazší přenos jazyka (nutno přepsat jen druhou část) -• kód abstraktního počítače možno navrhnout s ohledem na jednoduchost překladu; prostor pro strojově nezávislou optimalizaci -• Překlad Prologu založen na principu existence abstraktního počítače V dalším se věnujeme jeho odvození a vlastnostem Hana Rudová, Logické programování I, 20. května 2009 276 Preklad Parciální vyhodnocení -• Jak navrhnout Warrenův abstraktní počítač? M prostřednictvím parciálního vyhodnocení -• Parciální vyhodnocení -• forma zpracování programu, tzv. transformace na úrovni zdrojového kódu M dosazení známých hodnot vstupních parametrů a vyhodnocení všech operací nad nimi -i* příklad: vyhodnocení aritmetických výrazů nad konstantami Hana Rudová, Logické programování I, 20. května 2009 277 Parciální vyhodnocení - příklad a(X,Y) :- b(X), c(X,Y). a(X,Y) :- b(Y), c(Y,X). b(l). b(2). b(3). b(4). c(l,2). c(l,3). c(l,4). c(2,3). c(2,4). c(3,4). Dotaz ?- a(2,Z). Hana Rudová, Logické programování I, 20. května 2009 278 Preklad Parciální vyhodnocení - příklad a(X,Y) :- b(X), c(X,Y). a(X,Y) :- b(Y), c(Y,X). b(l). b(2). b(3). b(4). c(l,2). c(l,3). c(l,4). c(2,3). c(2,4). c(3,4). Dotaz ?- a(2,Z). lze společně s uvedeným programem parciálně vyhodnotit na nový program a'(3). a'(4). a'(l). a nový dotaz ?- a'(Z). Hana Rudová, Logické programování I, 20. května 2009 278 Preklad Parciální vyhodnocení - příklad a(X,Y) :- b(X), c(X,Y). a(X,Y) :- b(Y), c(Y,X). b(l). b(2). b(3). b(4). c(l,2). c(l,3). c(l,4). c(2,3). c(2,4). c(3,4). Dotaz ?- a(2,Z). lze společně s uvedeným programem parciálně vyhodnotit na nový program a'(3). a'(4). a'(l). a nový dotaz ?- a'(Z). Je evidentní, že dotaz nad parciálně vyhodnoceným programem bude zpracován mnohem rychleji (efektivněji) než v případě původního programu. Hana Rudová, Logické programování I, 20. května 2009 278 Preklad Parciální vyhodnocení II Konstrukce překladače: parciálním vyhodnocením interpretu Problémy: -• příliš složitá operace M vyhodnocení se musí provést vždy znovu pro každý nový program -• výsledný program příliš rozsáhlý -• nedostatečná dekompozice -• zejména při použití zdrojového jazyka jako implementačního jazyka interpretu Hana Rudová, Logické programování I, 20. května 2009 279 Preklad Parciální vyhodnocení II Konstrukce překladače: parciálním vyhodnocením interpretu Problémy: -• příliš složitá operace M vyhodnocení se musí provést vždy znovu pro každý nový program -• výsledný program příliš rozsáhlý -• nedostatečná dekompozice -• zejména při použití zdrojového jazyka jako implementačního jazyka interpretu Vhodnější: -• využití („ručního") parciálního vyhodnocení pro návrh abstraktního počítače 1. nalezení operací zdrojového jazyka, které lze dekomponovat do jednodušších operací 2. dekomponujeme tak dlouho, až jsou výsledné operace dostatečně jednoduché nebo již neexistují informace pro parciální vyhodnocení Hana Rudová, Logické programování I, 20. května 2009 279 Preklad Parciální vyhodnocení Prologu Cílová operace: unifikace. Důvod: M řízení výpočtu poměrně podrobné i v interpretu M unifikace v interpretu atomickou operací M unifikace v interpretu nahrazuje řadu podstatně jednodušších operací (testy, přiřazení, předání a převzetí parametrů ...) M většina unifikací nevyžaduje obecnou unifikaci a lze je nahradit jednoduššími operacemi Hana Rudová, Logické programování I, 20. května 2009 280 Preklad Parciální vyhodnocení Prologu Cílová operace: unifikace. Důvod: M řízení výpočtu poměrně podrobné i v interpretu M unifikace v interpretu atomickou operací M unifikace v interpretu nahrazuje řadu podstatně jednodušších operací (testy, přiřazení, předání a převzetí parametrů ...) M většina unifikací nevyžaduje obecnou unifikaci a lze je nahradit jednoduššími operacemi Zviditelnění unifikace: transformací zdrojového programu M termy reprezentujeme kopírováním struktur na globálním zásobníku M parametry procedur jsou vždy umístěny na globální zásobník (predikátem put/2) a předávány jsou pouze adresy M formálním parametrem proceduryjsou pouze volné proměnné, které se v hlavě vyskytují pouze jednou M všechny unifikace jsou explicitně zachyceny voláním predikátu unify/2 Hana Rudová, Logické programování I, 20. května 2009 280 Preklad Explicitní unifikace Příklad: append/3 s explicitní unifikací: append(Al, A2, A3) :- unify(Al,[]), | append([],L,L). unify(A2,L), | unify(A3,L). Hana Rudová, Logické programování I, 20. května 2009 281 Preklad Explicitní unifikace Příklad: append/3 s explicitní unifikací: append(Al, A2, A3) append(Al, A2, A3) - unify(Al,[]), unify(A2,L) , unify (A3, L) . - unify(Al,[A|X]), unify(A2,L), unify(A3,[A|Y]), put(X,BI), put(L,B2), put(Y,B3), append(Bl,B2,B3) append([],L,L). append([A|X],L,[A|Y] append(X,L,Y). Hana Rudová, Logické programování I, 20. května 2009 281 Preklad Explicitní unifikace Příklad: append/3 s explicitní unifikací: append(Al, A2, A3) append(Al, A2, A3) - unify(Al,[]), unify(A2,L) , unify (A3, L) . - unify(Al,[A|X]), unify(A2,L), unify(A3,[A|Y]), put(X,BI), put(L,B2), put(Y,B3), append(Bl,B2,B3) append([],L,L). append([A|X],L,[A|Y] append(X,L,Y). Cíl: parciálně vyhodnotit predikáty unify/2 a put/2 Hana Rudová, Logické programování I, 20. května 2009 281 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é proměnné X term T; X musí být volná proměnná. Hana Rudová, Logické programování I, 20. května 2009 282 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é proměnné X term T; X musí být volná proměnná. M predikát repres(A,Tag,V) - uloží do proměnné Tag príznak a do proměnné 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é proměnné. 3 příznak: informace o struktuře součástí objektu volná proměnná FREE, konstanta CONST, celé číslo INT, odkaz REF, složený term FUNCT Hana Rudová, Logické programování I, 20. května 2009 282 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é proměnné X term T; X musí být volná proměnná. M predikát repres(A,Tag,V) - uloží do proměnné Tag príznak a do proměnné 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é proměnné. 3 příznak: informace o struktuře součástí objektu volná proměnná FREE, konstanta CONST, celé číslo INT, odkaz REF, složený term FUNCT -• je-li A adresa a i celočíselná konstanta, pak výraz A+i reprezentuje adresu o i slov vyšší (ukazatelová aritmetika) Hana Rudová, Logické programování I, 20. května 2009 282 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 případy: 1) T je volná proměnná: výsledkem je instanciace unify(A,T) :- var(T), ( var(A), create_var(A) I true ), T := $addr$(A). Hana Rudová, Logické programování I, 20. května 2009 283 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 případy: 1) T je volná proměnná: výsledkem je instanciace unify(A,T) :- var(T), ( var(A), create_var(A) I 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 při pare. překladu. Lze proto přepsat na unify(A,T) :- var(T), unify_var(A,T). kde unify_var/2 vloží do T odkaz nebo založí novou proměnnou. Hana Rudová, Logické programování I, 20. května 2009 283 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, 20. května 2009 284 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. Opět možno přepsat do kompaktního tvaru unify(A,T) :-atomic(T), unify_const(A,T). kde unify_const/2 provede příslušný test nebo přiřazení. Hana Rudová, Logické programování I, 20. května 2009 284 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 argumentů unify(A,T) :-struct(T), functor(T,F,N), unify_struct(F,N,A), T =.. [_|T1], unify_args(Tl,A+1). Predikát unify_struct/3 je analogický výše použitým predikátům unify_var/2 a unify_const/2. Hana Rudová, Logické programování I, 20. května 2009 285 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 argumentů unify(A,T) :-struct(T), functor(T,F,N), unify_struct(F,N,A), T =.. [_|T1], unify_args(Tl,A+1). Predikát unify_struct/3 je analogický výše použitým predikátům unify_var/2 a unify_const/2. Druhá fáze: unify_args([] ,_) . unify_args([T|Tl], A) :-urvi f y (A ,T), unify_args(Tl,A+1). Hana Rudová, Logické programování I, 20. května 2009 285 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, 20. května 2009 286 Preklad put Parametry procedur jsou vždy umístěny na globální zásobník predikátem put/2 a předávány jsou pouze adresy. Predikát put/2 je jednodušší (nikdy nepotřebuje unifikaci) put(T,B) :- is_addr(T,B). %Tjeodkaz put(T,B) :- var(T), % Tje proměnná create_var(B), T := $addr$(B). put(T,B) :- atomic(T), % Tje konstanta create_const(B,T). put(T,B) :- struct(T), % Tje struktura create_struct(B,T). Hana Rudová, Logické programování I, 20. května 2009 287 Preklad První klauzule append/3 Parciální vyhodnocení první klauzule programu append/3 append(Al, A2, A3) :- unify(Al,[]), | append([],L,L). unify(A2,L), | unify(A3,L). | upraví unify(Al,[]) na unify_const(Al, []) unify(A2,L) na L:=$addr$(A2) unify(A3,L) na is_addr(L,T), unification(T,A3) Hana Rudová, Logické programování I, 20. května 2009 288 Preklad První klauzule append/3 Parciální vyhodnocení první klauzule programu append/3 append(Al, A2, A3) :- unify(Al,[]), | append([],L,L). unify(A2,L), | unify(A3,L). | upraví unify(Al,[]) na unify_const(Al, []) 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á přejmenování T na A2 Hana Rudová, Logické programování I, 20. května 2009 288 Preklad První klauzule append/3 Parciální vyhodnocení první klauzule programu append/3 append(Al, A2, A3) :- unify(Al,[]), | append([],L,L). unify(A2,L), | unify(A3,L). | upraví unify(Al,[]) na unify_const(Al, []) 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á přejmenování T na A2 => není nutné vytvářet novou proměnnoutT => stačí provést unification(A2 ,A3) Hana Rudová, Logické programování I, 20. května 2009 288 Preklad Výsledný tvar append/3 append(Al, A2, A3) :-unify_const(Al,[]), unification(A2 ,A3) . append(Al, A2, A3) :- unify_struct('.',2,Al), unify_var(A,Al+l), unify_var(X,Al+2), unify_var(L,A2), unify_struct('.',2,A3), unification(Al+l,A3+l) , unify_var(Y,A3+2), append(Al+2,A2,A3+2). append(Al, A2, A3) :- unify(Al,[]), unify(A2,L), unify(A3,L) append(Al, A2, A3) :- unify(Al,[A|X]), unify(A2,L), unify (A3, [A | Y]), put(X,Bl), put(L,B2), put(Y,B3), append(Bl,B2,B3). Většina původních unifikací převedena na jednodušší operace; unifikace v posledním kroku je nezbytná (důsledkem dvojího výskytu proměnné) Hana Rudová, Logické programování I, 20. května 2009 289 Preklad Jiný příklad a(c,s(f),d,X) :- g(X). Procedurální pseudokod (testy a přiřazení) a kód abstraktního počítače: proceduře a(X,Y,Z,A) is if ( x == 'c' && ( is_struct(Y,'s',1) && first_arg(Y) == 'f ) && Z == 'ď ) then call g(A) else a(Al, A2, A3, A4) :-unify_const(c,Al), unify_struct(s,l,A2), unify_const(f,A2+1) unify_const(d,A3), unify_var(A,A4), g(A4). cal 1 f ai 1 end procedure tj. posloupnost testů jako v procedurálním jazyce Hana Rudová, Logické programování I, 20. května 2009 290 Preklad Jiný příklad a(c,s(f),d,X) :- g(X). Procedurální pseudokod (testy a přiřazení) a kód abstraktního počítače: proceduře a(X,Y,Z,A) is if ( x == 'c' && ( is_struct(Y,'s',1) && first_arg(Y) == 'f ) && Z == 'ď ) then call g(A) else a(Al, A2, A3, A4) :-unify_const(c,Al), unify_struct(s,l,A2), unify_const(f,A2+1) unify_const(d,A3), unify_var(A,A4), g(A4). cal 1 f ai 1 end procedure tj. posloupnost testů jako v procedurálním jazyce Vyzkoušejte si: delete(X, [Y|T], [Y|T1]) :- delete(X, T, TI). Hana Rudová, Logické programování I, 20. května 2009 290 Preklad Warrenův abstraktní počítač, WAM I. Navržen D.H.D. Warrenem v roce 1 983, modifikace do druhé poloviny 80. let Datové oblasti: -• Oblast kódu (programová databáze) -• separátní oblasti pro uživatelský kód (modifikovatelný) a vestavěné predikáty (nemění se) 3 obsahuje rovněž všechny statické objekty (texty atomů a funktorů apod.) -• Lokální zásobník (Stack) M Stopa (Trail) M Globální zásobník n. ha\da(Heap) M Pomocný zásobník (Push Down List, POL) M pracovní paměť abstraktního počítače M použitý v unifikaci, syntaktické analýze apod. Hana Rudová, Logické programování I, 20. května 2009 291 Preklad Rozmístění datových oblastí Příklad konfigurace Halda v A Stopa Zásobník v A PDL Oblast kódu Halda i lokální zásobník musí růst stejným směrem * lze jednoduše porovnat stáří dvou proměnných srovnáním adres využívá se při zabránění vzniku visících odkazů Hana Rudová, Logické programování I, 20. května 2009 292 Preklad Registry WAMu -• Stavové registry: P čitač 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ý při analýze složených termů (Structure pointer) CUT ukazatel na bod volby, na který se řezem zařízne zásobník M Argumentové registry: A1,A2 , . . . (při předávání parametrů n. pracovní registry) -• Registry pro lokální proměnné: Yl, Y2, . . . M abstraktní znázornění lok. proměnných na zásobníku Hana Rudová, Logické programování I, 20. května 2009 293 Preklad Typy instrukcí WAMu -• put instrukce - příprava argumentů před voláním podcíle -• žádná z těchto instrukcí nevolá obecný unifikační algoritmus M get instrukce - unifikace aktuálních a formálních parametrů 3 vykonávají činnost analogickou instrukcím unify u pare. vyhodnocení -• obecná unifikace pouze při get_value M unify instrukce - zpracování složených termů * jednoargumentové instrukce, používají registr S jako druhý argument -• počáteční hodnota S je odkaz na 1 .argument M volání instrukce unify zvětší hodnotu S o jedničku M obecná unifikace pouze při unify_value a unify_local_value M Indexační instrukce - indexace klauzulí a manipulace s body volby -• Instrukce řízení běhu - předávání řízení a explicitní manipulace s okolí Hana Rudová, Logické programování I, 20. května 2009 294 Instrukce pu Příklad: a(X,Y,Z) :- b(f,X,Y,Z) get_var A1,A5 get_var A2,A6 get_var A3,A7 put_const Al,f put_value A2,A5 put_value A3,A6 put_value A4,A7 execute b/4 Hana Rudová, Logické programování I, 20. května 2009 t a get: příklad 295 Preklad Instrukce WAMu get instrukce get_var Ai,Y get_value Ai,Y get_const Ai,C get_ni1 Ai get_struct Ai,F/N get_list Ai put instrukce put_var Ai,Y put_value Ai,Y put_unsafe_value Ai ,Y put_const Ai,C put_ni1 Ai put_struct Ai,F/N put_list Ai unify instrukce unify_var Y unify_value Y unify_local_value Y unify_const C unify_nil unify_void N instrukce řízení allocate deallocate call Proc/N,A execute Proc/N proceed indexační instrukce try_me_else Next retry_me_else Next trust_me_else fail try Next retry Next trust fail cut_last switch_on_term Var,Const,List,Struct save_cut Y switch_on_const Table load_cut Y switch_on_struct Table Hana Rudová, Logické programování I, 20. května 2009 296 Preklad Instrukce unify, get, put -• Větší počet typů objektů -• rozlišeny atomy, čísla, ni 1 = prázdný seznam, seznam speciální druh složeního termu M unify_void umožní přeskočit anonymních proměnné ve složených termech & put_unsafe_val ue pro optimalizaci práce s lokálními proměnnými při TRO 3 a(X) :- b(X,Y), !, a(Y). při TRO nesmí být lokální proměnné posledního literálu (Y) na lokálním zásobníku 3 kompilátor může všechny nebezpečné (unsafe) výskyty lok. proměnných detekovat při překladu (jsou to poslední výskyty lok. proměnných) a generuje složitější instrukce put_unsafe_value, které provádějí test umístění Hana Rudová, Logické programování I, 20. května 2009 297 Preklad Instrukce unify, get, put -• Větší počet typů objektů -• rozlišeny atomy, čísla, ni 1 = prázdný seznam, seznam speciální druh složeního termu M unify_void umožní přeskočit anonymních proměnné ve složených termech & put_unsafe_val ue pro optimalizaci práce s lokálními proměnnými při TRO 3 a(X) :- b(X,Y), !, a(Y). při TRO nesmí být lokální proměnné posledního literálu (Y) na lokálním zásobníku 3 kompilátor může všechny nebezpečné (unsafe) výskyty lok. proměnných detekovat při překladu (jsou to poslední výskyty lok. proměnných) a generuje složitější instrukce put_unsafe_value, které provádějí test umístění -• unify_local_value kvůli TRO jako put_unsafe_value 3 a(X) :- d(X), b(s(Y),X). objekt přístupný přes Y opět nesmí být na lok. zásobníku doba života s/l může být delší než doba života okolí na něž se Y odkazuje M unify_local_value testují umístění a pokud nutné přesouvají objekty na haldu Hana Rudová, Logické programování I, 20. května 2009 297 Preklad WAM - indexace -• Provázání klauzulí: instrukce XX_me_else: M první klauzule: try_me_else; založí bod volby 3 poslední klauzule: trust_me_else; zruší nejmladší bod volby -• ostatní klauzule: retry_me_else; znovu použije nejmladší bod volby po neúspěchu Hana Rudová, Logické programování I, 20. května 2009 298 Preklad WAM - indexace -• Provázání klauzulí: instrukce XX_me_else: M první klauzule: try_me_else; založí bod volby 3 poslední klauzule: trust_me_else; zruší nejmladší bod volby -• ostatní klauzule: retry_me_else; znovu použije nejmladší bod volby po neúspěchu -• Provázání podmnožiny klauzulí (podle argumentu): «• try M retry .# trust Hana Rudová, Logické programování I, 20. května 2009 298 Preklad WAM - indexace -• Provázání klauzulí: instrukce XX_me_else: M první klauzule: try_me_else; založí bod volby 3 poslední klauzule: trust_me_else; zruší nejmladší bod volby -• ostatní klauzule: retry_me_else; znovu použije nejmladší bod volby po neúspěchu -• Provázání podmnožiny klauzulí (podle argumentu): «• try M retry .# trust M „Rozskokové" instrukce (dle typu a hodnoty argumentu): M switch_on_term Var, Const, List, Struct výpočet následuje uvedeným návěstím podle typu prvního argumentu M switch_on_YY: hashovací tabulka pro konkrétní typ (konstanta, struktura) Hana Rudová, Logické programování I, 20. května 2009 298 Preklad Příklad indexace instrukcí Proceduře a(atom) :- bodyl. a(l) :- body2. a(2) :- body3. a([X|Y]) a([X|Y]) a(s(N)) a(f(N)) - body4 - body5 body6. bodyľ. odpovídají instrukce a: switch. _on_term L 1, LZ, Li, L2: switch. _on_const atom 1 2 Lla L5a L6a L3: try trust L7a L8a L4: switch. _on_struct s/1 f/1 L9a LlOa LI: try_me_ .else L5 Lla: bodyl L5: retry_me_else L6 Hana Rudová, Logické programování I, 20. května 2009 L5a: body2 L6: retry_me_ .else L7 L6a: body3 L7: retry_me_ .else L8 L7a: body4 L8: retry_me_ .else L9 L8a: body5 L9: retry_me_ .else L10 L9a: body6 L10: trust_me_ .else fail LlOa: bodyľ 299 Preklad WAM - řízení M execute Proč: ekvivalentní příkazu goto Hana Rudová, Logické programování I, 20. května 2009 300 /ýpočtu Preklad WAM - řízení M execute Proč: ekvivalentní příkazu goto & proceed: zpracování faktů Hana Rudová, Logické programování I, 20. května 2009 300 /ýpočtu Preklad WAM - řízení výpočtu M execute Proč: ekvivalentní příkazu goto & proceed: zpracování faktů M allocate: alokuje okolí (pro některé klauzule netřeba, proto explicitně generováno) Hana Rudová, Logické programování I, 20. května 2009 300 Preklad WAM - řízení výpočtu M execute Proč: ekvivalentní příkazu goto & proceed: zpracování faktů M allocate: alokuje okolí (pro některé klauzule netřeba, proto explicitně generováno) M deal 1 ocate: uvolní okolí (je-li to možné, tedy leží-li na vrcholu zásobníku) M call Proč,N: zavolá Proč, N udává počet lok. proměnných (odpovídá velikosti zásobní Hana Rudová, Logické programování I, 20. května 2009 300 WAM - řízení výpočtu M execute Proč: ekvivalentní příkazu goto & proceed: zpracování faktů M allocate: alokuje okolí (pro některé klauzule netřeba, proto explicitně generováno) M deal 1 ocate: uvolní okolí (je-li to možné, tedy leží-li na vrcholu zásobníku) M call Proč,N: zavolá Proč, N udává počet lok. proměnných (odpovídá velikosti zásobní Možná optimalizace: vhodným uspořádáním proměnný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, 20. května 2009 300 WAM - řez Implementace řezu (opakování): odstranění bodů volby mezi současným vrcholem zásobníku a bodem volby procedury, která řez vyvolala (včetně bodu volby procedury s řezem) Indexační instrukce znemožňují v době překladu rozhodnout, zda bude alokován bod volby M příklad: ?- a(X) . může být nedeterministické, ale ?- a(l) . může být deterministické Hana Rudová, Logické programování I, 20. května 2009 301 Preklad WAM - řez Implementace řezu (opakování): odstranění bodů volby mezi současným vrcholem zásobníku a bodem volby procedury, která řez vyvolala (včetně bodu volby procedury s řezem) Indexační instrukce znemožňují v době překladu rozhodnout, zda bude alokován bod volby M příklad: ?- a(X) . může být nedeterministické, ale ?- a(l) . může být deterministické cut_last: B := CUT save_cut Y: Y := CUT load_cut Y: B := Y Hana Rudová, Logické programování I, 20. května 2009 301 Preklad WAM - řez Implementace řezu (opakování): odstranění bodů volby mezi současným vrcholem zásobníku a bodem volby procedury, která řez vyvolala (včetně bodu volby procedury s řezem) Indexační instrukce znemožňují v době překladu rozhodnout, zda bude alokován bod volby M příklad: ?- a(X) . může být nedeterministické, ale ?- a(l) . může být deterministické cut_last: B := CUT save_cut Y: Y := CUT load_cut Y: B := Y Hodnota registru B je uchovávána v registru CUT instrukcemi cal 1 a execute. Je-li řez prvním predikátem klauzule, použije se rovnou cut_last. V opačném případě se použije jako první instrukce save_cut Y a v místě skutečného volání řezu se použije load_cut Y. Hana Rudová, Logické programování I, 20. května 2009 301 Preklad WAM - řez Implementace řezu (opakování): odstranění bodů volby mezi současným vrcholem zásobníku a bodem volby procedury, která řez vyvolala (včetně bodu volby procedury s řezem) Indexační instrukce znemožňují v době překladu rozhodnout, zda bude alokován bod volby M příklad: ?- a(X) . může být nedeterministické, ale ?- a(l) . může být deterministické cut_last: B := CUT save_cut Y: Y := CUT load_cut Y: B := Y Hodnota registru B je uchovávána v registru CUT instrukcemi cal 1 a execute. Je-li řez prvním predikátem klauzule, použije se rovnou cut_last. V opačném případě se použije jako první instrukce save_cut Y a v místě skutečného volání řezu se použije load_cut Y. Příklad: a(X,Z) :- b(X), ! , c(Z). a(2,Z) :- !, c(Z). a(X,Z) :- d(X,Z). odpovídá save_cut Y2; get A2,Y1; call b/1,2; load_cut Y2; put Y1.A1; execute c/1 get_const AI,2; cut_last; put A2,A1; execute c/1 execute d/2 Hana Rudová, Logické programování I, 20. května 2009 301 Preklad WAM - optimalizace 1. Indexace klauzulí 2. Generování optimální posloupnosti instrukcí WAMu 3. Odstranění redundancí při generování cílového kódu. Hana Rudová, Logické programování I, 20. května 2009 302 WAM - optimalizace 1. Indexace klauzulí 2. Generování optimální posloupnosti instrukcí WAMu 3. Odstranění redundancí při generování cílového kódu. • Příklad: a(X,Y,Z) :- b(f,X,Y,Z). naivní kód (vytvoří kompilátor pracující striktně zleva doprava) vs. optimalizovaný kód (počet registrů a tedy i počet instrukcí/přesunů v paměti snížen): get_var A1,A5 get_var A2,A6 get_var A3,A7 put_const Al,f put_value A2,A5 put_value A3,A6 put_value A4,A7 execute b/4 get_var A3, A4 get_var A2,A3 get_var A1,A2 put_const Al,f execute b/4 Hana Rudová, Logické programování I, 20. května 2009 302 Preklad