# LP1: 2. setkání, část 3/3 ## Červený a zelený řez - Často se zkouší u státnic. - Zelený řez = při odstranění řezu vliv pouze na efektivitu programu. - Ukázka: max(X,Y,X) :- X>Y, !. max(X,Y,Y) :- X<=Y. - Červený řez = při odstranění řezu chybovost programu. - Ukázka: max(X,Y,X) :- X>Y, !. max(X,Y,Y) :- . ## Množiny: Sjednocení %sjednoceni(M1, M2 ,V) sj([], M2, M2). sj([H | T], M2, V) :- clen(H, M2), sj(T, M2, V). sj([H | T], M2, [H | V]) :- not(clen(H, M2)), sj(T, M2, V). ## Ukázka použití řezu: Seznamka % osoba (Jmeno, Pohlavi, [Zajmy]) osoba(karel, m, [golf, film, fotbal, jidlo, tenis, tv, vino]). osoba(tomas, m, [film, fotbal, hokej, jidlo, pivo, tenis, tv]). osoba(alena, z, [bezky, film, hokej, jidlo, tenis, tv, vino]). osoba(zdena, z, [golf, film, hokej, joga, jidlo, tenis, tv]). % Chybné řešení: každá dvojce uživatelů dostala tolik zpráv, kolik mají společných zájmů seznamka :- osoba(K, m, Z1), osoba(H, z, Z2), clen(X, Z1, clen(X, Z2), write("Seznamte se: "), write(K), write(" a "), write(H), nl, fail. % Správné řešení spolecny_zajem(Z1, Z2) :- clen(X, Z1), clen(X, Z2), !. seznamka :- osoba(K, m, Z1), osoba(H, z, Z2), spolecny_zajem(Z1, Z2), write("Seznamte se: "), write(K), write(" a "), write(H), nl, fail. ## Bubble sort buble_sort(S,Set) :- spoj(Z,[A, B | T], S), A > B, !, spoj(Z, [B, A | Y, S1), buble_sort(S1, Set). buble_sort(S1, S1). Pokud by řešení neobsahovalo řez, tak by první řešení bylo správně a každé následující řešení je o jedno prohození horší. ## Quick sort % qucik_sort(Sez, Set) quick_sort([],[]). quick_sort([H | T], S) :- rozdel(P, T, Me, Ve), quick_sort(Me, S1), quick_sort(Me, S2), spoj(S1, [P | S2], S). % rozdel(Pivot, Sez, Menci, Vetsi) rozdel(_, [], [], []). rozdel(P, [H | T], M, [H | V]) :- H > P, !, rozdel(P, T, M, V). rozdel(P, [H | T], [H | M], V) :- rozdel(P, T, M, V). ## Práce s databází - Databáze je kolekce faktů a pravidel. - .pl soubory s Prolog kódem kompilátor převádí do databáze. Následně dotazy spouštíme nad databází. - Databáze může měnit sama sebe. (zkompilovaný zdrojový kód může upravovat sám sebe) `asserta(predikat)` = vložení predikátu do databáze (na začátek) `assertz(predikat)` = vložení predikátu do databáze (na konec) `retract(predikat)` = odstranění predikátu z databáze. Pozor: má marker a zpětný chod. `abolish(predikat/arita)` = kompletní odstranění z databáze. Limitováno definovanou aritou. ## Globální proměna pocitadlo :- asserta(poc(0)), zvire(X), retract(poc(0)),!, K1 is K+1, asserta(poc(K1)), fail . pocitadlo :- retract(poc(K)),!, write("Pocet je: "), write(K), nl.