---
# System prepended metadata

title: 'LP1: 2. setkání, část 3/3'

---

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