Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Prolog (8) Jan Hric, KTI MFF UK,1997-20003 barbora: h:\vyuka\hric\prg_II\*.*

Podobné prezentace


Prezentace na téma: "Prolog (8) Jan Hric, KTI MFF UK,1997-20003 barbora: h:\vyuka\hric\prg_II\*.*"— Transkript prezentace:

1 Prolog (8) Jan Hric, KTI MFF UK,1997-20003 http://kti.ms.mff.cuni.cz/~hric barbora: h:\vyuka\hric\prg_II\*.*

2 Heuristické prohledávání grafu Heuristicke prohledavani, pomoci prioritni fronty -interface grafu: start/1, solution/1, child/2 (anebo children/2) -interface heuristiky: estimate_goal(+Node, - Estimate) -interface haldy: empty_heap(-H), add_heap(+H0,+Nd,+Cost,-H), get_from_heap/4 % ADT best_first(Answer):- start(Start), initial_heap(Start, Heap), best_star(Heap,[Start],Answer), % b_s(otevrene, uzavrene, answer) solution(Answer). initial_heap(Start,Heap):- estimate_goal(Start, Estimate), empty_heap(Empty), add_heap(Empty,Estimate,Start,Heap). best_star(Heap, Close, Answer):- get_from_heap(Heap, _, Node, Heap1), % vraci min. ( Answer=Node ; children_4(Node, Closed,Closed1, Heap1, Heap2),% deti aktualniho Node best_star( Heap2, Closed1, Answer) ). children_4(ParentNode, Closed, Closed1, Heap, Heap1):- ordered_children(ParentNode,Closed,Closed1, OrdPairs), add_children(OrdPairs, Heap, Heap1).

3 Heuristicke prohledavani grafu 2 ordered_children(ParentNode, Closed, Closed1, OrdPairs):- children(ParentNode, ChildrenSet), ord_union(Closed, ChildrenSet, Closed1, NewChildren),% z knihovny compute_ranks(NewChildren, RawPairs), keysort(RawPairs,OrdPairs).% usporadani podle klice-kriteria compute_ranks([],[]). compute_ranks([Child|Children],[Estimate-Child|Pairs]):- estimate_goal(Child, Estimate), compute_ranks(Children, Pairs). add_children([],Heap, Heap). add_children([Estimate-Child|Children], Heap0, Heap):- add_heap(Heap0,Estimate, Child, Heap1), add_children(Children,Heap1,Heap). - v umělé inteligenci alg. A* pro hledání nejkratší cesty - seřazení vrcholů podle ceny: součet ceny od startu a odhadu do cíle (jiná interpretace estimate_goal/2)

4 Dámy na šachovnici (generuj a testuj) queens(N,Queens):- length(Queens,N),% volne premenne rows_columns(Queens,Rows,Cols,0),% cisluje Rows od 0 perm(Rows,Cols),% navaze Cols; generuj … noattack(Queens).% … a testuj rows_columns([],[],[],_). rows_columns([R-C|Queens],[R|Rs],[C|Cs],R0) :- R is R0+1, row_columns(Queens,Rs,Cs,R). noattack([]). noattack([R-C|Queens]):- noattack(Queens,R,C),noattack(Queens). noattack([],_,_). noattack([R2-C2|Queens], R1, C1):- R2 + C2 =\= R1 + C1, R2 – C2 =\= R1 – C1, % ruzna diagonala noattack(Queens, R1,C1)

5 Eliza Eliza – simulace rozhovoru s psychoanalytikem (pp.151) Fraze = [[w(i),s(X),w(my),s(Y)]-[w(your),s(Y),s([?,why,do,you]),s(X),s([it,?])], …], KlicFraze = [mother-[s(X)]*[s([tell,me,more,about,your,family])], …], odezva(Fraze,KlicFraze,Veta,Odezva):- ( member(VzorF-VzorO,Fraze), % přímé reakce ; member(Klic,Veta), member(Klic-VzorF*VzorO,KlicFraze), % reakce podle klíče ), match(VzorF,Veta), match(VzorO,Odezva),% porovnani vzoru a odpoved match([],[]). match([Vzor|Vzory], [Slovo|Slova]):- match(Vzor, Vzory, Slovo, Slova). match(w(Slovo),Vzory,Slovo,Slova):- match(Vzory,Slova). % porovnani slova match(s([Slovo|Seg]),Vzory,Slovo,Slova0):- append(Seg,Slova1, Slova0), match(Vzory,Slova1).%porovnani segmentu ?- odezva(F,KF,[i,like,my,job],O). O=[your,job,?,why,do,you, like,it,?] - vyloučení opakování reakcí, pamatování si klíčů a návrat k tématům

