priorita +: 500, priorita *: 400 Operátory, aritmetika Operátory 1 Infixová notace: 2*a + b*c 1 Prefixová notace: +( *(2,a), *(b,c) ) ■ prefixovou notaci lze získat predikátem display/l :- dísplay((a:-s(0),b,c)). :-(a, ,(s(0), ,(b,c))) 1 Priorita operátorů: operátor s nejvyšší prioritou je hlavní funktor 1 Uživatelsky definované operátory: zna petr zna alese. zna( petr, alese). 1 Definice operátoru: :- op( 600, xfx, zna ). ■ :- op( 1100, xfy, ; ). :- op( 1000, xfy, , ). p :- q, r; s, t. p :- (q, r) ; (s, t). ; má vyšší prioritu než , ■ :- op( 1200, xfx, :- ). :-má nejvyšší prioritu 1 Definice operátoru není spojena s datovými manipulacemi (kromě spec. případů) Hana Rudová, Logické programování I, 1. března 2012 2 Operátory, aritmetika priorita: 1..1200 nestrukturované objekty: 0 Typy operátorů ■ Typy operátorů ■ infixové operátory: xfx, xfy, yfx př. xfx = yfx - ■ prefixové operátory: fx, fy př. fx ?- fy- ■ postfixové operátory: xf, yf ■ x a y určují prioritu argumentu ■ x reprezentuje argument, jehož priorita musí být striktně menší než u operátoru ■ y reprezentuje argument, jehož priorita je menší nebo rovna operátoru ■ a-b-c odpovídá (a-b)-c a ne a-(b-c): „-" odpovídá yfx priorita: 500 Hana Rudová, Logické programování I, 1. března 2012 3 Operátory, aritmetika Aritmetika ■ Předdefinované operátory + , -, *, /, '■'•"■'•'mocnina,// celočíselné dělení, mod zbytek po dělení ■ ?- X = 1 + 2. X=l + 2 = odpovídá unifikaci ■ ?- X i s 1 + 2. X = 3 „i s" je speciální předdefinovaný operátor, který vynutí evaluaci ■ porovnej: N = (1+1+1+1+1) N i s (1+1+1+1+1) ■ pravá strana musí být vyhodnotitelný výraz (bez proměnné) ■ výraz na pravé straně je nejdříve aritmeticky vyhodnocen a pak unifikován s levou stranou volání?- X i s Y + 1. způsobí chybu ■ Další speciální předdefinované operátory >, <, >=, =<, =:= aritmetická rovnost, =\= aritmetická nerovnost ■ porovnej: 1+2 =:= 2+1 1+2 = 2+1 ■ obě strany musí být vyhodnotitelný výraz: volání ?- 1 < A + 2. způsobí chybu Hana Rudová, Logické programování I, 1. března 2012 4 Operátory, aritmetika Různé typy rovností a porovnání X = Y X a Y jsou unifikovatelné X \= Y X a Y nejsou unifikovatelné, (také \+ X = Y) X == Y X a Y jsou identické porovnej: ?-A == B. ... no ?- A=B, A==B. ... B = A yes X \== Y X a Y nejsou identické ~ ■ , a , d *? a d a \ d a Rez, negace porovnej: ?- A \== B. .. .yes ?- A=B, A \== B. ... A no ' 3 X i s Y Y je aritmeticky vyhodnoceno a výsledek je přiřazen X X =:= Y X a Y jsou si aritmeticky rovny X =\= Y X a Y 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, 1. března 2012 5 Operátory, aritmetika f(X,0) f(X,2) f(X,4) Řez a upnutí X < 3, ! . 3 =< X, X < 6, ! 6 =< X. přidání operátoru řezu , , ! ' ' Rez a ořezání fCX.Y) s(X,Y) s(X,Y) s(X,Y). Y i s X + 1. Y i s X + 2. fCX.Y) s(X,Y) s(X,Y) s(X,Y), !. Y i s X + 1. Y i s X + 2. 6 ?- fCl,Y), Y>2. f(X,0) :- X < 3, !. %(1) f(X,2) :- X < 6, !. %(2) f(X,4). ?- fCl.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í ?- fCl,Z). Z = 2 ? ; Z = 3 ? ; no ?- fCl,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, 1. března 2012 Hana Rudová, Logické programování I, 1. března 2012 Chování operátoru řezu Předpokládejme, že klauzule H :- TI, T2, Tm, !, ...Tn.je aktivována voláním cíle C, který je unifikovatelný s H. G=h(X,Y) V momentě, kdy je nalezen řez, existuje řešení cílů TI, ..., Tm X=l, Y=l Ořezání: při provádění řezu se už další možné splnění cílů TI, ..., Tm 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 unifikovatelná s C ?- h(X,Y). h(l,Y) :- tl(Y), ! h(2,Y) :- a. tl(l) :- b. tl(2) :- c. Hana Rudová, Logické programování I, 1. března 201 2 hCX.Y) X=l / \ X=2 tl(Y) a (vynechej: upnutí) Y=l / \ Y=2 b c (vynechej: ořezání) / 9 Řez, negace c(X) :- pCX). c(X) :- v(X). Řez: příklad cl(X) clCX) P(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). X = 1 ? ; %p(l) X = 2 ? ; %p(2) X = 2 ? ; %v(2) no Hana Rudová, Logické programování I, 1. března 201 2 ?- cl(X). X = 1 ? ; %p(l) no Rez, negace Rez: návrat na rodiče ?- a(X). CD a(X) :-(2) a(X) :- C3) h(l,Y) (4) h(2,Y) (5) tl(l) : C6) tl(2) : (7) b :- c. (8) b :- d. (9) d. (10) e(l) . (11) e(2). h(X,Y). d. :- tl(Y), : - a. - b. - c. e (X). a(x) h(X,Y) X/ly tl(Y),!,e(X') upnutí Y/1/ X b,!,e(X') ořezání c,!,e(X') d,!,e(X') I I no !,e(X') I ! e(X') d ! □ Po zpracování klauzule s řezem se vracím až na rodiče této klauzule, tj. a(X) Hana Rudová, Logické programování I, 1. března 201 2 Řez, negace Rez: cvičení 1. Porovnejte chování uvedených programů pro zadané dotazy. a(X,X) :- b(X). a(X,Y) :- Y is X+l. b(X) :- X > 10. a(X,X) :- b(X),!. a(X,Y) :- Y is X+l. b(X) :- X > 10. ?- a(X,Y). ?- a(l,Y). ?- aCll.Y). a(X,X) a(X,Y) b(X) :■ c : - ! :- b(X),c. :- Y is X+l. X > 10. 2. Napište predikát pro výpočet maxima max( X, Y, Max ) Hana Rudová, Logické programování I, 1. března 2012 Řez, negace Typy řezu Negace jako neúspěch Zlepšení efektivity programu: určíme, které alternativy nemá smysl zkoušet Poznámka: na vstupu pro X očekávám číslo Zelený řez: odstraní pouze neúspěšná odvození ■ 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 Červený řez: odstraní úspěšná řešení ■ f(X,l) :- X >= 0, !. f(_X,-l). bez řezu uspěje 2. klauzule pro nezáporná čísla Speciální cíl pro nepravdu (neúspěch) fail a pravdu true Xa Y nejsou unifikovatelné: different(X, Y) different( X, Y ) :- X = Y, !, fail. different( _X, _Y ). Xje muž: muz(X) muz( X ) :- zena( X ), !, fail. muz( _X ). Hana Rudová, Logické programování I, 1. března 201 2 13 Rez, negace Negace jako neúspěch: operátor \+ different(X,Y) :-X=Y, !, fail. muz(X) :-zena(X), !, fail. different(_X,_Y). muz(_X). Unární operátor \+ P ■ jestliže P uspěje, potom \+ P neuspěje \+(P) :- P, !, fail. ■ v opačném případě \+ P uspěje \+(_) ■ different( X, Y ) :- \+ X=Y. muz( X ) :- \+ zena( X ). Pozor: takto definovaná negace \+P vyžaduje konečné odvození P Hana Rudová, Logické programování I, 1. března 201 2 15 Řez, negace Hana Rudová, Logické programování I, 1. března 201 2 Řez, negace Negace a proměnné \+(P) :- P, !, fail. % (I) \+(_). % (ID dobre( citroen ). dobre( bmw ). drahe( bmw ). rozumne( Auto ) :-\+ drahe( Auto ). % (D % (2) % (3) % (4) ?- dobre( X ), rozumne( X ). dobre(X),rozumne(X) dle (1), X/citroen rozumne(citroen) dle (4) \+ drahe(citroen) \ dle (II) dle (I) drahe(citroen),!, fail □ yes no Hana Rudová, Logické programování I, 1. března 201 2 Řez, negace Negace a proměny \+(P) :- P, !, fail. % (I) \+(_). % (ID dobre( citroen ). % (1) dobre( bmw ). % (2) drahe( bmw ). % (3) rozumne( Auto ) :- % (4) \+ drahe( Auto ). ?- rozumne( X ), dobre( X ). mne(X), dobre(X) dle (4) \+drahe(X),dobre(X) dle (I) drahe(X),!,fail,dobre(X) dle (3), X/bmw !, fail, dobre(bmw) fail,dobre(bmw) no Bezpečný cíl ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no ?- rozumne( citroen ). yes ?- rozumne( X ). no \+ P je bezpečný: proměnné P jsou v okamžiku volání P instanciovány ■ negaci používáme pouze pro bezpečný cíl P Hana Rudová, Logické programování I, 1. března 2012 17 Řez, negace Chování negace ■ ?- \+ drahe( citroen ). yes ?- \+ drahe( X ). no ■ 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 ). PTÁME SE: 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, 1. března 2012 19 Řez, negace Hana Rudová, Logické programování 1,1. března 2012 18 Řez, negace Predikáty na řízení běhu programu I. ■ řez „!" ■ fai 1: 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 prípade R (P -> Q ; R) :- R. ■ príklad: min(X,Y,Z) : - X =< Y -> Z = X ; Z = Y. ■ P -> Q ■ odpovídá: (P -> Q; fail) ■ príklad: zaporne(X) :- number(X) -> X < 0. Hana Rudová, Logické programování I, 1. března 2012 20 Řez, negace Predikáty na řízení běhu programu II. ■ 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 :- ... u"loz_stav( StaryStav ), repeat, generuje X ), % deterministické: generuj, prováděj, testuj prováděj( X ), testuj( X ) , i obnov_stav( StaryStav ), Hana Rudová, Logické programování I, I. března 2012 21 Řez, negace