====== Státní závěrečná zkouška ====== ===== Logika ===== ^ A ^ B ^ ¬A ^ ¬B ^ A ∨ B ^ A ∧ B ^ A ⇒ B ^ A ⇔ B ^ | F | F | T | T | F | F | T | T | | F | T | T | F | T | F | T | F | | T | F | F | T | T | F | F | F | | T | T | F | F | T | T | T | T | ==== Zákony výrokové logiky ==== ^ # ^ Název ^ IN ^ OUT ^ | 1 | Zákon ekvivalence | A ⇔ B | (A ⇒ B) ∧ (B ⇒ A) | | 2 | Zákon implikace | A ⇒ B | ¬A ∨ B | | 3 | Zákony komutativní | A ∨ B | B ∨ A | |:::|:::| A ∧ B | B ∧ A | | 4 | Zákony asociativní | A ∧ (B ∧ C) | (A ∧ B) ∧ C | |:::|:::| A ∨ (B ∨ C) | (A ∨ B) ∨ C | | 5 | Zákony distributivní | A ∨ (B ∧ C) | (A ∨ B) ∧ (A ∨ C) | |:::|:::| A ∧ (B ∨ C) | (A ∧ B) ∨ (A ∧ C) | | 6 | Zákony zjednodušení disjunkce | A ∨ T | T | |:::|:::| A ∨ F | F | |:::|:::| A ∨ A | A | |:::|:::| A ∨ (A ∧ B) | A | | 7 | Zákony zjednodušení konjunkce | A ∧ T | A | |:::|:::| A ∧ F | F | |:::|:::| A ∧ A | A | |:::|:::| A ∧ (A ∨ B) | A | | 8 | Zákon vyloučení třetího | A ∨ ¬A | T | | 9 | Zákon sporu | ¬(A ∨ ¬A) | F | | 10 | Zákon identity | A | A | | 11 | Zákon negace | ¬(¬A) | A | | 12 | Zákony De Morganovy | ¬(A ∧ B) | ¬A ∨ ¬B | |:::|:::| ¬(A ∨ B) | ¬A ∧ ¬B | | 13 | Eliminace AND | A1 ∧ A2 ∧ … ∧ An ⇒ Ai; i ∈ <1, n> || | 14 | Zavedení OR | Ai ⇒ A1 ∨ A2 ∨ … ∨ An; i ∈ <1, n> || | 15 | Přesun kvantifikátorů doleva (x se nevyskytuje v B!) | Qx(A) ∨ B | Qx(A ∨ B) | |:::|:::| Qx(A) ∧ B | Qx(A ∧ B) | | 16 | Přesun negace dovnitř | ¬(∀x(A)) | ∃x(¬A) | |:::|:::| ¬(∃x(A)) | ∀x(¬A) | | 17 | Distributivní zákon pro kvantifikátory | ∀x(A) ∧ ∀x(B) | ∀x(A ∧ B) | |:::|:::| ∃x(A) ∨ ∃x(B) | ∃x(A ∨ B) | | 18 | Přejmenování vázaných proměnných | ∀x(A(x)) ∨ ∀x(B(x)) | ∀x∀y(A(x) ∨ B(y)) | |:::|:::| ∃x(A(x)) ∧ ∃x(B(x)) | ∃x∃y(A(x) ∧ B(y)) | ==== Rezoluční metoda ==== Abychy mohl rezolvovat, musím: -Disjunktivní normální forma (//a ∨ b ∨ c ∨ d//) -Prenexní normální forma (přejmenovat, všechny kvantifikátory doleva, //∃x∀zQ(x,z)⇒∃x∃zQ(x,z) ⇔ ∃x∀zQ(x,z)⇒∃v∃wQ(v,w) ⇔ ∃x∀z∃v∃w(Q(x,z)⇒Q(v,w))//) -Skolemova normální forma (zbavení se ∃, proměnné nahazeny konstantami (funkcemi), //∃x∀z∃v(Q(x,z)⇒Q(v,x)) ⇔ ∀z∃v(Q(a,z)⇒Q(v,a)) ⇔ ∀z(Q(a,z)⇒Q(f(z),a))//) === Příklad === Z následující databáze *Kdo senučil, neumí rezoluční metodu. *Kdo umí rezoluční metodu, získá body. *Kdo získá body, složí zkoušku z IZU. *Někdo složí zkoušku z IZU, přestože se neučil. dokažte pomocí rezoluční metody tvrzení: *Někdo složí zkoušku z IZU, přestože neumí rezoluční metodu. ---- *∀x(¬učil(x) ⇒ ¬umí(x)) *∀x(umí(x) ⇒ body(x)) *∀x(body(x) ⇒ zkouška(x)) *∃x(zkouška(x) ∧ ¬učil(x)) *¬∃x(zkouška(x) ∧ ¬umí(x)) ---- *∀x(učil(x) ∨ ¬umí(x)) *∀x(¬umí(x) ∨ body(x)) *∀x(¬body(x) ∨ zkouška(x)) *∃x(zkouška(x) ∧ ¬učil(x)) *∀x(¬zkouška(x) ∨ umí(x)) ---- -{učil(x), ¬umí(x)} -{¬umí(x), body(x)} -{¬body(x), zkouška(x)} -{zkouška(a)} -{¬učil(a)} -{¬zkouška(x), umí(x)} ---- *{umí(a)} //rezolventa z 6 a 4, [z/a]// *{učil(a)} //rezolventa z 7 a 1, [z/a]// ***{}** ===== Prolog ===== ==== Zásobník ==== push(E, T, [E|T]). %vložení prvku pop(E, [E|T], T). %výběr prvku ==== Fronta ==== enqueue(E, [], [E]). %vložení prvku enqueue(E, [H|T2], [H|T3]) :- enqueue(E, T2, T3). dequeue(E, [E|T], T). %výběr prvku ==== Fronta s prioritou ==== insert(E, [], [E]). %vložení prvku insert(E, [H|T], [E, H|T]) :- precedes(E, H). insert(E, [H|T2], [H|T3]) :- precedes(H, E), insert(E, T2, T3). precedes(A, B) :- A < B. %platí pouze pro čísla! dequeue(E, [E|T], T). %výběr prvku ==== Množina ==== add(E, S, S) :- member(E, S), !. %vložení prvku add(E, S, [E|S]). delete(E, [], []). %výběr prvku delete(E, [E|T], T) :- !. delete(E, [H|T2], [H|T3]) :- delete(E, T2, T3). intersection([], _, []). %průnik dvou množin intersection([H|T1], S2, [H|T3]) :- member(H, S2), !, intersection(T1, S2, T3). intersection([H|T1], S2, S3) :- intersection(T1, S2, S3). union([], S, S). %sjednocení dvou množin union([H|T], S2, S3) :- union(T, S2, S4), add(H, S4, S3). difference([], _, []). %rozdíl dvou množin difference([H|T], S2, S3) :- member(H, S2), difference(T, S2, S3). difference([H|T1], S, [H|T3]) :- not(member(H, S)), difference(T1, S, T3). subset([], _). %testuje, zda první množina je podmnožinou druhé subset([H|T], S) :- member(H, S), subset(T, S). equal(S1, S2) :- subset(S1, S2), subset(S2, S3). %testuje rovnost množin ===== Lisp ===== ==== Zásobník ==== (defun push (E L) (cons E L)) ;vložení prvku (defun pop (L) ;výběr prvku (cond ((null L) (cond ((print "error – stack is empty!") L))) ((print (car L)) (cdr L)))) ==== Fronta ==== (defun enqueue (E L) (append L (cons E nil))) ;vložení prvku (defun dequeue (L) (cond ((null L) (cond ((print "error – queue is empty!") L))) ;výběr prvku ((print (car L)) (cdr L)))) ==== Fronta s prioritou ==== (defun insert (E L) ;vložení prvku (cond ((null L) (cons E L)) ((precedes E (car L)) (cons E L)) (T (cons (car L) (insert E (cdr L)))))) (defun precedes (A B) (< A B)) ;platí pouze pro čísla! (defun dequeue (L) (cond ((null L) (cond ((print "error – queue is empty!") L))) ;výběr prvku ((print (car L)) (cdr L)))) ==== Množina ==== (defun add (E L) ;vložení prvku (cond ((member E L) L) (T (cons E L)))) (defun delete (E L) ;výběr prvku (cond ((null L) L) ((equal E (car L)) (cdr L)) (T (cons (car L) (delete E (cdr L)))))) (defun intersection (L1 L2) ;průnik dvou množin (cond ((null L1) nil) ((member (car L1) L2) (cons (car L1) (intersection (cdr L1) L2))) (T (intersection (cdr L1) L2)))) (defun union (L1 L2) ;sjednocení dvou množin (cond ((null L1) L2) ((member (car L1) L2) (union (cdr L1) L2)) (T (cons (car L1) (union (cdr L1) L2))))) (defun difference (L1 L2) ;rozdíl dvou množin (cond ((null L1) nil) ((member (car L1) L2) (difference (cdr L1) L2)) (T (cons (car L1) (difference (cdr L1) L2))))) (defun subset (L1 L2) ;testuje, zda první množina je podmnožinou druhé (cond ((null L1) T) ((member (car L1) L2) (subset (cdr L1) L2)) (T nil))) (defun equal_set (L1 L2) ;testuje rovnost množin (and (subset L1 L2) (subset L2 L1)))