(*:maxLineLen=80:*) (* Vodite racuna kada preuzimate fajl da skinete thy, a ne htm - njega mozete koristiti samo za brz pregled zato sto je laksi za online citanje *) text\\newpage\ section \Klasična logika\ (* section \ Classical propositional logic \ *) theory Cas4_vezbe imports Main "HOL-Library.LaTeXsugar" begin (* \footnote{Dodati tekst iz: @{url \http://www21.in.tum.de/~ballarin/fomus/part1/part1.pdf\}} *) (*subsection \Podsećanje sa predavanja\*) subsection \Pravilo ccontr - klasična kontradikcija\ text\Početkom 20. veka određen broj matematičara izrazio je svoje kritike klasične matematike. Naime, u klasičnoj matematici se često postojanje nekog objekta dokazuje svođenjem na kontradikciju, tako što se dokaže da nije moguće da takav objekat ne postoji, iako se traženi objekat ne konstruiše efektivno. Razmotrimo naredni čuveni primer takvog dokaza. Dokazaćemo da postoje iracionalni brojevi $a$ i $b$ takvi da je $a^b$ racionalan broj. Razmotrimo broj ${\sqrt{2}}^{\sqrt{2}}$. Ako je on racionalan, tada je dokaz završen, jer možemo uzeti $a = \sqrt{2}$ i $b = \sqrt{2}$, znajući da je $\sqrt{2}$ iracionalan broj. Ako on nije racionalan, tada možemo uzeti da je $a = {\sqrt{2}}^{\sqrt{2}}$ i $b=\sqrt{2}$. I jedan i drugi broj je iracionalan, dok je $a^b$ = $({\sqrt{2}}^{\sqrt{2}})^{\sqrt{2}}$ = ${\sqrt{2}}^{(\sqrt{2} \sqrt{2})}$ = ${\sqrt{2}}^2 = 2$ racionalan broj. Time je dokaz završen. Dakle, dokazali smo tvrđenje o postojanju traženih brojeva, a da i dalje ne umemo eksplicitno da ih navedemo, jer zapravo ne znamo da li je ${\sqrt{2}}^{\sqrt{2}}$ racionalan ili iracionalan broj. Predstavnici tzv. \emph{konstruktivističke matematike} odbacuju takve dokaze i zahtevaju da dokazi postojanja nekih objekata uključuju i mogućnost njihove efektivne konstrukcije. Kao logička osnova konstruktivističke matematike pojavljuje se \emph{intuicionistička logika}. Intuicionistička logika odbacuje nekonstruktivne postupke dokazivanja koji su zasnovani na zakonu isključenja trećeg \A \ \ A\, kao i na zakonu dvostruke negacije \\ \ A \ A\. Dokazivanje svođenjem na kontradikciju je dopušteno samo za negativna tvrđenja: moguće je dokazati tvrđenje \\ A\ tako što se dokaže da iz pretpostavke \A\ sledi kontradikcija, ali nije dopušteno da se tvrđenje \A\ dokaže tako što se iz pretpostavke \\ A\ dokaže kontradikcija. Do sada su svi dokazi bili u okviru intuicionističke logike. Dokazi u klasičnoj logici podrazumevaju uvođenje bar još jednog novog, klasičnog pravila. U sistemu Isabelle/HOL jedna mogućnost je da se koristi \emph{pravilo klasične kontradikcije} @{text ccontr}: @{thm [mode=Proof] ccontr [no_vars]}. U udžbenicima matematičke logike, to pravilo se zapisuje ovako: $$\infer{P}{\infer*{False}{[\neg P]}}$$ Primetimo da smo za rad sa negacijom koristili smo pravilo uvođenja negacije @{text "notI:"} @{thm [mode=Proof] notI [no_vars]}, koje je slično pravilu klasične kontradikcije. Ključna razlika je ta što se pravilom uvođenja negacije dokaz kontradikcijom primenjuje samo na negirane formule, što je u skladu sa intuicionističkom logikom i konstruktivnom matematikom. Otuda se u intuicionističkoj logici lako dokazuje naredna lema:\ lemma shows "A \ \ \ A" apply (rule impI) apply (rule notI) apply (erule notE) apply assumption done text\Međutim, u klasičnoj logici važi pravilo duple negacije: \begin{exmp} @{text "\ \ A \ A"} \end{exmp} \ lemma shows "\ \ A \ A" apply (rule impI) \ \\ 1. \ \ A \ A\\ \ \\emph{Primetimo da ovde ne možemo uspešno primeniti pravilo \notE\ (što će biti prikazano u narednom dokazu) zato što ono očekuje da iz \\ P\ i \P\ možemo da izvedemo bilo šta. \\ P\ je ovde \\ \ A\, što znači da je \P\ u stvari \\ A\, i zato ono postaje preostali cilj koji se ne može dokazati.}\ \ \\emph{Primenjujemo pravilo \ccontr\.}\ apply (rule ccontr) \ \\ 1. \\ \ A; \ A\ \ False\\ \ \\emph{Pa sada možemo da primenimo pravilo \notE\ i jednostavno završavamo dokaz.}\ apply (erule notE) \ \\ 1. \ A \ \ A\\ apply assumption \ \\No subgoals!\\ done text\Dokaz, naravno, nije moguće izvršiti u intuicionističkoj logici.\ lemma shows "\ \ A \ A" \ \\emph{Jedino intuicionističko pravilo koje se može primeniti je \impI\}\ apply (rule impI) \ \\ 1. \ \ A \ A\\ \ \\emph{Jedino primenjivo pravilo je \notE\}\ apply (erule notE) \ \\ 1. \ A\\ \ \\emph{Cilj koj je dobijen je jasno nedokaziv, pa odustajemo od dokaza.}\ oops text \Dokažimo i narednu klasičnu teoremu koja ne važi u intuicionističkoj logici: \begin{exmp} @{text "(\ P \ P) \ P"} \end{exmp} \ lemma shows "(\ P \ P) \ P" apply (rule impI) \ \\ 1. \ P \ P \ P\\ \ \\emph{Ako bismo pokušali da primenimo \impE\ dobili bi \\ P\ kao novi cilj, što je nemoguće dokazati.}\ \ \\emph{Pa vidimo da je jedino primenjivo pravilo \ccontr\}\ apply (rule ccontr) \ \\ 1. \\ P \ P; \ P\ \ False\\ \ \\emph{Sada pokušavamo sa \impE\}\ apply (erule impE) \ \\ 1. \ P \ \ P\\ \ \\ 2. \\ P; P\ \ False\\ \ \\emph{I vidimo da je u prvom cilju pretpostavka ista kao zaključak}\ apply assumption \ \\ 1. \\ P; P\ \ False\\ \ \\emph{Primenjujemo \notE\}\ apply (erule notE) \ \\ 1. P \ P\\ apply assumption done text \ Od četiri smera de Morganovih zakona koji povezuju negaciju, disjunkciju i konjunkciju, tri važe i mogu se dokazati i u intuicionističkoj logici, dok je za dokaz narednog zakona potrebno upotrebiti i pravila klasične logike. \begin{exmp} @{text "\ (A \ B) \ \ A \ \ B"} \end{exmp} Često se nad disjunkcijom u zaključku primenjuje pravilo @{text ccontr}, što ćemo videti u narednom dokazu. \ lemma shows "\ (A \ B) \ \ A \ \ B" apply (rule impI) \ \\ 1. \ (A \ B) \ \ A \ \ B\\ \\\emph{Primena pravila \ccontr\ će prebaciti zaključak u negativnom obliku u pretpostavke, i zajedno sa preostalim pretpostavkama pokušavamo da dokažemo kontradikciju.}\ apply (rule ccontr) \ \\ 1. \\ (A \ B); \ (\ A \ \ B)\ \ False\\ \\\emph{Sada imamo dve pretpostavke na koje možemo primeniti isto pravilo (u ovom slučaju \notE\), možemo da biramo da li ćemo to pravilo primeniti na prvu ili drugu pretpostavku. Međutim ovde nam odgovara da izaberemo prvu pretpostavku (i da ne upotrebimo naredbu \back\), zato što je u njoj konjunkcija - a ta formula se prebacuje u zaključak. Pogodnije je u zaključku raditi sa konjunkcijom nego sa disjunkcijom; Napomena: pogledajte šta se dešava kada stavite back}\ apply (erule notE) \ \\ 1. \ (\ A \ \ B) \ A \ B\\ apply (rule conjI) \ \\emph{Sada prvo primenjujemo pravilo uvođenja konjunkcije i dobijamo dva nova cilja:}\ \ \\ 1. \ (\ A \ \ B) \ A\\ \ \\ 2. \ (\ A \ \ B) \ B\\ \\\emph{Sada dokazujemo prvi podcilj i ponovo primenjujemo pravilo \ccontr\.}\ apply (rule ccontr) \ \\ 1. \\ (\ A \ \ B); \ A\ \ False\\ \ \\ 2. \ (\ A \ \ B) \ B\\ apply (erule notE) \\\emph{Sada primenjujemo pravilo \notE\ na prvu pretpostavku jer nam u ovoj situaciji odgovara da imamo disjunkciju u zaključku.}\ \ \\ 1. \ A \ \ A \ \ B\\ \ \\ 2. \ (\ A \ \ B) \ B\\ apply (rule disjI1) \ \\ 1. \ A \ \ A\\ \ \\ 2. \ (\ A \ \ B) \ B\\ apply assumption \\\emph{Dokazan je prvi podcilj i sada dokazujemo drugi podcilj.}\ \ \\ 1. \ (\ A \ \ B) \ B\\ \\\emph{Ponovo primenjujemo pravilo \ccontr\ i završavamo dokaz na sličan način kao malopre.}\ apply (rule ccontr) \ \\ 1. \\ (\ A \ \ B); \ B\ \ False\\ apply (erule notE) \ \\ 1. \ B \ \ A \ \ B\\ apply (rule disjI2) \ \\ 1. \ B \ \ B\\ apply assumption \ \\No subgoals!\\ done text \ \begin{exmp} Pokazati klasični deo de-Morganovog zakona za kvantifikatore: @{text "(\ (\ x. P x)) \ (\ x. \ P x)"} \end{exmp} Napomena: Slično kao i u slučaju iskazne logike, ovo je jedino od četiri de-Morganova pravila za kvantifikatore, koje se dokazuje uz pomoć principa klasične logike. Intuitivno, ako važi pretpostavka \\ (\ x. P x)\, onda \P x\ nije tačno za svako \x\, odnosno postoji neko \a\ za koje \P a\ nije tačno. Odnosno, za koje važi \\ P a\. S obzirom na ovu činjenicu, možemo da zaključimo da postoji neko \x\ za koje je \\ P x\ tačno, tj. tačno je \\ x. \ P x\. \ lemma de_Morgan: shows "(\ (\ x. P x)) \ (\ x. \ P x)" apply (rule impI) \ \\ 1. \ (\x. P x) \ \x. \ P x\\ \\\emph{Primenjujemo pravilo \ccontr\, pretpostavljamo suprotno, tj. prebacujemo negaciju zaključka na levu stranu sa ciljem da dokažemo kontradikciju.}\ apply (rule ccontr) \ \\ 1. \\ (\x. P x); \x. \ P x\ \ False\\ apply (erule notE) \ \\ 1. \\x. \ P x\ \ \x. P x\\ \ \\emph{Primenjujemo pravilo \notE\ da bismo eliminisali negaciju u prvoj pretpostavci. Nakon ovog pravila došli smo u situaciju da umesto polazne teoreme dokazujemo njenu kontrapoziciju (sa eliminisanom dvostrukom negacijom). }\ apply (rule allI) \ \\emph{Dokaz nastavljamo na uobičajeni način, uvodeći univerzalni kvantifikator (tj. dokazujući tvrđenje za proizvoljno ali fiksirano \x\.}\ \ \\1. \x. \x. \ P x \ P x \\ \ \\emph{U nastavku ponovo kombinacijom pravila \ccontr\ i \notE\ razmenjujemo levu i desnu stranu i prelazimo na dokaz kontrapozicije.}\ apply (rule ccontr) apply (erule notE) \ \\1. \x. \ P x \ \ x. P x \\ \ \\emph{Dokaz je sada jednostavno završiti, jer je uvedeno proizvoljno \x\, svedok za \\ P x\.}\ apply (rule_tac x="x" in exI) apply assumption done subsection \Dodatni primeri\ text\U klasičnoj logici, dokazati naredna tvrđenja:\ text \ \begin{exmp} @{text "(\ B \ \ A) \ (A \ B)"} \end{exmp} \ lemma shows "(\ B \ \ A) \ (A \ B)" apply (rule impI) \ \\ 1. \ B \ \ A \ A \ B\\ apply (rule impI) \ \\ 1. \\ B \ \ A; A\ \ B\\ apply (rule ccontr) \ \\ 1. \\ B \ \ A; A; \ B\ \ False\\ \ \\emph{prebacuje zaključak sa desna na levo i pokušavamo da izvedemo kontradikciju}\ apply (erule impE) \ \\ 1. \A; \ B\ \ \ B\\ \ \\ 2. \A; \ B; \ A\ \ False\\ apply assumption \ \\ 1. \A; \ B; \ A\ \ False\\ apply (erule notE) \ \\ 1. \A; \ A\ \ B\\ \ \\emph{eliminacija negacije, ali treba da je primenimo na drugu negaciju, ne na \\ B\, već na \\ A\}\ \ \\ 1. \A; \ A\ \ B\\ back \ \\ 1. \A; \ B\ \ A\\ apply assumption done text \ \begin{exmp} @{text "(A \ B) \ (\ A \ B)"} \end{exmp} \ lemma shows "(A \ B) \ (\ A \ B)" apply (rule impI) \ \\ 1. A \ B \ \ A \ B\\ apply (rule ccontr) \ \\ 1. \A \ B; \ (\ A \ B)\ \ False\\ apply (erule impE) \ \\ 1. \ (\ A \ B) \ A\\ \ \\ 2. \\ (\ A \ B); B\ \ False\\ apply (rule ccontr) \ \\ 1. \\ (\ A \ B); \ A\ \ False\\ \ \\ 2. \\ (\ A \ B); B\ \ False\\ apply (erule notE) \ \\ 1. \ A \ \ A \ B\\ \ \\ 2. \\ (\ A \ B); B\ \ False\\ apply (rule disjI1) \ \\ 1. \ A \ \ A\\ \ \\ 2. \\ (\ A \ B); B\ \ False\\ apply assumption \ \\ 1. \\ (\ A \ B); B\ \ False\\ apply (erule notE) \ \\ 1. B \ \ A \ B\\ apply (rule disjI2) \ \\ 1. B \ B\\ apply assumption done text \ \begin{exmp} @{text "(\ P \ Q) \ (\ Q \ P)"} \end{exmp} \ lemma shows "(\ P \ Q) \ (\ Q \ P)" apply (rule iffI) \\\emph{Dobijamo dva cilja; sada prvo primenjujemo pravilo uvođenja implikacije u prvom cilju.} \ apply (rule impI) \\\emph{Sada prebacujemo zaključak na levu stranu i desno dobijamo False. }\ apply (rule ccontr) \\\emph{Ovo nam odgovara zato što se sada \\ P\ dodaje među pretpostavke, a već se pojavljuje kao leva strana implikacije. }\ apply (erule impE) apply (assumption) apply (erule notE) apply assumption \\\emph{Sada smo zatvorili prvi cilj, pa slično sa drugim ciljom.}\ apply (rule impI) apply (rule ccontr) \\\emph{Slično kao u prethodnoj primeni, odgovara nam da \\ Q\ prebacimo u pretpostavke jer se već pojavljuje kao leva strana implikacije.}\ apply (erule impE) apply assumption apply (erule notE) apply assumption done text \ \begin{exmp} @{text "(\ P \ Q) \ (\ Q \ P)"} \end{exmp} \ lemma "(\ P \ Q) \ (\ Q \ P)" apply (rule iffI) apply (rule impI) apply (rule ccontr) apply (erule impE) apply assumption apply (erule notE) apply assumption apply (rule impI) apply (rule ccontr) apply (erule impE) apply assumption apply (erule notE) apply assumption done text \ \begin{exmp} Pirsov zakon. Tipičan ne-intuicionistički primer koji će sigurno zahtevati neki oblik klasične kontradikcije. \((P \ Q) \ P) \ P\ \end{exmp} \ lemma shows "((P \ Q) \ P) \ P" apply (rule impI) apply (rule ccontr) \\\emph{Primena klasične kontradikcije, dodajemo negirani zaključak kao novu pretpostavku i pokušavamo da izvedemo kontradikciju.}\ apply (erule impE) apply (rule impI) apply (erule notE) apply assumption apply (erule notE) apply assumption done text \Aladin se nalazi ispred pećine u kojoj su dva kovčega. U svakom od kovčega se nalazi ili blago ili smrtonosna zamka. Na kovčegu A piše da se bar u jednom od dva kovčega nalazi blago. Na kovčegu B piše da se u kovčegu A nalazi smrtonosna zamka. Poznato je da su ili oba natpisa tačna ili da nijedan od njih nije tačan. Odrediti sadržaj kovčega i dokazati odgovor. Ako nijedan od natpisa ne bi bio tačan, tada nijedan od kovčega ne bi mogao da sadrži blago (jer je natpis A netačan), dok bi kovčeg A morao da sadrži blago (pošto je natpis B netačan). Ovo je kontradiktorno, pa je nemoguće da su oba natpisa netačna. Dakle, oba natpisa moraju biti tačna. Tada kovčeg A sadrži smrtonosnu zamku, dok kovčeg B sadrži blago. Formalizujmo ova tvrđenja u iskaznoj logici. Neka iskazna promenljiva \bA\ označava da kovčeg A sadrži blago, a iskazna promenljiva \bB\ da kovčeg B sadrži blago (tada \\ bA\ označava da je u kovčegu A smrtonosna zamka, a \\ bB\ da je u kovčegu B smrtonosna zamka. Neka promenljiva \nA\ označava da je natpis na kovčegu A tačan, a promenljiva \nB\ da je natpis na kovčegu B tačan. \begin{exmp} @{text "(nA \ bA \ bB) \ (nB \ \ bA) \ ((nA \ nB) \ (\ nA \ \ nB)) \ \ bA \ bB"} \end{exmp} \ lemma shows "(nA \ bA \ bB) \ (nB \ \ bA) \ ((nA \ nB) \ (\ nA \ \ nB)) \ \ bA \ bB" \\\emph{Primenjujemo očigledna pravila}\ apply (rule impI) apply (erule conjE)+ apply (erule iffE)+ \\\emph{Razmatramo dva slučaja}\ apply (erule disjE) \\\emph{U prvom slučaju su oba natpisa tačna}\ apply (erule conjE) \\\emph{Iz pretpostavki izvodimo da važi \\ bA\ i da važi \bA \ bB\}\ apply (erule impE) apply assumption apply (erule impE) back apply assumption \\\emph{Posebno dokazujemo da važi \\ bA\ i posebno \bB\}\ apply (rule conjI) apply assumption \\\emph{Pošto znamo da važi \bA \ bB\ analiziramo slučaj da važi \bA\ i \bB\}\ apply (erule disjE) apply (erule notE) apply assumption apply assumption \\\emph{U ovom slučaju nijedan od natpisa nije istinit. Dokaćemo da je to kontradiktorno}\ apply (erule conjE) \\\emph{Dokazaćemo prvo da iz pretpostavki sledi da blago mora biti bar u jednom kovčegu}\ apply (erule impE) back \\\emph{Pretpostavljamo suprotno (da blago nije ni u jednom kovčegu)}\ apply (rule ccontr) \\\emph{Odatle sledi da blago nije u kovčegu A}\ apply (erule impE) back back apply (rule notI) apply (erule notE) back back apply (rule disjI1) apply assumption \\\emph{Stoga je natpis B istinit, što je kontradikcija sa tim da nijedan od natpisa nije istinit.}\ apply (erule notE) back apply assumption \\\emph{Pošto je blago bar u jednom kovčegu, natpis A je istinit, što je kontradikcija sa tim da nijedan od natpisa nije istinit.}\ apply (erule notE) apply assumption done subsection \ Pravilo classical \ text\ Još jedno pravilo klasične logike koje možemo koristiti u sistemu Isabelle/HOL je @{text "classical: (\ ?P \ ?P) \ ?P"}. Ovo pravilo podrazumeva da u dokazu teoreme uvek možemo pretpostaviti negaciju zaključka teoreme dok pokušavamo da izvedemo upravo taj zaključak. Pravilo je slično pravilu svođenja na kontradikciju @{text ccontr}. Jedina razlika je to što se kod pravila @{text ccontr} iz negacije zaključka izvodi kontradikcija @{text False}, a kod pravila @{text classical} izvodi zaključak teoreme.\ text \ Dokažimo zakon isključenja trećeg korišćenjem pravila @{text classical} (primetimo da njega ne bismo mogli da dokažemo samo korišćenjem pravila @{text ccontr} i pravilima uvođenja i eliminacije veznika). \begin{exmp} @{text "P \ \ P"} \end{exmp} \ lemma shows "P \ \ P" \\\emph{Da bi smo dokazali formulu \A\, dokazaćemo formulu \\ A \ A\, pa primenjujemo pravilo \classical\.}\ apply (rule classical) \ \\ 1. \ (P \ \ P) \ P \ \ P\\ \ \\emph{Pošto je situacija simetrična, biramo da u cilju zadržimo prvi disjunkt, tj. \P\.}\ apply (rule disjI1) \ \\ 1. \ (P \ \ P) \ P\\ \ \\emph{Dokaz možemo nastaviti običnim svođenjem na kontradikciju, pa primenjujemo pravilo \ccontr\ (naravno, bilo bi sasvim u redu i da se ponovo primeni pravilo \classical\.}\ apply (rule ccontr) \ \\ 1. \\ (P \ \ P); \ P\ \ False\\ apply (erule notE) \ \\ 1. \ P \ P \ \ P \\ apply (rule disjI2) \ \\ 1. \ P \ \ P \\ apply assumption done subsection \Razmatranje slučajeva - metod cases\ text\Dokazi po slučajevima se koriste kada je potrebno izvršiti grananje po nekom uslovu u toku samog dokaza. Za navođenje uslova po kom se grananje vrši može se koristiti metod \cases\. Iako ovi dokazi izlaze iz striktnog okvira klasične prirodne dedukcije, oni mogu biti donekle jasniji od dokaza zapisanih samo pomoću pravila prirodne dedukcije. Prikažimo primer jedne leme koju ćemo prvo dokazati samo pomoću pravila prirodne dedukcije, a zatim pomoću metoda cases.\ text\Na ostrvu na kom se nalaze samo vitezovi i lažovi sreli smo osobu A koja je rekla da su ona i osoba B iste vrste. Dokazati da je onda osoba B vitez. Obeležimo sa \A\ iskaznu promenljivu koja je tačna ako i samo ako je osoba A vitez tj. ako i samo ako osoba A govori istinu. Uvedimo promenljivu \B\ istog značenja i za osobu B. Osoba A govori istinu ako i samo ako su A i B ekvivalentne promenljive. Zato se teorema može formulisati i dokazati na sledeći način.\ text \DA LI I OVAJ DOKAZ OBJASNITI?\ lemma no_one_admits_knave_apply: shows "(A \ (A \ B)) \ B" apply (rule impI) apply (erule iffE) apply (rule ccontr) apply (erule impE) apply (rule ccontr) apply (erule impE) apply (rule iffI) apply (erule notE) back apply assumption apply (erule notE) apply assumption apply (erule notE) back apply assumption apply (erule impE) apply assumption apply (erule iffE) apply (erule impE) apply assumption apply (erule notE) apply (assumption) done text\Pređimo sada na dokaz u kom se koristi metoda \cases\. Prvo će biti naveden dokaz ove leme bez objašnjenja, a zatim isti dokaz detaljno iskomentarisan sa stanjima kroz koje prolazi dokazivač u toku dokazivanja. \ (* \footnote{Sana: Ova lema će kasnije biti dokazana u Isar-u, pa koristimo isto ime.} *) lemma no_one_admits_knave_apply_cases: shows "(A \ (A \ B)) \ B" apply (rule impI) apply (cases A) \ \\emph{Prva grana: A je tačno}\ apply (erule iffE) apply (erule impE) apply assumption apply (erule iffE) apply (erule impE) back apply assumption apply assumption \ \\emph{Druga grana: A je netačno}\ apply (rule ccontr) apply (erule iffE) apply (erule impE) back apply (rule iffI) apply (erule notE) apply assumption apply (erule notE) back apply assumption apply (erule notE) apply assumption done text\Detaljno objašnjen prethodni dokaz teoreme:\ lemma no_one_admits_knave_apply_cases_explained: shows "(A \ (A \ B)) \ B" apply (rule impI) \ \\ 1. A = (A = B) \ B\\ \ \\emph{Odmah na početku dokaza, granamo ovaj dokaz po slučajevima da li je \A\ tačno ili netačno. Kada se samo jedan term koristi u okviru metoda \cases\ nema potrebe koristiti navodnike (inače su neophodni, što ćemo videti u narednom primeru).}\ \ \\emph{Ovo će generisati dva nova cilja, u prvom se u skup pretpostavki dodaje nova pretpostavka da važi \A\, a u drugom se u skup pretpostavki dodaje pretpostavka da važi \\ A\.}\ apply (cases A) \ \\ 1. \A = (A = B); A\ \ B\\ \ \\ 2. \A = (A = B); \ A\ \ B\\ \ \\emph{Sada dokazujemo prvi cilj.}\ \ \\emph{U pretpostavkama imamo ekvivalenciju pa primenjujemo pravilo \iffE\ koje eliminiše ekvivalenciju i dodaje u skup pretpostavki dve implikacije.}\ \ \\emph{Primetimo da zagrade ne stoje oko jednakosti sada, zato što jednakost odnosno ekvivalencija ima veći prioritet u odnosu na implikaciju.}\ apply (erule iffE) \ \\ 1. \A; A \ A = B; A = B \ A\ \ B\\ \ \\ 2. \A = (A = B); \ A\ \ B\\ \ \\emph{Sada eliminišemo prvu implikaciju (što nam odgovara jer se njena pretpostavka \A\ već nalazi u spisku pretpostavci tekućeg cilja).}\ apply (erule impE) \ \\ 1. \A; A = B \ A\ \ A\\ \ \\ 2. \A; A = B \ A; A = B\ \ B\\ \ \\ 3. \A = (A = B); \ A\ \ B\\ apply assumption \ \\ 1. \A; A = B \ A; A = B\ \ B\\ \ \\ 2. \A = (A = B); \ A\ \ B\\ \ \\emph{Sada elimišemo ekvivalenciju \A = B\ što generiše dve nove implikacije koje se dodaju u pretpostavke.}\ apply (erule iffE) \ \\ 1. \A; A = B \ A; A \ B; B \ A\ \ B\\ \ \\ 2. \A = (A = B); \ A\ \ B\\ \ \\emph{Sada imamo tri implikacije u pretpostavkama i želimo da eliminišemo drugu implikaciju (jer formulu \A\ imamo među ostalim pretpostavkama). Pa odmah planiramo da pozovemo naredbu \back\ nakon ove naredbe.}\ apply (erule impE) \ \\ 1. \A; A \ B; B \ A\ \ A = B\\ \ \\ 2. \A; A \ B; B \ A; A\ \ B\\ \ \\ 3. \A = (A = B); \ A\ \ B\\ back \ \\ 1. \A; A = B \ A; B \ A\ \ A\\ \ \\ 2. \A; A = B \ A; B \ A; B\ \ B\\ \ \\ 3. \A = (A = B); \ A\ \ B\\ apply assumption \ \\ 1. \A; A = B \ A; B \ A; B\ \ B\\ \ \\ 2. \A = (A = B); \ A\ \ B\\ apply assumption \ \\emph{Dokazali smo prvi cilj, odnosno prvi slučaj kada je \A\ tačno.}\ \ \\emph{Sada dokazujemo drugi cilj.}\ \ \\ 1. \A = (A = B); \ A\ \ B\\ \ \\emph{Sada primenjujemo pravilo \ccontr\, odnosno pretpostavimo suprotno od tekućeg cilja i dokažimo da onda dobijamo kontradikciju.}\ apply (rule ccontr) \ \\ 1. \A = (A = B); \ A; \ B\ \ False\\ \ \\emph{Sada prvo eliminišemo ekvivalenciju iz pretpostavki, čime dobijamo dve nove implikacije.}\ apply (erule iffE) \ \\ 1. \\ A; \ B; A \ A = B; A = B \ A\ \ False\\ \ \\emph{Pošto prva implikacija sledi iz \A\, a u pretpostavkama imamo da važi \\ A\, možemo da zaključimo da nam ne odgovara da eliminišemo prvu implikaciju pa pokušavamo sa drugom i odmah planiramo da pozovemo naredbu \back\ nakon ove naredbe.}\ apply (erule impE) \ \\ 1. \\ A; \ B; A = B \ A\ \ A\\ \ \\ 2. \\ A; \ B; A \ A = B; A\ \ False\\ back \ \\ 1. \\ A; \ B; A \ A = B\ \ A = B\\ \ \\ 2. \\ A; \ B; A \ A = B; A\ \ False\\ \ \\emph{Sada primenjujemo pravilo uvođenja ekvivalencije na \A = B\ i dobijamo dva nova cilja.}\ apply (rule iffI) \ \\ 1. \\ A; \ B; A \ A = B; A\ \ B\\ \ \\ 2. \\ A; \ B; A \ A = B; B\ \ A\\ \ \\ 3. \\ A; \ B; A \ A = B; A\ \ False\\ \ \\emph{Pošto u pretpostavkama imamo \\ A\ i \A\, odgovara nam da pokušamo da eliminišemo prvu negaciju.}\ apply (erule notE) \ \\ 1. \\ B; A \ A = B; A\ \ A\\ \ \\ 2. \\ A; \ B; A \ A = B; B\ \ A\\ \ \\ 3. \\ A; \ B; A \ A = B; A\ \ False\\ apply assumption \ \\ 1. \\ A; \ B; A \ A = B; B\ \ A\\ \ \\ 2. \\ A; \ B; A \ A = B; A\ \ False\\ \ \\emph{Pošto u pretpostavkama imamo \\ B\ i \B\, odgovara nam da pokušamo da eliminišemo drugu negaciju pa planiramo da pozovemo \back\ nakon naredne naredbe.}\ apply (erule notE) \ \\ 1. \\ B; A \ A = B; B\ \ A\\ \ \\ 2. \\ A; \ B; A \ A = B; A\ \ False\\ back \ \\ 1. \\ A; A \ A = B; B\ \ B\\ \ \\ 2. \\ A; \ B; A \ A = B; A\ \ False\\ apply assumption \ \\ 1. \\ A; \ B; A \ A = B; A\ \ False\\ \ \\emph{Pošto u pretpostavkama imamo \\ A\ i \A\, odgovara nam da pokušamo da eliminišemo prvu negaciju.}\ apply (erule notE) \ \\ 1. \\ B; A \ A = B; A\ \ A\\ apply assumption \ \\No subgoals!\\ done text \text\ \begin{exmp} Paradoks pijanca: postoji osoba za koju važi, ako je on pijanac onda su i svi ostali pijanci. \end{exmp} Pokazaćemo nekoliko različitih dokaza ovog tvrđenja.\\ text\ \begin{exmp} Paradoks pijanca: postoji osoba za koju važi, ako je on pijanac onda su i svi ostali pijanci. \end{exmp} \ text\Neformalni dokaz ove teoreme razlikuje slučajeve kada svi piju i kada postoji neka osoba koja ne pije. Ako svi piju, onda su zaista svi pijanci, a u suprotnom za tu osobu možemo reći da ako je on pijanac, onda su svi pijanci (to je tačno jer pretpostavka te implikacije nije tačna). Ovo možemo sprovesti i u formalnom dokazu tako što koristimo metod \cases\ ali sada formulu po kojom granamo navodimo između dvostrukih navodnika. Prvo navodimo dokaz bez objašnjenja, pa nakon toga detaljno objašnjen dokaz sa stanjima kroz koja prolazi dokazivač.\ lemma Drinker's_Principle1_bez_objasnjenja: "\ x. (drunk x \ (\ x. drunk x))" apply (cases "\ x. drunk x") \\prva grana\ apply (rule exI) apply (rule impI) apply assumption \\druga grana\ apply (rule ccontr) apply (erule notE) apply (rule allI) apply (rule ccontr) apply (erule notE) apply (rule_tac x = "x" in exI) apply (rule impI) apply (erule notE) apply assumption done text\Detaljno objašnjen dokaz teoreme:\ lemma Drinker's_Principle1: "\ x. (drunk x \ (\ x. drunk x))" \ \\emph{Prvo granamo prema tome da li zaključak važi ili ne, primenjujemo metod \cases\ i dobijamo dve grane, odnosno dva podcilja.}\ apply (cases "\ x. drunk x") \ \\ 1. \x. drunk x \ \x. drunk x \ (\x. drunk x)\\ \ \\ 2. \ (\x. drunk x) \ \x. drunk x \ (\x. drunk x)\\ \ \\emph{Sada dokazujemo prvu granu. Moramo primetiti da nam nije bitan svedok tako da možemo da primenimo pravilo \exI\ bez instanciranja promenljive.}\ apply (rule exI) \ \\ 1. \x. drunk x \ drunk ?x1 \ (\x. drunk x)\\ \ \\ 2. \ (\x. drunk x) \ \x. drunk x \ (\x. drunk x)\\ \ \\emph{Sada primenjujemo pravilo uvođenja implikacije u zaključak.}\ apply (rule impI) \ \\ 1. \\x. drunk x; drunk ?x1\ \ \x. drunk x\\ \ \\ 2. \ (\x. drunk x) \ \x. drunk x \ (\x. drunk x)\\ \ \\emph{I lako dokazujemo prvu granu.}\ apply assumption \ \\emph{Sada dokazujemo drugu granu.}\ \ \\ 1. \ (\x. drunk x) \ \x. drunk x \ (\x. drunk x)\\ \ \\emph{Prvo primenjujemo klasičnu kontradikciju, odnosno negaciju zaključka prebacujemo u pretpostavke i pokušavamo da izvedemo kontradikciju.}\ apply (rule ccontr) \ \\ 1. \\ (\x. drunk x); \x. drunk x \ (\x. drunk x)\ \ False\\ \ \\emph{Sada eliminišemo negaciju iz pretpostavki.}\ apply (erule notE) \ \\ 1. \x. drunk x \ (\x. drunk x) \ \x. drunk x\\ \ \\emph{Pa univerzalni kvantifikator iz zaključka.}\ apply (rule allI) \ \\ 1. \x. \x. drunk x \ (\x. drunk x) \ drunk x\\ \ \\emph{Ponovo primenjujemo pravilo klasične kontradikcije.}\ apply (rule ccontr) \ \\ 1. \x. \\x. drunk x \ (\x. drunk x); \ drunk x\ \ False\\ \ \\emph{Eliminišemo negaciju iz pretpostavki.}\ apply (erule notE) \ \\ 1. \x. \ drunk x \ \x. drunk x \ (\x. drunk x)\\ \ \\emph{Sada instanciramo egzistencijalni kvantifikator u zaključku promenljivom \x\ koju smo već uveli.}\ apply (rule_tac x = "x" in exI) \ \\ 1. \x. \ drunk x \ drunk x \ (\x. drunk x)\\ \ \\emph{Sada primenjujemo pravilo uvođenja implikacije u zaključku.}\ apply (rule impI) \ \\ 1. \x. \\ drunk x; drunk x\ \ \x. drunk x\\ \ \\emph{Sada eliminišemo negaciju iz pretpostavki.}\ apply (erule notE) \ \\ 1. \x. drunk x \ drunk x\\ apply assumption \ \\No subgoals!\\ done text\U PREOSTALOJ PRIČI IZ DELA 5 se krije nekoliko nezavisne stvari, koje bi bilo dobro objasniti sve, ali na jednostavnijim primerima: \<^item> FRULE - naći neki jednostavniji primer gde se univerzalni kvantifikator mora koristiti više puta. Npr. \ lemma shows "(\ x. P x \ P (f x)) \ P a \ P (f (f a))" apply (rule impI) apply (erule conjE) apply (frule_tac x=a in spec) apply (erule impE) apply assumption apply (erule_tac x="f a" in allE) apply (erule impE) apply assumption apply assumption done text\\footnote{filip: SAMO OVDE OBJASNITI ŠTA JE FRULE I OBJASNITI PRETHODNI PRIMER.}\ text \ \<^item> \verb|SUBGOAL_TAC| - ne smeta mi čak i ako bismo ovo izostavili, a ako ostane treba naći neki jednostavan primer. \ text\ \<^item> Primena ranije dokazanih lema. \<^item> Odnos zapisa u meta-logici i objektnoj logici i \verb|rule_format|. I jedno i drugo je lepo da se objasni, samo može da se nađe možda neki jednostavniji primer? \ (* text\ \paragraph{Dokaz uz korišćenje pomoćne leme:} U naredna dva dokaza paradoksa pijanca koristi se klasični deo de-Morganovog zakona koji smo već dokazali ali ga navodimo ponovo.\ lemma de_Morgan': shows "(\ (\ x. P x)) \ (\ x. \ P x)" apply (rule impI) apply (rule classical) apply (erule notE) apply (rule allI) apply (rule classical) apply (erule notE) apply (rule_tac x = "x" in exI) apply assumption done text\Prikazaćemo dve verzije dokaza uz pomoć pravila prirodne dedukcije koje koriste ovu lemu. \paragraph{Korišćenje pomoćne leme u dokazu:} Moguće je koristiti i pomoćne leme u apply-skript dokazima, na način koji je veoma sličan primeni pravila prirodne dedukcije. - \verb!apply (rule! \theorem\\verb!)! - primenjuje se ako se zaključak teoreme poklapa sa zaključkom tekućeg cilja. - \verb!apply (erule! \theorem\\verb!)! - primenjuje se ako se zaključak teoreme poklapa sa zaključkom tekućeg cilja i prva pretpostavka se poklapa sa pretpostavkom tekućeg cilja. - \verb!apply (frule! \theorem\\verb!)! - primenjuje se kada se prva pretpostavka teoreme poklapa sa pretpostavkom tekućeg cilja. - \verb!apply (drule! \theorem\\verb!)! - slično kao pravilo \frule\ s tim što se pretpostavka koja se koristi briše. \paragraph{Naredba \[rule_format]\:} Naredba \rule_format\ naglašava Isabelle/HOL da se u tvrđenju leme svako \\\ zameni sa \\\ pre čuvanja ili primene dokazane leme. Može se koristiti ili prilikom pozivanja određene leme (u dokazu druge leme - kao što će biti prikazano u nastavku teksta) ili se može navesti odmah nakon definisanja same leme (što čitalac može pokušati sam). Ovakva transformacija leme olakšava njenu primenu u dokazima drugih lema. \paragraph{Dodavanje među-cilja, metod \subgoal_tac\:} Metod \subgoal_tac\ se koristi da bismo u dokazu dodali novu pretpostavku koju planiramo da koristimo u dokazu konačnog cilja. Ovo nam omogućava da koristimo pretpostavku pre nego što je dokažemo, i da se ovaj međukorak (odnosno pretpostavka koja je korišćena) dokazuje tek nakon dokazivanja konačnog cilja. Ovaj metod generiše dva cilja: prvi cilj nastaje od polaznog cilja čiji je spisak pretpostavki proširen novom pretpostavkom, drugi cilj je da se iz prethodnih pretpostavki dokaže nova pretpostavka.\ (* ovo iskomentarisati negde kasnije --- kod isara ako moze *) text\Videćemo i razliku između primene lema @{text de_Morgan} (zapisane sa @{text "\"}) i @{text de_Morgan1} (zapisane sa @{text "\"}).\ (* \footnote{Sana: Ovo može tek sa isar-om, pomeriti tamo ili obrisati.} *) lemma Drinker's_Principle2: "\ x. (drunk x \ (\ x. drunk x))" apply (cases "\ x. drunk x") \\\emph{Prva grana se dokazuje na isti način}\ apply (rule exI) apply (rule impI) apply assumption \\\emph{Druga grana se razlikuje!}\ \\\emph{Koristimo pravilo \subgoal_tac\ i dodajemo novu pretpostavku. Ovo generiše dva cilja.}.\ apply (subgoal_tac "\ x. \ drunk x") \ \\ 1. \\ (\x. drunk x); \x. \ drunk x\ \ \x. drunk x \ (\x. drunk x)\\ \ \\ 2. \ (\x. drunk x) \ \x. \ drunk x\\ \ \\emph{Sada iz pretpostavki (iz nove pretpostavke) eliminišemo egzistencijalni kvantifikator.}\ apply (erule exE) \ \\ 1. \x. \\ (\x. drunk x); \ drunk x\ \ \x. drunk x \ (\x. drunk x)\\ \ \\ 2. \ (\x. drunk x) \ \x. \ drunk x\\ \ \\emph{Sada pokušavamo sa tim istim \x\ primenimo pravilo uvođenja egzistencijalnog kvantifikatora u zaključku.}\ apply (rule_tac x = "x" in exI) \ \\ 1. \x. \\ (\x. drunk x); \ drunk x\ \ drunk x \ (\x. drunk x)\\ \ \\ 2. \ (\x. drunk x) \ \x. \ drunk x\\ \ \\emph{Sada primenjujemo pravilo uvođenja implikacije u zaključku, čime se pretpostavka iz zaključka prebacuje u pretpostavke samog cilja.}\ apply (rule impI) \ \\ 1. \x. \\ (\x. drunk x); \ drunk x; drunk x\ \ \x. drunk x\\ \ \\ 2. \ (\x. drunk x) \ \x. \ drunk x\\ \\\emph{Sada u pretpostavkama imamo \\ drunk x\ i \drunk x\, pa želimo da primenimo pravilo \notE\ upravo na \\ drunk x\ (što je druga negacija u pretpostavkama). Zbog toga odmah planiramo da nakon primene pravila \notE\ pozovemo naredbu \back\.} \ apply (erule notE) \ \\ 1. \x. \\ drunk x; drunk x\ \ \x. drunk x\\ \ \\ 2. \ (\x. drunk x) \ \x. \ drunk x\\ back \ \\ 1. \x. \\ (\x. drunk x); drunk x\ \ drunk x\\ \ \\ 2. \ (\x. drunk x) \ \x. \ drunk x\\ apply assumption \ \\ 1. \ (\x. drunk x) \ \x. \ drunk x\\ \\\emph{Sada je dokazan konačni cilj. Ostaje nam da dokažemo međukorak direktnom primenom leme \de_Morgan\ nakon što je transformišemo u odgovarajući oblik naredbom \[rule_format]\}. Pošto se u zaključku teoreme nalazi upravo zaključak leme \de_Morgan\ pozivamo je sa metodom \rule\.\ apply (rule de_Morgan[rule_format]) \ \\ 1. \ (\x. drunk x) \ \ (\x. drunk x)\\ apply assumption \ \\No subgoals!\\ done *) end