Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
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)
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.