6 Eliza - priklad > all men are alike. % klíč. slovo In what way ? > they always want the same thing. Can you be more specific ? > are you trying to be funny? % are you X Would you prefer it if I weren't trying to be funny ? > computers are stupid. % X are Y What if they were not stupid ? %... were not Y > This conversation is silly. % bez klíče I'm sorry. Could you please rephrase that ? >.

7 Plánování interpretace datové struktury struktura plánů: Act1 // Act2- paralelní vykonávání Act1, Act2- nejprve Act1, pak Act2 do(BasicAct)- vykonej primitivní akci execute(Plan) – jako Popis, kde plan(Plan, Popis) informace o BasicAct precond(BA1,BA2) – před BA1 se musí uskutečnit BA2 cost(BA, Cena)- cena zákl. plánu -spočítání ceny plánu (pp. 267) plan_cost(Plan, Cost) :- plan_cost(Plan,0,Cost). plan_cost(Act1 // Act2, C0, C):- plan_cost(Act1,C0,C1), plan_cost(Act2,C1,C). plan_cost((Act1,Act2), C0, C):- plan_cost(Act1,C0,C1), plan_cost(Act2,C1,C). plan_cost(do(BasicAct), C0, C):- cost(BasicAct, Cost), C is C0+Cost. plan_cost(execute(Name), C0, C):- plan(Name,Plan), plan_cost(Plan,C0,C). - skontrolování správnosti plánu

8 Převod termu na cíl: call/1  call/1 převede term v argumentu na cíl a zavolá ho  akceptuje i složené cíle  jméno volaného predikátu musí být známé  proměnné na místě predikátů: X --> call(X)  př.: not,\+  př.: sekvence(P,Q):- call(P),call(Q).  př.: sekvence2(P,Q):- call((P,Q)).  argumenty se přidají pomocí =..  problémy s přejmenováním proměnných  => používat jen na termy bez proměnných (zatím)

9 Programování vyšších řádů  predikáty jako vstupní parametry  znovupoužitelnost kódu, vyšší abstrakce  parametrické spracování seznamu: map(Pred, In, Out)  Pred/2 se zavolá na každý prvek In a vrátí prvek Out  př.: první, poslední sloupec matice map(_P,[],[]). map( P,[I|Is],[O|Os]):-mycall(P,[I,O]),map(P,Is,Os). posledni_sloupec(M,S):-map(last,M,S).  argumenty se přidají pomocí =.. mycall(P,Args):- C=..[P|Args], call(C).  idea map je použitelná na libovolnou d.s., na víc args.

10 Parametrické zpracování seznamu  funkční symbol je relace mezi složkami a celou strukturou  f.s. nahradíme jinou relací - předanou parametrem zpracuj(Snil,_Scons,[],Snil). zpracuj(Snil, Scons,[I|Is],O):- zpracuj(Snil,Scons,Is,O1), mycall(Scons,[I,O1,O]). suma(I,O):-zpracuj(0,plus,I,O). length(I,O):-zpracuj(0,plus1,I,O). mappend(I,O):-zpracuj([],append,I,O). plus(X,Y,Z):-Z is X+Y. plus1(_X,Y,Z):-Z is Y+1.

11 (Parametrické zpracování seznamu II)  idea zpracuj: (anglicky fold)  zpracuj(E, , [X1,.., Xn], Out)  Out := X1  (X2  (...  (Xn  E)..))  relace:  (Xn,E,A1),  (Xn-1,A1,A2),..  (X1,An- 1,An),An=Out  jiná relace: R(X1,E,A1), R(X2,A1,A2),.. R(Xn,An-1,An),An=Out  další varianty filter(_P,[],[]). filter( P,[I|Is],O):- (mycall(P,[I]) -> O=[I|O1] ; O=O1), filter(P,Is,O1).

12 (Částečná spec. argumentů)  predikát má několik prvních arg. daných, zbylé jsou parametry map_matice(P,I,O):- map(map(P),I,O). map2_matice(P,I1,I2,O):-map2(map2(O),I1,I2,O). plus_matice(M1,M2,M):-map2_matice(plus,M1,M2,M).  musíme změnit/zobecnit mycall mycall(P,Args):- P=.. [Pred|Args0], % args bez volných proměnných append(Args0,Args,Args1), C=..[Pred|Args1], call(C).  předávané predikátové argumenty musí být bez volných proměnných

13 Datové struktury  binární stromy void/0, t/3  map_t(P,T1,T0)  St má 4 param. ; 3 vstupní a 1 výstupní  2-3 stromy: void/0, t2/3, t3/5  map_t23(P,T1,T0)  Asociativní seznam: nil/0, cons/3 (klic, hodn, AS) ...  map může převádět na jiné struktury: seznam  seznam klíčů, seznam hodnot...

