--- tags: Specializace --- # ML 2. Výpočetní logika *Složitost a vyčíslitelnost problému splnitelnosti. Rezoluční metoda ve výrokové a predikátové logice. Jazyk Prolog, relační algebra a Datalog. Tablové důkazy ve výrokové, predikátové a modální logice. Přirozená dedukce. Induktivní inference ve výrokové a predikátové logice. Bisimulace a temporální logiky. (IA008)* - Zdroje - <https://is.muni.cz/auth/el/fi/podzim2020/IA008/um/> - <https://www.fi.muni.cz/usr/kucera/teaching/logic/log.pdf> - <https://www.fi.muni.cz/~popel/lectures/bak_logika/> - <http://www.cs.ubbcluj.ro/~gabis/ml/ML-books/McGrawHill%20-%20Machine%20Learning%20-Tom%20Mitchell.pdf> - A modern approach to AI - [Popelova stránka na computational logic](https://www.fi.muni.cz/~popel/lectures/complog/index2015.html) - je tam skoro všechno! :wink: :::danger **TODO** - Revize jestli nic nechybí, případně přeformátovat ::: ## Výroková logika ### Syntax - Tvořena abecedou výrokové logiky: - Znaky pro výrokové proměnné $A, B, C, ...,$ kterých je spočetně mnoho; - logické spojky $\wedge, \vee, \neg, \to, \leftrightarrow$ - závorky $($ a $)$ - Formule výrokové logiky je slovo nad abecedou výrokové logiky: - každý znak pro výrokovou proměnnou je (atomická) formule - je-li slovo $\varphi$ formule, pak i $\neg \varphi$ je formule - jsou-li slova $\varphi_1, \varphi_2$ formule, pak také $(\varphi_1 \circ \varphi_2)$ je formule, kde $\circ \in \{\wedge, \vee, \to, \leftrightarrow\}$ ### Sémantika - Mějme zobrazení pravdivostního ohodnocení (valuaci) $v$, které každé výrokové proměnné přiřadí hodnotu 0 nebo 1 $$v: Variables \to \{0, 1\}$$ - Valuaci lze dále induktivně rozšířit na všechny výrokové formule: $$ \begin{aligned} v(\neg\varphi) &= \begin{cases} 0 &\text{jestliže } v(\varphi) = 1 \\ 1 &\text{jinak } \end{cases} \\ v(\varphi_1 \wedge \varphi_2) &= \begin{cases} 0 &\text{jestliže } v(\varphi_1) = 0 \text{ nebo } v(\varphi_2) = 0 \\ 1 &\text{jinak } \end{cases}\\ v(\varphi_1 \vee \varphi_2) &= \begin{cases} 0 &\text{jestliže } v(\varphi_1) = 0 \text{ a současně } v(\varphi_2) = 0 \\ 1 &\text{jinak } \end{cases}\\ v(\varphi_1 \to \varphi_2) &= \begin{cases} 0 &\text{jestliže } v(\varphi_1) = 1 \text{ a současně } v(\varphi_2) = 0 \\ 1 &\text{jinak } \end{cases}\\ v(\varphi_1 \leftrightarrow \varphi_2) &= \begin{cases} 0 &\text{jestliže } v(\varphi_1) = 0 \text{ a současně } v(\varphi_2) = 0 \text{ nebo } \\& v(\varphi_1) = 1 \text{ a současně } v(\varphi_2) = 1 \\ 1 &\text{jinak } \end{cases} \end{aligned} $$ ### Terminologie - Výroková formule $\varphi$ je - **pravdivá** (resp. nepravdivá) při valuaci $v$, pokud $v(\varphi) = 1$ (resp. $v(\varphi) = 0$); - **splnitelná**, jestliže existuje valuace $v$ taková, že $v(\varphi) = 1$; - **tautologie**, jestliže $v(\varphi) = 1$ platí pro každou valuaci $v$. - Soubor $T$ výrokových formulí je splnitelný, jestliže existuje valuace $v$ taková, že $v(\varphi) = 1$ pro každé $\varphi \in T$. - Formule $\varphi$ je **logickým důsledkem** souboru formulí $T$, psáno $T \vDash \varphi$, jestliže $v(\varphi) = 1$ pro každou valuaci $v$ takovou, že $v(\psi) = 1$ pro každou formuli $\psi$ ze souboru $T$. - ![](https://i.imgur.com/dhp3SJb.png) - Formule $\varphi$ a $\psi$ jsou **ekvivalentní**, psáno $\varphi \approx \psi$ nebo $\varphi \equiv \psi$, pokud pro každé $v$ platí $v(\varphi)=v(\psi)$. Nebo taky pokud právě $\varphi \vDash \psi$ a $\psi \vDash \varphi$. ### Ekvivalentní úpravy #### De Morganovy zákony - $\neg(\varphi \wedge \psi) \equiv \neg\varphi \vee \neg\psi$ - $\neg(\varphi \vee \psi) \equiv \neg\varphi \wedge \neg\psi$ #### Distributivní zákon - $\varphi \wedge (\psi \vee \xi) \equiv (\varphi \wedge \psi) \vee (\varphi \wedge \xi$) - $\varphi \vee (\psi \wedge \xi) \equiv (\varphi \vee \psi) \wedge (\varphi \vee \xi$) ### Normální formy - **Literál** je formule $A$ nebo $\neg A$, kde $A$ je výroková proměnná. - **Klauzule** je formule tvaru $l_1 \vee ... \vee l_n$, kde $n \geq 1$ a $l_i$ je literál. - **Duální klauzule** je formule tvaru $l_1 \wedge ... \wedge l_n$, kde $n \geq 1$ a $l_i$ je literál. - Formule v **konjuktivní normální formě (CNF)** je formule tvaru $C_1 \wedge ... \wedge C_m$, kde $m \geq 1$ a každé $C_i$ je klauzule. - Formule v **disjunktivní normální formě (DNF)** je formule tvaru $C_1 \vee ... \vee C_m$, kde $m \geq 1$ a každé $C_i$ je duální klauzule. ## Složitost a vyčíslitelnost problému splnitelnosti ### $\text{P}$ a $\text{NP}$ problémy - $\text{P}$ problémy lze rozhodnout nějakým deterministickým turingovým strojem TM v polynomiálním čase. - $\text{NP}$ problémy lze rozhodnout nějakým nedeterministickým TM v polynomiálním čase. - "Řešení" problému lze deterministickým TM v polynomiálním čase: - nalézt, pokud je problém v $\text{P}$; - ověřit, pokud je problém v $\text{NP}$ (když nám řešení někdo dodá). - Alternativní definice $\text{NP}$: problém je $\text{NP}$ $\leftrightarrow$ existuje pro něj polynomiální verifikátor (tj. lze řešení ověřit v polynomiálním čase). Pro připomenutí ![image](https://hackmd.io/_uploads/HydWvgeIR.png =500x) ### Problém splnitelnosti $\text{SAT}$ - $\text{SAT}$ je problém rozhodnout, zda je daná výroková formule splnitelná tj. zdali existuje nějáká valuace, pro kterou je formule pravdivá. - $\text{SAT}$ je $\text{NP}$-úplný (**Cookova-Levinova věta**) - Důkaz - Pro dokázání NP-úplnosti, stačí ukázat, že je v NP a že se na něj dá redukovat libovolný NP problém - Problém $\text{SAT}$ je $\text{NP}$. - poskytnuté řešení (tj. valuaci), lze deterministicky ověřit v polynomiálním čase vyhodnocením formule - Libovolný problém $A \in \text{NP}$ lze redukovat na $SAT$: - Hlavní myšlenka důkazu je, že uvažujeme nedeterministický TM rozhodující problém $A$ v polynomiálním čase, jehož vstupní slovo $w$ zakódujeme do formule $\varphi$. Daný TM pak $w$ akceptuje iff $\varphi$ je splnitelné. - Konstrukce formule jde udělat v polynomiálním čase. Její délka je taktéž polynomiální vzhledem k délce $w$. - viz - [Wiki](https://en.wikipedia.org/wiki/Cook%E2%80%93Levin_theorem#Proof) - [Harvard](http://people.seas.harvard.edu/~cs125/fall14/lec15.pdf) - [Video od Strejdy](https://is.muni.cz/auth/el/fi/podzim2020/IB107/um/9.3-NP.m4v) #### Problém splnitelnosti vo výrokovej logike - DPLL algoritmus pre CNF-SAT: $O(2^n)$ time complexity #### Problém splnitelnosti v predikátové logice - je nerozhodnutelný ![](https://i.imgur.com/CRSfGT4.png) ## Predikátová logika ### Syntax - Tvořena **jazykem**. Jazyk je systém **predikátových** a **funkčních symbolů**, kde u každého symbolu je dána jeho **četnost (arita)**. Pokud jazyk neobsahuje rovnost pak musí obsahovat alespoň jeden predikátový symbol. - Abeceda predikátové logiky je tvořena: - Znaky pro proměnné $x, y, z, ...$ - Predikátové a funkční symboly - Např. $P, R,...$ a $f, g, ...$ - Funkce vrací $hodnotu$, predikát vrací výroky (jen $True/False$ ?) - Znaky pro logické spojky $\wedge, \vee, \neg, \to, \leftrightarrow$ - Znaky pro kvantifikátory: - Univerzální $\forall$ - Existenční $\exists$ - Čárka $,$ a závorky $($ a $)$ - Pokud je jazyk s rovností, pak obsahuje symbol $=$ #### Termy - **Term** jazyka $\mathcal{L}$ je slovo $t$ nad abecedou jazyka $\mathcal{L}$. Slovo $t$ má jeden z následujících tvarů: - proměnná; - $f(t_1, ..., t_n)$, kde $f$ je funkční symbol a $n$ je arita $f$. - Term je uzavřený, jestliže neobsahuje proměnné. - Funkční symboly arity 0 jsou konstanty a píšeme je bez závorek. #### Formule - **Formule** jazyka $\mathcal{L}$ je slovo $\varphi$ nad abecedou jazyka $\mathcal{L}$ následujícího tvaru: - $P(t_1, ..., t_n)$, kde $P$ je predikátový symbol arity $n$ a $t_1, ..., t_n$ jsou termy - $t_1 = t_2$, kde $t_1, t_2$ jsou termy - $\neg\psi$, kde $\psi$ je formule - $(\psi_1 \circ \psi_2)$, kde $\psi_1, \psi_2$ jsou formule a $\circ \in \{\wedge, \vee, \to, \leftrightarrow\}$ - $\forall x \psi$, kde $x$ je proměnná a $\psi$ je formule - $\exists x \psi$, kde $x$ je proměnná a $\psi$ je formule - **Volný výskyt proměnné** (ukážeme na příkladu): - Volné výskyty jsou vyznačeny červeně - $\forall x P(x, \color{red}{y}) \vee \forall y P(\color{red}{x}, y)$ - $\forall x (P(x, \color{red}{y}) \vee \forall y P(x, y))$ - Proměnná je **volná** (resp. vázaná), má-li ve formuli volný (resp. vázaný) výskyt. - Formule je **uzavřená** (také sentence), jestliže v ní žádná proměnná nemá volný výskyt. #### Substituce - Term $t$ je **substituovatelný** za proměnnou $x$ ve formuli $\varphi$, jestliže žádný výskyt proměnné v termu $t$ se nestane vázaným po provedení substituce termu $t$ za každý volný výskyt proměnné $x$ ve formuli $\varphi$. - $\varphi(x/t)$ značí substituci $t$ za $x$ v $\varphi$. Alternativně značíme $\varphi[x \mapsto t$]. - Příklady: - Ve formuli $\exists z:x + y = z$ můžeme za $x$ substituovat term $y + 3$. - Ve formuli $\exists z:x + y = z$ nemůžeme za $x$ substituovat term $y + z$, protože proměnná $z$ se stane vázanou proměnnou. - Pokud na problematické substituci trváme, musíme přejmenovat vázané proměnné: - např. $\exists z(x=z+z)[x \mapsto z]$ ~> $\exists u (z=u+u)$ #### Unifikace - Pokud na termy $t_1$ a $t_2$ aplikujeme substituce tak, aby $t_1 = t_2$, hovoříme o **unifikaci**. - Příklady: - $t_1 = f(x, g(x))$ a $t_2 = f(c, x)$ můžeme unifikovat následujícím způsobem: - $t_1[x \mapsto c]$ a $t_2[x\mapsto g(c)]$, vyjde nám $t_1 = f(c, g(c))$ a $t_2 = f(c, g(c))$, tedy $t_1 = t_2$ - $t_1 = f(x, g(x))$ a $t_2 = f(x, y)$ - Můžeme unifikovat dvěma způsoby: - $t_2[y \mapsto g(x)]$ nebo - $t_1[x \mapsto g(x), t_2[x \mapsto g(x), y \mapsto g(g(x))]$ - (správně bychom měli nejdříve substituovat u obou termů $x \mapsto x$) - $t_1 = f(x)$ a $t_2 = g(x)$ nelze unifikovat ### Sémantika #### Realizace - Realizace $\mathcal{M}$ jazyka $\mathcal{L}$ je zadána: - neprázdným souborem $M$, které nazýváme **univerzem** (případně **nosičem**). Prvky univerza nazýváme **individui**. - přiřazením, které každému $n$-árnímu predikátovému symbolu $P$ přiřadí $n$-ární **relaci** $P_\mathcal{M}$ na $M$; - přiřazením, které každému $m$-árnímu funkčnímu symbolu přiřadí **funkci** $f_\mathcal{M}: M^m \to M$. - **Ohodnocení** je zobrazení přiřazující proměnným prvky univerza $M$. - **Realizace termu** $t$ při ohodnocení $e$ v realizaci $\mathcal{M}$, psáno $t^{\mathcal{M}}[e]$ (případně jen $t[e]$, je-li je $\mathcal{M}$ jasné z kontextu), definujeme induktivně takto: - $x[e] = e(x)$ - $f(t_1, ..., t_m)[e] = f_{\mathcal{M}}(t_1[e], ..., t_m[e])$ - Nyní definujme sémantiku formulí: - Říkáme, že formule $\varphi$ je pravdivá v $\mathcal{M}$ při ohodnocení $e$, jestliže $\mathcal{M}\vDash \varphi[e]$. - Jesliže $\mathcal{M}\vDash \varphi[e]$ pro každé $e$, pak $\varphi$ je pravdivé v $\mathcal{M}$, psáno $\mathcal{M} \vDash \varphi$. - $\mathcal{M} \vDash \varphi[e]$ definujeme induktivně: - $\mathcal{M} \vDash P(t_1, ..., t_m)[e]$ právě když $(t_1[e], ..., t_m[e]) \in P_\mathcal{M}$ - $\mathcal{M} \vDash \neg\psi[e]$ právě když neplatí $\mathcal{M} \vDash \psi[e]$ - $\mathcal{M} \vDash (t_1 = t_2)[e]$ právě když $t_1[e]$ a $t_2[e]$ jsou stejná individua - $\mathcal{M} \vDash (\psi \to \xi)[e]$ právě když $\mathcal{M} \vDash \xi[e]$ nebo neplatí $\mathcal{M} \vDash \psi[e]$ - (analogicky pro ostatní spojky) - $\mathcal{M} \vDash \forall x \psi[e]$ právě když $\mathcal{M} \vDash \psi[e(x/a)]$ pro každý prvek univerza M - $[e(x/a)]$ je funkce, která pro $x$ vrací $a$ a pro ostatní argumenty stejnou hodnotu jako $e$ - Sémantiku formule s existenčním kvantifikátorem máme již definovanou, protože platí: - $\exists x \varphi$ je ekvivalentní s $\neg\forall x \neg \varphi$ - Příklad: - Nechť univerzum jsou všechna přirozená čísla, - jazyk $\mathcal{L}$ obsahuje unární predikátový symbol $S$ a binární funkční symbol $+$. - Realizace $\mathcal{M}$: - $S$ bude realizován jako sudá čísla tzn. $S_\mathcal{M} = \{2, 4, 6, ...\}$ - $+$ bude realizován jako sčítání čísel (ve formuli použijeme infixový zápis). - Příklady formulí: - Neplatí $\forall x: S(x)$, protože např. $1 \notin S_\mathcal{M}$. - Platí $\forall x, y: (S(x) \wedge S(y)) \to S(x + y)$, protože součet dvou sudých čísel je opět sudý. ### Normální formy #### Prenexová normální forma (PNF) - Formule je v PNF, právě když jsou **všechny kvantifikátory na začátku formule**. Za kvantifikátory následuje **"jádro" v CNF nebo DNF**. - Pro každou formuli existuje ekvivalentní formule v konjuktivní (a taky disjunktivní) PNF. - Příklad: $\forall x \forall y \exists z \forall w ((P(x, y) ∨ ¬Q(z)) ∧ (R(x, w) ∨ R(y, w)))$ - ![](https://i.imgur.com/yCV3VKl.png) - ![](https://i.imgur.com/VnQrKXc.png) #### Skolemova normální forma (SNF) - SNF je **prenexová normální forma pouze s univerzálními kvantifikátory**. - Idea převodu: nahradíme proměnné, které se vážou na existenční kvantifikátor - Skolemizací dostaneme formuli, která **zachovává splnitelnost**, tzn. je splnitelná právě tehdy, když originální formule byla splnitelná Skolemovými funkcemi: - Převedeme $\forall x_1...\forall x_n \color{red}{\exists y} P(x_1,..., x_n, \color{red}{y})$ na $\forall x_1...\forall x_n P(x_1,..., x_n, \color{red}{f(x_1, ..., x_n)})$. - ![](https://i.imgur.com/6ZXKZSA.png) ## Rezoluční metoda ve výrokové a predikátové logice - Rezoluce je metoda založená na **vyvrácení** (dokazuje se nesplnitelnost formulí). - Je vhodná pro strojové dokazování (např. Prolog). ### Rezoluce ve výrokové logice - Budeme pracovat s klauzulemi: - Literál je formule $A$ nebo $\neg A$, kde $A$ je výroková proměnná. - Klauzule je formule tvaru $l_1 \vee ... \vee l_n$, kde $n \geq 1$ a $l_i$ je literál. - Píšeme $\{l_1, ..., l_n\}$ - Množinu klauzulí budeme chápat jako jejich konjunkci (tedy CNF) - Příklad: $\{\{\neg B\}, \{\neg A, B\}, \{A, B, C\}\}$ je $\neg B \wedge (\neg A \vee B) \wedge (A \vee B \vee C)$ - Rezoluční pravidlo: - Mějme dvě klauzule $\{L, A_0, ..., A_m\}$ a $\{\neg L, B_0, ..., B_m\}$. Jejich rezolventou je $\{A_0, ..., A_m, B_0, ..., B_n\}$. - Rezoluční důkaz: - Vstup: množina klauzulí $\phi$ - Výstup: `true` pokud je $\phi$ splnitelné, jinak `false`. - Snažíme se pomocí postupného aplikování rezolučního pravidla získat prázdnou rezolventu ($\{\emptyset\}$). Pokud takovou množinu najdeme, pak původní množina klauzulí není splnitelná. - Rezoluce je pro výrokovou logiku **korektní** a **úplná**. - Příklad - ![](https://i.imgur.com/s6YBCdM.png) - Davis-Putnam algoritmus - ![](https://i.imgur.com/XkOnfPg.png) - tl;dr - Vyber si proměnnou - Udělej všechny možné rezolventy s klauzulemi obsahující zvolenou proměnnou - Odstraň všechny "dostupné" klauzule obsahující zvolenou proměnnou a klauzule, které jsou tautologie (např. $\{C, \neg C\}$) - Opakuj - Příklad - ![](https://i.imgur.com/TiCARvE.png) - Bacha na notaci! $\{\} \neq \{\emptyset\} = \{\{\}\}$. V předešlém příkladu jsme dostali prázdnou rezolventu, takže $\phi = \{\emptyset\}$ a ne $\phi = \emptyset$. #### Zjemnění rezoluce - Jde o snahu zmenšit/omezit prohledávaný prostor ##### Lineární rezoluce - V každém rezolučním kroku použijeme rezolventu z předešlého kroku. - Lineární rezoluce je **korektní a úplná**. - ![](https://i.imgur.com/Egdhmex.png) ##### Hornovy klauzule - Hornova klauzule je kaluzule s nejvýše jedním pozitivním literálem. - Příklad: $\{A, \neg B, \neg C\}$ - Množina Hornových klauzulí je nesplnitelná iff umíme pomocí lineární rezoluce odvodit $\emptyset$. ##### SLD rezoluce - Je lineární rezoluce, kde klauzule jsou posloupnosti a ne množiny. Rezolvujeme vždy nejlevější literál aktuální klauzule. - SLD rezoluce je **korektní a úplná pro Hornovy klauzule**. - Příklad - ![](https://i.imgur.com/2BacTc1.png) #### Rezoluce v predikátové logice - Pracujeme s formulemi v SNF, kvantifikátory nepíšeme. - Příklad formule: $∀x∀y((P(x, f(x)) ∨ ¬Q(y)) ∧ (¬R(f(x)) ∨ ¬Q(y)))$ reprezentujeme jako $\{\{P(x, f(x)), ¬Q(y)\}, \{¬R(f(x)), ¬Q(y)\}\}$ - Mezi stejně pojmenovanými proměnnými v různých klauzulích není žádná vazba, potřebujeme je unifikovat. - Příklad - ![](https://i.imgur.com/W7RSK4d.png) - Rezoluce v predikátové logice (bez rovnosti) je **korektní a úplná**. ## Jazyk Prolog ### Syntax - Datové objekty: - **termy** jsou konstanty, proměnné nebo složené termy - konstanty: - celá čísla `0`, `123`, `-12` - desetinná čísla `1.0`, `4.5E7`, `-0.12e+8` - atomy jsou general-purpose jména `'John Doe'`, `s1` - proměnné: - řetězec začínající velkým písmenem `X`, `Hodnota` - složené termy: - `funktor(term_1, ..., term_n)` - Příklad: `point(X, Y, Z)` nebo `mother_child(eva, ivana)` - Prologovský program obsahuje množinu fakt a pravidel. - Pravidla: - Tvar `Head :- Body.` - Příklad: - `sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).` - `X, Y` jsou proměnné - Fakta: - Pouze klauzule bez těla - Příklad: - `father_child(lubomir, ales).` - Dotazy/cíle, na které se ptáme: - `?- sibling(lubomir, ales).` - jsou lubomir a ales sourozenci? - `?- sibling(lubomir, X).` - najde všechny sourozence lubomira - Celkově by mohl program vypadat takto: ```prolog mother_child(trude, sally). father_child(tom, sally). father_child(tom, erica). father_child(mike, tom). sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y). parent_child(X, Y) :- father_child(X, Y). parent_child(X, Y) :- mother_child(X, Y). ``` - A dotaz by se vyhodnotil takto: ```prolog ?- sibling(sally, erica). Yes ``` ### Sémantika - `u :- p, q, ..., t.` odpovídá v logice následující formuli $u ← p \wedge q \wedge ... \wedge t$, která odpovídá $u \vee \neg p \vee \neg q \vee ... \vee \neg t$, což je Hornova klauzule. - Dotaz se vyhodnocuje tak, že se dotaz zneguje a dokazuje sporem pomocí SLD rezoluce. - Příklad SLD-stromu - ![](https://i.imgur.com/VXoooEF.png) - Příklad jak vypadá přímo SLD rezoluce pro dva dotazy - ![](https://i.imgur.com/dCnKeMV.png) - Prologovský program **není korektní ani úplný**. - Prologovský interpretr používá jednodušší a nekorektní způsob unifikace, který ignoruje více výskytů jedné proměnné. - Unifikuje $p(x, f(x))$ na $p(f(y), f(y))$ (tedy $x \mapsto f(y)$ pro první $x$ a $x \mapsto y$ pro druhé $x$). - Úplný není protože se může prologovský program zacyklit (např. špatné pořadí pravidel). - Příklad: ![](https://i.imgur.com/YaZnXkT.png) #### Řezy - Při SLD rezoluci dochází k backtrackingu. Ten můžeme kontrolovat pomocí řezů. Ten uděláme pomocí `!`. - Příklad: ```prolog a(X, Y) :- b(X), !, c(Y). b(1). b(2). b(3). c(1). c(2). c(3). ``` Dotaz `?- a(Q, R)` nám vrátí: ```prolog Q=1 R=1; Q=1 R=2; Q=1 R=3; No ``` Jak vidíme, `Q` se unifikovalo pouze s prvním faktem `q(1).` a neuvažovalo další možnosti. - S řezy se musí pracovat opatrně, protože si můžeme "odstřihnout" správnou větev. ### Příklady kódů, rekurze a seznamy - [Prolog Tutorial](https://www.javatpoint.com/prolog) - [Jak funguje append a rekurze](http://cs.union.edu/~striegnk/learn-prolog-now/html/node47.html) - [Faktoriál](http://rosettacode.org/wiki/Factorial#Prolog) ## Relační algebra - viz [PB154](https://is.muni.cz/auth/el/fi/podzim2020/PB154/um/03-ch6-formal-query-languages.pdf) a [Kapitola 3: Relační model](https://www.fi.muni.cz/~xdohnal/lectures/PB154/czech/zezula03.pdf) - Procedurální dotazovací jazyk (kterým uživatel žádá informace z databáze). - Databáze je množina relací (tabulek). - Příklad | flight | from | to | price | | ------ | :----: | ---------: | ----: | | LH8302 | Prague | Frankfurt | 240 | | OA1472 | Vienna | Warsaw | 300 | | UA0870 | London | Washington | 800 | ### Syntax * základní operátory: výběr (selekce), projekce, sjednocení, rozdíl množin, kartézský součin, přejmenování * Operátory berou jednu nebo více relací jako vstup a vrací novou relaci jako výsledek. - booleovské operace $\cap, \cup, \setminus, All$ - kartézský součin $\times$ - Selekce $\sigma_{\varphi}(R)$, kde $\varphi$ je bool výraz. Selekce vybere všechny uspořádané n-tice z relace $R$, pro které podmínka platí. - Projekce $\pi_{u_1...u_n}(R)$ vrací z relace $R$ atributy $u_1...u_n$ v daném pořadí. - Natural join $R\bowtie S$ spojí dvě relace na společném atributu. - Příklad: - $\sigma_{\text{from}='Prague'}(R)$ | flight | from | to | price | | ------ | :----: | --------: | ----: | | LH8302 | Prague | Frankfurt | 240 | - $\pi_{price, flight}\sigma_{\text{from}='Prague'}(R)$ | price | flight | | ----- | :----: | | 240 | LH8302 | - Tady si to můžete vyzkoušet interaktivně 👉 <http://mufin.fi.muni.cz/projects/PA152en/relalg/>. ## Datalog - zjednodušená verze Prologu, která byla vyvinuta pro práci s databázemi. - nemá funkční symboly, řezy, negace apod. - Datalogový program se skládá z množiny Hornových klauzulí: - $p_0(\bar{X}) ← q_{0,0}(\bar{X}, \bar{Y}) ∧ ... ∧ q_{0,m_0}(\bar{X}, \bar{Y})$ ⋮ $p_n(\bar{X}) ← q_{n,0}(\bar{X}, \bar{Y}) ∧ ... ∧ q_{n,m_n}(\bar{X}, \bar{Y})$ kde $p_0, ..., p_n$ jsou nové relace a $q_ij$ jsou relace z databáze nebo některé nově utvořené relace z $p_0, ..., p_n$ query definovaná datalogovým programem mapuje databázi na relace $p_0, ..., p_n$ definované příslušnými formulemi ### Evaluace - Začni s prázdnými relacemi $p_0 = \emptyset, ..., p_n = \emptyset$. - Aplikuj každé pravidlo z programu a přidej n-tice do relací. - Opakuj dokud nevzniknou další relace. - Příklad: - ![](https://i.imgur.com/I1M0iX7.png) - Nejdříve přidáme do $\text{path}$ všechny hrany pomocí prvního pravidla. - ![](https://i.imgur.com/iqH5Rqf.png) - Druhé pravidlo nám říká, že pokud tam existuje tranzitivita mezi $X$ a $Y$ přes $Z$, tak tam přidej $(X, Y)$. - ![](https://i.imgur.com/VbPygFX.png) - Opět aplikujeme druhé pravidlo. - ![](https://i.imgur.com/V85zmhH.png) - Už nelze aplikovat žádné pravidlo, končíme. - Další příklad: - Mějme databázové schéma zadané takto: `Movie(title, year, length, inColor, studionName, producer)` - Chceme vrátit herce, kteří hráli v barevných filmech v roce 1950. Datalogový program v nějáké implementaci by mohl vypadat takto: - `MoviesColor50(t, y) :- Movie(t, y, l, c, s, p) AND y='1950' AND c='true'` - Více na [wiki](https://en.wikipedia.org/wiki/Datalog). ## Modální logika - jedná se o rozšíření predikátové logiky o tzv. modality (zahrnující výrazy jako jsou "**je možné, je nutné, je nemožné**") - používá se v přechodových systémech, což jsou orientované grafy: - $\mathfrak{S}=\left\langle S,\left(E_{a}\right)_{a \in A},\left(P_{i}\right)_{i \in I}, s_{0}\right\rangle$, kde - $S$ je množina stavů - $s_0$ je počáteční stav - $E$ je množina hran, kde každá hrana má danou "akci" $a$ (označení (label) hrany); $E_{a}$ kde "edge colours" $a \in A$ "akce" - $P$ množina unárních predikátů určující vlastnosti stavů; $P_{i}$ kde "vertex colours" $i \in I$ "vlastnosti" ![transition_system](https://i.imgur.com/uelSuWg.png) - mluvíme o "stavech", protože se mnohdy bavíme o stavech nějakého počítačového systému, programu, ... - využívá se ve formální verifikaci, grafových databázích, constraint satisfaction, ... - Syntax: - $\square\varphi$ - musí platit $\varphi$, vždy platí $\varphi$, ... - $\mathcal{G}, s \vDash \square\varphi$ platí iff pro všechny $s\to t$, pro které platí $\mathcal{G}, t \vDash \varphi$ (s a t jsou stavy, $s\to t$ je přechod ze stavu $s$ do stavu $t$) - $\LARGE\diamond\normalsize\varphi$ - může platit $\varphi$, někdy platí $\varphi$, ... - $\mathcal{G}, s \vDash \LARGE\diamond\normalsize\varphi$ platí iff existuje $s\to t$ platí $\mathcal{G}, t \vDash \varphi$ - Příklad: - $P\wedge \LARGE\diamond\normalsize Q$ - Ve stavu platí $P$ a existuje přechod do stavu kde platí $Q$ - $[a] \perp$ stav nemá žádný vystupní a-přechod - v teoretické informatice se setkáváme s temporální logikou, tedy stavy popisují nějáký čas (diskrétní nebo spojitý) - Příklady formulí temporální logiky: - $P$ nikdy neplatí - $\square\neg P$ - Po každém $P$ existuje nějaké $Q$ - $\square(P \to \LARGE\diamond\normalsize Q)$ - Až bude platit $P$, pak bude platit napořád - $\square(P \to \square P)$ - Existuje nekonečně mnoho P - $\square\LARGE\diamond\normalsize P$ ### Bisimulace - viz [(1)](http://web.mit.edu/cdg/www/teaching/modal%20logic%20guest%20lecture%2010-26.pdf), [(2)](https://en.wikipedia.org/wiki/Bisimulation), [(3)](https://staff.fnwi.uva.nl/d.j.n.vaneijck2/courses/lai0506/LAI11.pdf) - Každou formuli ve výrokové modální logice $\varphi$ můžeme převést na formuli predikátové logiky $\varphi^{*}(x)$, ale ne naopak => modální logika je tedy slabší. Převedeme takto: ![](https://i.imgur.com/pDQFYKN.png) - Důkaz: ![proof_ml_to_fol](https://i.imgur.com/ioyU67R.png) - Abychom ukázali, kdy je formule predikátové logiky ekvivalentní s formulí modální logiky, zavedeme si nejprve pojem *bisimulace*, která slouží k porovnávání dvou přechodových systémů. - Nechť $\mathcal{S}$ a $\mathcal{T}$ jsou přechodové systémy: - Bisimulace je relace $Z \subseteq S \times T$ pokud pro každou dvojici $(s, t) \in Z$ platí: - $s \in P \iff t \in P$ stavy mají stejné vlastnosti - pro každou hranu $s \to s'$ existuje $t \to t'$, kde $(s', t') \in Z$ - pro každou hranu $t \to t'$ existuje $s \to s'$, kde $(s', t') \in Z$ - stavy $\mathcal{S}, s$ a $\mathcal{T},t$ jsou bisimilární, pokud existuje bisimulace $Z$, kde $(s, t) \in Z$ ![](https://i.imgur.com/z1OqIU4.png) - Na první pohled to může připomínat isomorfismus, ale bisimulace je slabší; isomorfismus vyžaduje např. stejný počet stavů (a v kontextu zkoumání přechodových systémů to může být overkill). - příklad: - ![](https://i.imgur.com/ZmGsqXO.png) - přerušované čáry je bisimulace - Dva konečné přechodové systémy $\mathcal{S}$ a $\mathcal{T}$ jsou bisimilární iff platí $$ \mathcal{S} \vDash \varphi \iff \mathcal{T} \vDash \varphi \text{, pro každou modální formuli } \varphi $$ - Formule $\varphi(x)$ je bisimulation invariant pokud platí, že $$ \mathcal{G, s} \sim \mathcal{T, t} \text{ implies } \mathcal{S} \vDash \varphi(s) \iff \mathcal{T} \vDash \varphi(t) $$ - Takže formule v predikátové logice je ekvivalentní s modální formulí iff je bisimulation invariant. ## Temporální logiky - Motivace: předešlá modální logika je příliš slabá; pro praktické účely si ji rozšíříme. ### Linear Temporal Logic (LTL) - viz <https://en.wikipedia.org/wiki/Linear_temporal_logic> - ![](https://i.imgur.com/E1oMXob.png) - od obyčejné modální logiky se liší: - $\varphi U \psi$ - platí pokud $\varphi$ platí než narazíme na $\psi$ - finally $F\varphi := \intercal U\psi$ - nezajímá nás, co se děje před $\psi$ - generally $G\varphi := \neg F \neg \varphi$ všude platí $\varphi$ - ![](https://i.imgur.com/QyRNdlb.png) - formule z LTL můžeme převádět do predikátové logiky a do regulárních výrazů bez hvězdičky ### Computation Tree Logic (CTL and CTL*) - viz <https://en.wikipedia.org/wiki/Computation_tree_logic> - ![](https://i.imgur.com/bsHy18t.png) - state formulae máme pro výběr větví - $A$ všechny větve - $E$ existuje v nějáké větvi - path formulae máme pro cestu <!-- ### $\mu$-calculus ($L_\mu$) - viz <https://en.wikipedia.org/wiki/Modal_%CE%BC-calculus> - ![](https://i.imgur.com/M5MdtIs.png) --> ## Tablové důkazy ve výrokové, predikátové a modální logice - dokazovací metoda, pomocí které můžeme dokázat pravdivost či splnitelnost formulí - Postup: - ![](https://i.imgur.com/DAw4GXC.png =400x) - tedy opět dokazujeme sporem: - formuli, kterou chceme dokázat, přiřadíme `false` - pomocí pravidel chceme dojít ke kontradikci - pokud jsou všechny větve kontradikce, pak je formule pravdivá - pokud pouze jedna větev je kontradikce, pak je formule splnitelná - to, že je větev kontradikce znamená, že ve větvi existuje pro nějakou formuli $\psi$ $\psi true$ a zároveň $\psi false$ ### Výroková logika a predikátová logika - Pravidla: - ![](https://i.imgur.com/8nRL22Y.png) - Příklady: - ![](https://i.imgur.com/EMebUpX.png) - ![](https://i.imgur.com/2zqFo0j.png) ### Modální logika - Postup - ![](https://i.imgur.com/gfl9ahd.png) - Pravidla - ![](https://i.imgur.com/G9ugv0x.png) - ![](https://i.imgur.com/VZZcUHm.png) - Příklady - ![](https://i.imgur.com/dpKHt2j.png) - ![](https://i.imgur.com/ONrbM3o.png) - ![](https://i.imgur.com/JXDiyEY.png) ## Přirozená dedukce - ![](https://i.imgur.com/8Lnr9j8.png =400x) - ![](https://i.imgur.com/vqUn5qt.png =400x) - Pravidla pro výrokovou logiku - ![](https://i.imgur.com/QrqEmFD.png =400x) - Příklad pro výrokovou logiku - ![](https://i.imgur.com/xG4MpJl.png =400x) - Pravidla pro predikátovou logiku - ![](https://i.imgur.com/m18zLmW.png =400x) - Příklad - ![](https://i.imgur.com/i2e1iJd.png =400x) ## Induktivní inference ve výrokové a predikátové logice - indukce je proces hledání obecných hypotéz na základě pozorovaných dat - např. na základě dat, chceme umět predikovat kategorii apod. - v kontextu logiky budeme chtít umět najít hypotézu, která aproximuje nějakou booleovskou funkci na pozorovaných datech: - pozorovaná (trénovací data) $(x_1, y_1), ..., (x_n, y_n)$ - chceme aproximovat $f:\{0, 1\}^n \to \{0, 1\}$, konkrétně $y_i = f(x_i)$ - hledáme tedy takovou hypotézu, aby $h(x) \approx f(x)$ - příklad: - ![](https://i.imgur.com/0IGE72Y.png) - chceme predikovat `EnjoySport` na základě ostatních atributů - hypotézu hledáme v prostoru hypotéz - příklad hypotézy pro náš problém $(?, \text{Cold}, \text{High}, ?, ?, ?)$ - tj. `AirTemp` musí být `Cold`, `Humidity` musí být `High`, `?` označuje libovolnou hodnotu - jedná se o konjuktivní hypotézu, protože musí být splněny všechny podmínky hypotézy - hypotézy lze částečně seřadit podle jejich specificity (general-to-specific ordering) - $h_1 = (\text{Sunny}, ?, ?, \text{Strong}, ?, ?)$ - $h_2 = (\text{Sunny}, ?, ?, ?, ?, ?)$ - $h_2$ má méně podmínek a všechny pozitivní příklady, které označí $h_1$, $h_2$ označí stejným způsobem, je tedy obecnější (general); naopak $h_1$ je více specifická - hypotéza je konzistentní pokud $h(x) = f(x)$ pro pozorovaná data - obecně preferujeme jednodušší hypotézu - Ockhamova břitva ### Hledání hypotéz - nejnaivnější způsob je brute-force hledání v prostoru hypotéz (enumerace) - jeden z nejjednodušších způsobů je využití častečnému seřazení podle specificity a hledat od nejspecifictější hypotézy a postupně generalizovat - Find-S algoritmus - ![](https://i.imgur.com/5KDS0Q4.png) - ![](https://i.imgur.com/E7M9lYR.png) - pokud nalezena nejspecifičtější hypotéza zahrnuje i negativní příklady, pak neexistuje konzistentní konjunktivní hypotéza - nedostatky: - ignoruje negativní příklady a nekontroluje tím pádem konzistenci - náchylný na špatně anotované data (inkonzistentní data můžou velmi ovlivnit výsledek) $\cup$ - další způspb je vypočítat tzv. prostor verzí - množinu hypotéz, které jsou s daty konzistentní: - to uděláme pomoci algoritmu Candidate-Elimination, který spočítá nejobecnější a nejspecifičtější konzistentní hypotézy - ![](https://i.imgur.com/rXbqTCa.png) - ![](https://i.imgur.com/sXBSkSc.png) - viz - [Machine Learning od Toma Mitchella, kapitola 2](http://www.cs.ubbcluj.ro/~gabis/ml/ML-books/McGrawHill%20-%20Machine%20Learning%20-Tom%20Mitchell.pdf) - [PV056, vicemene vycuc z predesle kapitoly](https://is.muni.cz/auth/el/fi/jaro2019/PV056/um/62159239/ml-classification.pdf) - [AI2 z Matfyzu, kapitola 19 z Modern approach to AI](http://ktiml.mff.cuni.cz/~bartak/ui2/lectures/lecture10.pdf)