Prolog add Jan Hric KTI MFF UK 1997

  • Slides: 22
Download presentation
Prolog (add) Jan Hric, KTI MFF UK, 1997 -2007 a http: //kti. ms. mff.

Prolog (add) Jan Hric, KTI MFF UK, 1997 -2007 a http: //kti. ms. mff. cuni. cz/~hric

Dodatky Vyhledávací stroj Aho-Corasicková 0 -6 Mobily – pověšené rybičky – viz p 4

Dodatky Vyhledávací stroj Aho-Corasicková 0 -6 Mobily – pověšené rybičky – viz p 4 log. Vyrazy viz p 4 Řešení podmínek, v konečných doménách – dokončit - algebrogramy

AC 0 – stroj Aho-Corasicková w Vzorky: 0 a 1 b 2, 0 b

AC 0 – stroj Aho-Corasicková w Vzorky: 0 a 1 b 2, 0 b 3 a 4, 0 a 1 c 5; n=|T|, k=|vzorky| , s=|abeceda| % interface out/2, out(Vzorky/stav, Pozice/zbytek textu), taky dále % ac_Stav(Text. Vstupni), stav stroje = stav prog. (aktuální predikát) ac_0([a|T]): - ac_1(T). % goto(0, a)=1 A ac_0([b|T]): - ac_3(T). % anebo použít řez (na zač. ), kl. „C“ je default B ac_0([P|T]): - P=a, P=b, ac_0(T). % goto(Abeceda, 0)=0, rozepsat C ac_1([b|T]): - out([ab], T), ac_2(T). % out(2)= {ab} D ac_1([c|T]): - out([ac], T), ac_5(T). % out je pro všechny stroje stejná E ac_1([P|T]): - P=b, P=c, ac_0([P|T]). % fail(1)=0, bez čtení znaku , lépe s “!” F ac_2(T): - ac_3(T). % fail(2)=3, !konstrukce je v jiném pořadí G ac_3([a|T]): - !, out([ba], T), ac_4(T). % varianta s !: determinismus H ac_3(T): - ac_0(T). % ošetřuje pouze zbylá písmena (P=a), viz. řez I ac_4(T): - ac_1(T). % J ac_5(T): - ac_0(T). % K w Víc abstrakce: stav AC stroje jako (explicitní) data (místo IP) w I tento způsob se používá, při synt. analýze rekurzivním sestupem

AC 1: (virtuální) stroj Aho-Corasicková, simulátor w Vzorky: 0 a 1 b 2, 0

AC 1: (virtuální) stroj Aho-Corasicková, simulátor w Vzorky: 0 a 1 b 2, 0 b 3 a 4, 0 a 1 c 5; n=|T|, k=|vzorky| , s=|abeceda| % interface out/2, out(Vzorky/stav, Pozice/zbytek textu), taky dále % ac 1(Stav, Text. Vstupni), ac 1(0, [a|T]): - ac 1(1, T). % goto(0, a)=1 A ac 1(0, [b|T]): - ac 1(3, T). % B ac 1(0, [P|T]): - P=a, P=b, ac 1(0, T). % goto(Abeceda, 0)=0, rozepsat C ac 1(1, [b|T]): - out([ab], T), ac 1(2, T). % out(2)= {ab} D ac 1(1, [c|T]): - out([ac], T), ac 1(5, T). % E ac 1(1, [P|T]): - P=b, P=c, ac 1(0, [P|T]). % fail(1)=0, bez čtení znaku !! F ac 1(2, T): - ac 1(3, T). % fail(2)=3, !konstrukce je v jiném pořadí G ac 1(3, [a|T]): - !, out([ba], T), ac 1(4, T). % varianta s !: determinismus H ac 1(3, T): - ac 1(0, T). % ošetřuje pouze zbylá písmena (P=a), viz. řez I ac 1(4, T): - ac 1(1, T). % J ac 1(5, T): - ac 1(0, T). % K w Výhoda explicitní reprezentace: lépe se ladí/trasuje, vypisuje … w Stavy nemusí být čísla, ale odpovídající „prefixy“ (anebo obojí )

AC 2: rozskoky, 1 kl. = 1 stav w % ac 2(Stav. Text) ac

