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