14 Neúplné datové struktury  (vyhledávací slovník)  rozdílové seznamy  graf  pointry jsou realizovány vazbami proměnných  problémy se změnami (log. prom.)  při změně se struktura kopíruje  pro Prolog jsou strukt. “nekonečné”  problém s výpisy, unifikací...

15 Rozdílové seznamy  umožňují spojení seznamů v konstantním čase  k danému seznamu je možné připojit jen jeden seznam  je přístupný konec seznamu pomocí volné (logické) proměnné  idea: [a,b,c] ~> [a,b,c|K]-K; []~>K-K  rozdílový seznam - d.s.: Začátek - Konec  převody: seznam rozdíl. seznam  list2dlist(L,Z-K):- append(L,K,Z).  dlist2list(L-[],L).  dappend(Z1-K1,Z2-K2,Z1-K2):-K1=Z2. %...

16 Aplikace r. seznamů  Program: qsort([],Z-Z). qsort([X|L],Z-K):- split(X,L,L1,L2), qsort(L1,Z-[X|K1]), qsort(L2,K1-K).  volání: ?- qsort([3,1,4,2],V-[]).

17 Kompilace  aritm. výrazu  :- op(600,xfx, :=).  ?- cc(var(a):=var(b)+const(1), Kod,[]). % volání  Kod=[load(b),load(const(1)),plus,store(a)] cc(var(V),[load(V)|Kod],Kod). cc(const(C),[load(const(C))|Kod],Kod). cc(V1+V2, Kod1,Kod3):- cc(V1,Kod1,Kod2), cc(V2,Kod2,[plus|Kod3]). cc(var(V):=Vyr,Kod1,Kod2):- cc(Vyr,Kod1,[store(V)|Kod2]).

18 Kompilace příkazů  DC  faktorial cc(( read(i); j:=1; while(i>0, ( j:= j*i; i:- i-1 ) ); write(j) ), Kod,[]).

19 Práce s databází  assert(C), assertz(C) -vloží klauzuli na konec db.  asserta(C).. vloží na začátek db.  př.: assert((member(X,[_|L]):-member(X,L)).  závorky kolem (částí) klauzulí :- -> ;,  retract(C).. vypustí klauzuli z db.  nesubstituuje za volné výstupní proměnné  databáze záznamů  statické vs. dynamické predikaty.  :- dynamic append/3. % direktiva v zdroj.soub.  abolish(P/N).. zničí definici P/N  ?- abolish([p/1,q/2]).  databáze záznamů (blackboard), impl. závislé (SWI)  recorda(+Klic,+Hodn), recordz(+K,+H), recorded(+K,-H), erase(+K)

20 databáze záznamů

21 Clause  umožňuje přístup do databáze  clause(Hlava,Telo)  Hlava musí určit aspoň jméno a četnost predikátu ?- clause(member(A,B),C). A=_1 B=[_1|_2] C=true ; A=_1 B=[_2|_3] C=member(_1,_3) ; no  fakty vrací Telo = true

22 Programování s omezujícími podmínkami  Prolog řeší rovnice nad “symbolickými” výrazy  jiné domény: reálná čísla, konečné domény, řetězce, množiny, grafy...  interface Prolog - řešič  Prolog posílá podmínky (a odebírá), deklarativně  řešič vrací “soustava podmínek je řešitelná”  na konci výpočtu: nějaký tvar řešení  zjednodušené podmínky (vyřešený tvar)  posloupnost řešení  př.: rovnice nad reálnými čísly  vyřešené lineární rovnice a nerovnice s par.  zbylé nelineární podm.

23 Konečné domény  řešení kombinatorických problémů  grafy, plánování...  místo “generuj a testuj”: “omez a generuj”  obarvení grafu n barvami  pro v_i prom. X_i  pro hranu v_i - v_j podm. X_i\=X_j  domény: X_i :: {1,2,..n}  Prakticky používané systémy  Eclipse  ILOG solver - knihovny řešiče a interface pro C

24 Příště  funkcionální programování...

25 Binární vyhl. stromy  %insert(X,I,O)  insert(X,void,t(void,X,void).  insert(X,t(L,Y,R),t(L1,Y,R):-X=<Y,insert(X,L,L1).  insert(X,t(L,Y,R),t(L,Y,R1):-X>=Y,insert(X,R,R1).

26 (Regulární výrazy příklad reprezentace)


Stáhnout ppt "Prolog (8) Jan Hric, KTI MFF UK,1997-20003 barbora: h:\vyuka\hric\prg_II\*.*"

Podobné prezentace


Reklamy Google