AC 2: rozskoky, 1 kl. = 1 stav w % ac 2(Stav. Text) ac 2(0, [P|T): - P=a -> ac 2(1, T) ; P=b -> ac 2(3, T) % bez: out([], T) optimalizace ; ac 2(0, T). % goto(_, 0)=0, zarážka v 0 ac 2(1, [P|T]): - P=b -> out([ab], T), ac 2(2, T) ; P=c -> out([ac], T), ac 2(5, T) ; ac 2(0, [P|T]). % fail(1)=0 ac 2(3, [P|T]): - P=a -> out([ba], T), ac 2(4, T) ; ac 2(0, [P|T]). % fail(3)=0 ac 2(2, T): - ac 2(3, T). % fail(2)=3 ac 2(4, T): - ac 2(1, T). ac 2(S, T): - S=5, ac 2(0, T). % když fail(S)=0, záchytná kl. - catch. All

AC 3: interpret (vygenerované) databáze % ac 3(Stav, Text), interface: goto_def/2, goto_fnc/3, fail_fnc/2 ac

AC 3: interpret (vygenerované) databáze % ac 3(Stav, Text), interface: goto_def/2, goto_fnc/3, fail_fnc/2 ac 3(S, [P|T]): - goto_def(S, P) -> goto_fnc(S, P, S 1), out(S 1, In), ac 3(S 1, T) ; fail_fnc(S, S 1), ac 3(S 1, [P|T]). %vstup stejný % možná implementace goto_def, ale chci paměť O(k), ne O(s. k) goto_def(S, P) : - goto_fnc(S, P, _S 1). - Nevýhoda AC 3: pouze 1 stroj (v databázi) - Řešení: pojmenovat stroj, předávat jméno vždy v 1. argumentu, taky přidat do procedur interface: AC 4 - (Lepší) idea: Místo jména, tj. symbolické reprezentace použít (v_Prologu) konkrétní reprezentaci termem (! jedním); - V C++, (PHP), FLEX: zlinearizovaná reprezentace (string ), generovaná, pro inicializaci pole „instrukcí“ a dat, …

AC 5: interpret struktury w % ac 5(ACRepr, Stav. Repr, Text, Acc. Vystup, Vystup)

AC 5: interpret struktury w % ac 5(ACRepr, Stav. Repr, Text, Acc. Vystup, Vystup) w % typ ACRepr: [NStav-f(Out, Fail, [Pism-Nstav])] ac 5(AC, S, [P|T], V 1, V 0): - S=f(Out, Fail, Gotos), ( lookup(P, Gotos, NStav 1) % O(s) až O(log s), penalizace -> out(Out, T, V 1, V 2), % Out taky [] (prázdný) lookup(NStav 1, AC, S 1), % O(k) až O(log k) ac 5(AC, S 1, T, V 2, V 0) ; lookup(Fail, AC, S 1), % penalizace ac 5(AC, S 1, [P|T], V 1, V 0) % při fail – bez „čtení“ P ). ? - AC=[0 -f([], err, [a-1, b-3, c-0]), 1 -f([], 0, [b-2]), 2 -f([ab], 3, []), . . ], lookup(0, AC, S 0), % inicializace ac 5(AC, S 0, Text, [], Vystup). % chci Vystup

AC : porovnání přístupu w AC 0 - AC 2: rychlý, generujeme program, v

AC : porovnání přístupu w AC 0 - AC 2: rychlý, generujeme program, v konkrétní syntaxi, tj. složitější na generování w AC 5, AC 4: pomalejší, generujeme d. s. (postupně) § Konkrétní strukturu (+ interface) lze změnit w Místo seznamů vyhledávací stromy : O(k) -> O(log k) w Porovnání přístupů (experimentální informatika): změřit § Implementace AC 0 -6, repr. d. s. , impl. (optimalizace) Prologu w Interpret DSL – Domain Specific Language § Datová struktura je popis (jednoúčelového) jazyka § (Př. : vzorky v grep-u, stringy při volání SQL) Zkombinování přístupů: vytvoříme data pro AC 5 automaticky pomocí částečného vyhodnocování (partial evaluation) z dat a interpretu AC 5 vytvoříme AC 0/AC 1 -like

(Generování AC 1) w Příklad: jedna klauzule gen. AC 1(g(S, P, S 0), Out,

(Generování AC 1) w Příklad: jedna klauzule gen. AC 1(g(S, P, S 0), Out, Kl) : Kl = (ac 1(S, [P|Ps]) : - !, out(Out, Ps), ac 1(S 0, Ps) ). gen. AC 1(f(S, S 0), Kl) : Kl = (ac 1(S, Ps) : - ac 1(S 0, Ps) ). % řez v minulých kl. w Generování AC 0 je složitější, musíme vytvořit jména procedur w Generování: z logického hlediska je jedno, zda generujeme do a) souboru nebo b) databáze

