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

Slides:



Advertisements
Podobné prezentace
Grafové algoritmy.
Advertisements

DOTAZOVACÍ JAZYKY slajdy přednášce DBI006
Prolog – seznamy Jan Hric, 1997 – 2010b KTIML MFF UK URL:
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Ladění, pred. vyšších řádů (7)  Jan Hric, KTI MFF UK, a
Přednáška 11 Jiří Šebesta
Programování funkcí v Excelu
JUI - 3. přednáška Zpracování seznamů, predikátové a vyhodnocovací funkce RNDr. Jiří Dvořák, CSc.
10. Dynamické datové struktury
VISUAL BASIC Práce se soubory.
Softwarový systém DYNAST
ALGO – Algoritmizace 1. cvičení
Neprocedurální programování Prolog 1.přednáška
Principy překladačů Běhová podpora Jakub Yaghob. Běhová podpora Statická podpora jazyka Překladač Interface na knihovny Hlavičkové soubory Dynamická podpora.
Principy překladačů Mezikód Jakub Yaghob.
Materiály k přednášce Úvod do programování Ondřej Čepek.
ADT Strom.
FORMALIZACE PROJEKTU DO SÍŤOVÉHO GRAFU
Řešení dynamických problémů s podmínkami Pavel Surynek Univerzita Karlova v Praze Matematicko-fyzikální fakulta.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6. TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na.
JUI - 9. přednáška Ř ez, negace, práce s databází RNDr. Jiří Dvořák, CSc.
Gramatiky a jazyky Přednáška z předmětu Řízení v komplexních systémech
Systémy pro podporu managementu 2
Algoritmy vyhledávání a řazení
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Predikátová logika.
Reprezentace (6)  Jan Hric, KTI MFF UK, a
Proměnná typu "pole" Mezi proměnné typu "pole" patří všechny superglobální proměnné. Mezi proměnné typu "pole" patří všechny superglobální proměnné. To.
Datové typy a struktury
Systémy pro podporu managementu 2 Inteligentní systémy pro podporu rozhodování 1 (DSS a znalostní systémy)
Registrační číslo projektu:CZ.1.07/1.5.00/ Šablona/číslo materiálu:III/2 VY_32_INOVACE_ANJ449 Jméno autora:Mgr. Soňa Nekvindová Třída/ročník1. ročník.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Prolog (8) Jan Hric, KTI MFF UK, a
Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Databázové modelování
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
PROGRAMOVÁNÍ V PHP PERSONAL HOME PAGES CYKLY V PHP.
XQuery Dotazovací jazyk XML Daniel Privalenkov. O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů.
Vestavěné predikáty a jejich použití (5) Jan Hric, KTI MFF UK, a
Jazyky pro umělou inteligenci RNDr. Jiří Dvořák, CSc.
Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403 
JUI přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc.
Vazby dynamických proměnných,databázové systémy Přednáška č. 10.
14. června 2004Michal Ševčenko Architektura softwarového systému DYNAST Michal Ševčenko VIC ČVUT.
Prolog (add) Jan Hric, KTI MFF UK, a
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Podprogramy (subroutines) Pojmenované kousky programu, které –tvoří logicky ucelené části –se v programu opakují Jsou zapsány na jednom místě a v případě.
Systémy. Definice systému Systém je množina navzájem souvisejících prvků a vztahů mezi nimi.
Název školy : Základní škola a mateřská škola, Svoboda nad Úpou, okres Trutnov Autor : Bc. Lucie Ševčíková Datum : Název : VY_22_INOVACE_2.2.2.
NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6.
Úvod do programování 11. hodina
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
ZAL – 3. cvičení 2016.
Překladače Syntaktická analýza
PROLOG strategie vyhodnocení dotazu
Příkazy cyklu (1) Umožňují vícekrát (nebo ani jednou) pro-vést určitý příkaz Jazyk C rozlišuje příkaz cyklu: s podmínkou na začátku: obecný tvar: while.
Oblast platnosti identifikátoru (1)
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Prohledávání stavového prostoru
Programovací jazyk Haskell
Cyklus for (1) Obecný tvar: for (výraz1; výraz2; výraz3) příkaz
Prohledávání stavového prostoru
Grafy kvadratických funkcí
Algoritmizace a datové struktury (14ASD)
Funkce s proměnným počtem parametrů
Prohledávání grafů.
Grafy kvadratických funkcí
Transkript prezentace:

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

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).

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)

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)

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

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 ? >.

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

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)

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.

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.

(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).

(Čá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

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...

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í...

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. %...

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-[]).

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]).

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

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)

databáze záznamů

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

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.

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

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

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).

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