AC 6 on-the-fly, vstupy w Možnosti vstupu (pro kompilátor): § ac 6([[a, b], [b,

AC 6 on-the-fly, vstupy w Možnosti vstupu (pro kompilátor): § ac 6([[a, b], [b, a], [a, c]], Text). Písmena jako atomy § ac 6([ab, ba, ac], Text). Slova jako atomy § ac 6([“ab“, “ba“, “ac“], Text). řetězce w AC 6: Kompilace on-the-fly, tj. za běhu ac 6(Vz, T, Out): - mk_ac 6(Vz, AC), /*save, */ ac 6 a(AC, T, Out). § Interní struktura AC je schovaná (kompilace taky, srv. grep) § možnost uschovat kompilovanou verzi (správa a la make) § Text nemusí mít stejnou reprezentaci jako vzorky, kriterium: w Komp. : aby se jednoduše pracovalo w Běh: rychlost w Používat explicitní data, vhodnou (termovou) reprezentaci, vhodný interface (a knihovny) …

Zavěsné mobily – viz p 4 w Vyváženost, bezpečnost mobilu: vracíme seznam “chybných” mobilů

Zavěsné mobily – viz p 4 w Vyváženost, bezpečnost mobilu: vracíme seznam “chybných” mobilů w D. s. : m(Delka. L-Mobil. L, Delka. R-Mobil. R) nebo z(Hmotnost) je. Vyv(z(H), H, V, V). je. Vyv(m(DL-ML, DR-MR), H, V 1, V 0): - % do V 0 se vloží správná hodn. , podle větve je. Vyv(ML, HL, V 1, V 2), je. Vyv(MR, HR, V 2, V 3), % „stav“ - tok dat V 1 ->V 2 ->V 3 ->V 0 H is HL+HR, % celková hmotnost (je. Vyv. Koren(DL, HL, DR, HR) -> V 0 = V 3 % „přiřazení“ výstupu V 0 ; V 0 = [m(DL-ML, DR-MR)|V 3] ). % dtto, se změnou je. Vyv. Koren(DL, HL, DR, HR): - DL*HL=: =DR*HR. je. Bezp(z(_H), 0, V, V). je. Bezp(m(DL-ML, DR-MR), D, V 1, V 0): je. Bezp(ML, D 1, V 2), je. Bezp(MR, D 2, V 3), D is max(DL+D 1, DR+D 2), % delší rameno D (je. Bezp. Koren(DL, D 1, DR, D 2) -> V 0=V 3 ; V 0 = [m(DL-ML, DR-MR)|V 3] ). je. Bezp. Koren(DL, D 1, DR, D 2) : - DL+DR < D 1+D 2.

Insert do AVL stromu w strukt: v/0, t(Levy, Koren, < = >, Pravy) w

Insert do AVL stromu w strukt: v/0, t(Levy, Koren, < = >, Pravy) w i(+Strom, +Y, -Novy. Strom, +delta. Hloubky: inc, noinc) i(v, Y, t(v, Y, =, v), inc). % dále pouze přidávání do levého podstromu i(t(L, X, V, R), Y, t(L 0, X, V 0, R), DH 0): -Y@<X, (V= =; V= <), i(L, Y, L 0, DH), upd 0(V, DH, V 0, DH 0). %bez změny hloubky i(t(t(LL, LX, LV, LR), X, >, R), Y , t(LL 0, LX, LV 0, t(LR, X, =, R), DH 0): Y@<LX, (LV= =; LV= <), i(LL, Y, LL 0, DH), upd 1(LV, DH, LV 0, DH 0). %jednoduchá rotace i(t(t(LL, LX, LV, t(LLL, LLX, LLV, LLR)), X, V, R), Y, t(t(LL, LX, V 1, LLL 0), LLX, =, t(LLR, X, V 3, R)), noinc): - %dvojitá r. Y@<LLX, LX@=<Y, i(LLL, Y, LLL 0, DH), upd 2(left, LLV, …). i(t(t(LL, LX, LV, t(LLL, LLX, LLV, LLR)), X, V, R), Y, t(t(LL, LX, V 1, LLL), LLX, =, t(LLR 0, X, V 3, R)), noinc): Y@>=LLX, LX@=<X, i(LLR, Y, LLR 0, DH), upd 2(right, …). upd 0(V, D, V 0, D 0): - member(f(V, D, V 0, D 0), [f(X, noinc, X, noinc), f(=, inc, >, inc), f(<, inc, =, noinc)]). % seznam případů místo klauzulí upd 1(V, D, V 0, D 0): - member(f(V, D, V 0, D 0), [f(=, noinc, <, noinc), f(=, inc, =, inc), f(<, inc, <, inc)]). % ? ? upd 2(S, V, D, V 1, V 2, noinc): - member(f(S, V, D, V 1, V 2), [f(left, >, noinc, >, <), f(_, =, noinc, >, <), f(left, >, inc, =, <), f(left, =, inc, =, =), f(right, >, inc, >, =), f(right, =, inc, >, =)]). w Jiná reprezentace: vyvážení jako čísla -1, 0, +1.

N dam w N neohrožujících se dam na šachovnici queens(N, Qs): - range(1, N,

N dam w N neohrožujících se dam na šachovnici queens(N, Qs): - range(1, N, Ns), permutation(Ns, Qs), safe(Qs). %generuj a testuj safe([]). safe([Q|Qs]): - safe(Qs), not attack(Q, Qs). attack(X, Xs): - attack(X, 1, Xs). attack(X, N, [Y|Ys]): - X is Y+N ; X is Y-N. attack(X, N, [Y|Ys]): - N 1 is N+1, attack(X, N 1, Ys). range(N, N, [N]). % gen. seznam čísel medzi M a N, expl. repr. range(M, N, [M|Ns]): -M<N, M 1 is M+1, range(M 1, N, Ns).

Logické výrazy

Logické výrazy

DFS w 390 w Okompilator 460

DFS w 390 w Okompilator 460

Seznam všech řešení w Všechny kombinace dané velikosti v seznamu komb(0, _, [[]]). komb(N,

Seznam všech řešení w Všechny kombinace dané velikosti v seznamu komb(0, _, [[]]). komb(N, [], [[]]): - N>0. % vždy uspěje, i s prázdným výsl. komb(N, [X|L], V): - N>0, N 1 is N-1, komb(N 1, L, V 1), komb(N, L, V 2), map_insert(X, V 11), append(V 11, V 2, V). map_insert(X, []). map_insert(X, [L|Ls], [[X|L]|Ls 0]): -map_insert(Ls, Ls 0).

Reseni omezujicich podminek w Viz prednasky R. Bartaka w Mnoho uloh lze zformulovat jako

Reseni omezujicich podminek w Viz prednasky R. Bartaka w Mnoho uloh lze zformulovat jako reseni podminek v konecnych domenach: algebrogramy, barveni grafu, sudoku, krizovka

algebrogramy w konkrétní interface: několik možností § 1. alg([“AB*AB=CAB“, “A+D=C“], V). % a vztah

algebrogramy w konkrétní interface: několik možností § 1. alg([“AB*AB=CAB“, “A+D=C“], V). % a vztah „A“-A § 2. alg([a([A, B], *, [A, B], [C, A, B]), a([A], +, [D], [C])], V). w Metody § 1. Generuj a testuj, najednou § 2. Generuj postupně a testuj co nejdřív § 3. Generuj ve vhodném pořadí, nejvíce omezené prom. nejdřív w Pořadí staticky předpočítané, např. : některé prvky jsou známé (algebr. S čísly, sudoku) nebo různě variabilní (křížovka, s tajenkou) § 4. Dynamický výběr proměnných, podle počtu možných hodnot § A další: Constraint (Logic) Programming, zde konečné domény w Voláme testy, tj. omezení, nejdřív a systém si je uloží, pak generuje ahned vylučuje nepřípustné hodnoty.

Algebrobramy w 1. 2. 3. Interface g/1, t/1 – generuj a testuj g(A), g(B),

Algebrobramy w 1. 2. 3. Interface g/1, t/1 – generuj a testuj g(A), g(B), g(C), g(D), t(…). g(A), g(B), g(C), t([a([A, B], *, [A, B], [C, A, B])]), g(D), … g(B), t([a([B], *, [B], [_, B])]), g(A), t(…), g(C), t(. . , ), … w Pořadí testů volíme, abychom mohli co nejdřív (#gen. ) otestovat co nejvíc (#testů) a co nejvíc prořezali (#výsl. ) w t/1 považuje volné proměnné za existenční 4. idea: Ke každé proměnné si pamatujeme seznam hodnot, pro které existuje nejaké řešení (nemožné hodnoty vyloučíme), dynamicky vybíráme nejvíce omezenou proměnnou. g(X): -member(X, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]).

Generuje a testuj w% ? - gen 1([A 11, A 12, A 13, .

Generuje a testuj w% ? - gen 1([A 11, A 12, A 13, . . , A 21, A 22, A 23, . . ], [1, 2, 3, 4, 5, 6, 7, 8, 9]), data 1([A 22 -3, A 42 -5, . . ]), test 1([alldiff([A 11, A 12. . A 19]), . . alldiff([A 11, A 21. . A 91]) alldiff([A 11, A 12, A 13, A 21, A 22, A 23, A 31, A 32, A 33]), . . ]). - Neefektivni - Lepe: gen. castecne a testuj; gen. v poradi , gen. dynamicky

Programování s omezujícími podmínkami w Prolog řeší rovnice nad “symbolickými” výrazy w jiné domény:

Programování s omezujícími podmínkami w Prolog řeší rovnice nad “symbolickými” výrazy w jiné domény: reálná čísla, konečné domény, řetězce, množiny, grafy. . . w 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í w zjednodušené podmínky (vyřešený tvar) w posloupnost řešení § př. : rovnice nad reálnými čísly w vyřešené lineární rovnice a nerovnice s par. w zbylé nelineární podm.

Konečné domény w řešení kombinatorických problémů § grafy, plánování. . . § místo “generuj

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