(*:maxLineLen=80:*) (* Utilities/Buffer Options/Word wrap: soft *) section \ First order logic \ subsection \ Ponavljanje sa predavanja \ theory Cas5_vezbe_resenja imports Main begin text\U narednim zadacima cemo koristiti pravilo oslobadjanja od univerzalnog kvantifikatora \ thm allE text \ Ako znamo da je svaki covek smrtan, i ako je Sokrat covek, pokazati da je onda i Sokrat smrtan \ lemma "((\ x. covek x \ smrtan x) \ covek Sokrat) \ smrtan Sokrat" apply (rule impI) apply (erule conjE) (* Opsti oblik nam ovde nije koristan apply (erule allE) pa koristimo odmah instanciranje, ako vazi za svaki onda vazi i za Sokrata. Promenljiva se zove x u pravilu allE pa se i u primeni pravila zove x.*) apply (erule_tac x = "Sokrat" in allE) (* rule_tac i erule_tac --- apply a rule while constraining some of its variables. The typical form is rule_tac v1 = t1 and \ and vk = tk in R. This method behaves like rule R, while instantiating the variables v1\vk as specified. *) (* Nakon toga eliminisemo implikaciju i jednostavno zavrsavamo dokaz. *) apply (erule impE) apply assumption apply assumption done text\ Prirodnom dedukcijom dokazati da je naredno tvrdjenje teorema logike prvog reda: \ lemma "(\ x. P x) \ (\ x. P x \ Q x) \ (\ x. Q x)" (* Prvo razbijamo iskazni skeleton: *) apply (rule impI) (* pa konjunkciju sa leve strane *) apply (erule conjE) (* sada prvo eliminisemo egzistencijalni kvantifikator sa leve strane *) apply (erule exE) (* i dobili smo fiksirano ali proizvoljno x, sa kojim mozemo da instanciramo x u allE *) apply (erule_tac x = "x" in allE) apply (erule impE) apply assumption (* sada se oslobadjamo egzistencijalnog kvantifikatora sa desne strane, ali pokusavamo za ovo konkretno x *) apply (rule_tac x = "x" in exI) apply assumption done text\ Kako bismo u Isaru dokazali istu teoremu? Posto koristimo Isar, mozemo koristiti assumes shows zapis:\ lemma assumes "\ x. P x" assumes "\ x. P x \ Q x" shows "\ x. Q x" (* Posto smo je zapisali sa assumes i shows, nece postojati prva dva koraka iz prethodnog dokaza. *) proof - (* - znaci da cemo mi sami da raspisemo dokaz. Obratiti paznju da je ovde bojama napravljena razlika: narandzasto x je ovo dobijeno sa exists. Naredni korak mozemo da citamo: na osnovu pravila eliminacije univerzalnog kvantifikatora primenjenog na narandzasto x *) from `\ x. P x` obtain x where "P x" by auto (* ili by (rule exE), ali ovde ne zelimo da budemo precizni *) from `\ x. P x \ Q x` have "P x \ Q x" by auto (* ili by (rule_tac x = "x" in allE) *) from this `P x` have "Q x" by auto (* ili by (rule impE) *) from this show "\ x. Q x" by auto (* ili by (rule exI) *) qed text\ Malo komplikovanija teorema, moze se zapisati sa jednom promenljivom x, ali citljivije je ako uvedemo razlicite promenljive: c, g i a. Ako je svaki covek smrtan; i ako je svaki grk covek; onda vazi da je svaki grk smrtan. \ lemma "(\ c. covek c \ smrtan c) \ (\ g. grk g \ covek g) \ (\ a. grk a \ smrtan a)" (* by auto --- prvo testiramo da vidimo da li je dobro formulisana teorema *) apply (rule impI) (* standardno, prvo impI pravilo, pa nakon toga razbijamo konjunkciju sa leve strane *) apply (erule conjE) (* sada uvodimo proizvoljno ali konretno a eliminacijom univerzalnog kvantifikatora sa desne strane *) apply (rule allI) (* sada razbijamo implikaciju sa desne strane *) apply (rule impI) (* sada treba da razbijamo levu stranu i moramo da naglasimo ime promenljive *) (* sada nam je dominantan univerzalni kvantifikator i razbicemo prvi kvantifikator s leva *) apply (erule_tac x = "a" in allE) (* naredni korak rabija preostali kvantifikator *) apply (erule_tac x = "a" in allE) (* sada smo dosli do iskaznog nivoa i mozemo da razbijemo implikaciju *) apply (erule impE) (* pokusamo sa prvom implikacijom... i vidimo da uspeva *) apply (erule impE) apply assumption apply assumption apply assumption done text\ Sada ista lema u isar-u, prvo je zapisemo drugacije. Proverite da je stiklirano Continuous checking sa desne strane \ lemma assumes "\ c. covek c \ smrtan c" assumes "\ g. grk g \ covek g" shows "\ a. grk a \ smrtan a" proof (* sam isabelle sugerise uvodjenje proizvoljnog a, isto kao da smo napisali proof (rule allI) *) fix Jorgos show "grk Jorgos \ smrtan Jorgos" proof (* opet isabelle sugerise i nadje impI --- isto kao da smo napisali proof (rule impI) *) assume "grk Jorgos" from this and assms(2) have "covek Jorgos" by auto from this and assms(1) show "smrtan Jorgos" by auto qed qed text\ malo duzi, drugacije zapisan dokaz\ lemma assumes "\ c. covek c \ smrtan c" assumes "\ g. grk g \ covek g" shows "\ a. grk a \ smrtan a" proof (* sam isabelle sugerise uvodjenje proizvoljnog a, isto kao da smo napisali proof (rule allI) *) fix Jorgos show "grk Jorgos \ smrtan Jorgos" proof (* opet isabelle sugerise i nadje impI --- isto kao da smo napisali proof (rule impI) *) assume "grk Jorgos" moreover from assms(2) have "grk Jorgos \ covek Jorgos" by auto ultimately have "covek Jorgos" by auto moreover (* novi blok, prethodno ultimately je ispraznilo *) from assms(1) have "covek Jorgos \ smrtan Jorgos" by auto ultimately show "smrtan Jorgos" by auto qed qed subsection\ Primeri za vezbanje \ text\Naredne leme dokazati u prirodnoj dedukciji. Pa nakon toga, zapisati uz pomoc assumes i shows i dokazati u Isar-u. \ lemma "(\ a. P a \ Q a) \ (\ b. P b) \ (\ x. Q x)" apply (rule impI) apply (erule conjE) apply (rule allI) apply (erule_tac x = "x" in allE) apply (erule_tac x = "x" in allE) apply (erule impE) apply assumption apply assumption done lemma assumes "\ a. P a \ Q a" assumes "\ b. P b" shows "\ x. Q x" proof fix x show "Q x" proof - from assms(2) have "P x" by auto from assms(1) have "P x \ Q x" by auto from this `P x` show "Q x" by auto qed qed lemma "(\ x. A x \ B x) \ (\ x. A x) \ (\ x. B x)" apply (rule impI) apply (erule exE) (* sada prvo razbijamo pretpostavku na dve odvojene grane *) apply (erule disjE) (* sada kazemo da prvo pokusavamo da dokazemo prvi disjunkt u zakljucku *) apply (rule disjI1) apply (rule_tac x = "x" in exI) apply assumption (* dokazali smo prvi podcilj, sada drugi podcilj pokusavamo da dokazemo kroz drugi disjunkt *) apply (rule disjI2) apply (rule_tac x = "x" in exI) apply assumption done text\Da bi naredna resenja prosla ukljucujemo quick and dirty mode.\ declare [[quick_and_dirty=true]] text\Podsecanja radi, ovaj dokaz u isar-u cemo pisati u dve faze: (1) prvo pravimo samo kostur dokaza, nezavrsene dokaze oznacavamo sa sorry: \ lemma assumes "\ x. A x \ B x" shows "(\ x. A x) \ (\ x. B x)" proof - (* ne zelimo bez crtice zato sto onda pokusava da dokaze samo prvi disjunkt, a on ne mora da vazi uvek *) from assms obtain x where "A x \ B x" by auto from this show "(\ x. A x) \ (\ x. B x)" proof (* sada zbog "from this" koje se odnosi na disjunkciju, dobijamo dve grane *) assume "A x" show "(\ x. A x) \ (\ x. B x)" sorry next assume "B x" show "(\ x. A x) \ (\ x. B x)" sorry qed qed text\(2) pa sada raspisujemo jednu po jednu granu\ lemma assumes "\ x. A x \ B x" shows "(\ x. A x) \ (\ x. B x)" proof - (* ne zelimo bez crtice zato sto onda pokusava da dokaze samo prvi disjunkt, a on ne mora da vazi uvek *) from assms obtain x where "A x \ B x" by auto from this show "(\ x. A x) \ (\ x. B x)" proof (* sada zbog "from this" koje se odnosi na disjunkciju, dobijamo dve grane *) assume "A x" from this show "(\ x. A x) \ (\ x. B x)" by auto (* ovo bi bio najkraci dokaz *) next assume "B x" show "(\ x. A x) \ (\ x. B x)" proof - (* u drugoj grani cemo raspisati dokaz. obavezno stavljamo - posto moramo sami da dodjemo do drugog disjunkta *) from `B x` have "\ x. B x" by auto from this show "(\ x. A x) \ (\ x. B x)" by auto qed qed qed lemma "(\ x. A x \ \ B x) \ \ (\ x. A x \ B x)" apply (rule impI) apply (rule notI) apply (erule exE) apply (erule conjE) apply (erule_tac x = "x" in allE) apply (erule impE) apply assumption apply (erule notE) apply assumption done text\ (1) Skoljka automatskog dokaza \ lemma assumes "\ x. A x \ \ B x" shows "\ (\ x. A x \ B x)" proof assume "\ x. A x \ B x" show False sorry qed text\ (2) Raspisani dokaz \ lemma assumes "\ x. A x \ \ B x" shows "\ (\ x. A x \ B x)" proof assume "\ x. A x \ B x" from this obtain x where "A x \ B x" by auto from this have "A x" "B x" by auto from this have "\ B x" using assms by auto from this `B x` show False by auto qed text \Narednih nekoliko primera je opisano recenicama i formulama. Na ispitu ce biti navedena samo formulacija uz pomoc recenica, a zadatak ce biti i zapis uz pomoc formule i raspisani dokaz same formule. Stil dokaza cete najverovatnije moci sami da birate, sem ako nije eksplicitno navedeno koji tip dokaza se ocekuje. Primeticete da su ovi dokazi ponekad laksi ako se koristi prirodna dedukcija nego Isar. \ text \ Formulisati i dokazati naredno tvrdjenje: Ako za svaki broj koji nije paran vazi da je neparan; i ako za svaki neparan broj vazi da nije paran; pokazati da onda za svaki broj vazi da nije istovremeno i paran i neparan \ lemma "(\ x. \ paran x \ neparan x) \ (\ x. neparan x \ \ paran x) \ (\ x. \ (paran x \ neparan x))" apply (rule impI) (* sada prvo eliminisemo univerzalni kvantifikator sa desne strane *) apply (rule allI) (* pa razbijamo konjunkciju sa leve strane na dve premise *) apply (erule conjE) (* pa skidamo negaciju sa desne strane tako sto prebacujemo na levu *) apply (rule notI) (* pa opet konjunkciju razbijamo *) apply (erule conjE) (* sada u premisama imamo dve univerzalne kvantifikovane formule, koje posto vaze za svako x vazice i za ovo vec uvedeno fiksirano ali proizvoljno x *) apply (erule_tac x = "x" in allE) apply (erule_tac x = "x" in allE) (* sada posmatranjem skupa pretpostavki vidimo da nam odgovara da razbijemo drugu implikaciju (jer njenu levu stranu vec imamo u pretpostavkama *) apply (erule impE) back apply assumption apply (erule notE) apply assumption done text\ (1) kostur automatskog dokaza \ lemma assumes "\ x. \ paran x \ neparan x" assumes "\ x. neparan x \ \ paran x" shows "\ x. \ (paran x \ neparan x)" proof fix x show "\ (paran x \ neparan x)" sorry qed text\ (2) naredni korak automatskog dokaza \ lemma assumes "\ x. \ paran x \ neparan x" assumes "\ x. neparan x \ \ paran x" shows "\ x. \ (paran x \ neparan x)" proof fix x show "\ (paran x \ neparan x)" proof assume "paran x \ neparan x" show False sorry qed qed text\ (3) raspisan dokaz \ lemma assumes "\ x. \ paran x \ neparan x" assumes "\ x. neparan x \ \ paran x" shows "\ x. \ (paran x \ neparan x)" proof fix x show "\ (paran x \ neparan x)" proof assume "paran x \ neparan x" from this have "paran x" "neparan x" by auto from this assms(2) have "\ paran x" by auto from this `paran x` show False by auto qed qed text \ Formulisati i dokazati naredno tvrdjenje: Ako za svaki broj koji nije paran vazi da je neparan; i ako za svaki neparan broj vazi da nije paran; pokazati da onda za svaki broj vazi da je ili paran ili neparan \ lemma "(\ x. \ paran x \ neparan x) \ (\ x. neparan x \ \ paran x) \ (\ x. paran x \ neparan x)" apply (rule impI) apply (erule conjE) (* prvo razbijamo konjunkciju na dve pretpostavke *) apply (rule allI) (* pa dva puta primenjujemo allE na obe pretpostavke *) apply (erule_tac x = "x" in allE) apply (erule_tac x = "x" in allE) apply (rule ccontr) (* sada transformisemo stare pp *) apply (erule impE) apply (rule notI) apply (erule notE) apply (rule disjI1) apply assumption apply (erule impE) apply assumption apply (erule notE) apply (rule disjI2) apply assumption done text\ (1) Prvi korak \ lemma assumes "\ x. \ paran x \ neparan x" assumes "\ x. neparan x \ \ paran x" shows "\ x. paran x \ neparan x" proof fix x show "paran x \ neparan x" sorry qed text\ (2) Drugi korak \ lemma assumes "\ x. \ paran x \ neparan x" assumes "\ x. neparan x \ \ paran x" shows "\ x. paran x \ neparan x" proof fix x have "paran x \ \ paran x" by auto (* dodajemo korak da bi napravili grananje po slucajevima *) from this show "paran x \ neparan x" (* kada stavimo from this show ... , ako je this disjunkcija dobijamo automatski dve grane *) proof assume "paran x" show "paran x \ neparan x" sorry next assume "\ paran x" show "paran x \ neparan x" sorry qed qed text\ (3) Treci korak \ lemma assumes "\ x. \ paran x \ neparan x" assumes "\ x. neparan x \ \ paran x" shows "\ x. paran x \ neparan x" proof fix x have "paran x \ \ paran x" by auto (* dodajemo korak da bi napravili grananje po slucajevima *) from this show "paran x \ neparan x" (* kada stavimo from this show ... , ako je this disjunkcija dobijamo automatski dve grane *) proof assume "paran x" from this show "paran x \ neparan x" by auto next assume "\ paran x" from this have "neparan x" using assms(1) by auto from this show "paran x \ neparan x" by auto qed qed text\ ako svaki konj ima potkovice; i ako ne postoji covek koji ima potkovice; i ako znamo da postoji makar jedan covek; dokazati da postoji covek koji nije konj \ lemma "(\ x. konj x \ ima_potkovice x) \ \ (\ x. covek x \ ima_potkovice x) \ (\ x. covek x) \ (\ x. covek x \ \ konj x)" apply (rule impI) (* posto imamo tri konjunkta, konjunkciju razbijamo iz dva puta *) apply (erule conjE) apply (erule conjE) (* sada imamo samo jedan egzistencijalni kvantifikator u premisama, i njega prvog oslobadjamo *) apply (erule exE) (* sada taj novo uvedeni x koristimo u zakljucku *) apply (rule_tac x = "x" in exI) (* sada razbijamo konjunkciju u zakljucku *) apply (rule conjI) (* resavamo prvi podcilj *) apply assumption (* sada resavamo drugi podcilj *) apply (rule notI) (* sada univerzalni kvantifikator u premisama instanciramo vec uvedenim x *) apply (erule_tac x = "x" in allE) (* sada se oslobadjamo implikacije u premisama *) apply (erule impE) apply assumption (* "ne postoji" je primarno negacija, pa moramo da se oslobadjamo nje prvo *) apply (erule notE) (* sada je egzistencijalni kvantifikator presao u zakljucak i instanciramo ga vec uvedenim objektom x *) apply (rule_tac x = "x" in exI) apply (rule conjI) apply assumption apply assumption done text\ (1) kostur dokaza \ lemma assumes "\ x. konj x \ ima_potkovice x" assumes "\ (\ x. covek x \ ima_potkovice x)" assumes "\ x. covek x" shows "\ x. covek x \ \ konj x" proof - from assms(3) obtain x where "covek x" by auto have "konj x \ \ konj x" by auto from this have "covek x \ \ konj x" sorry from this show "\ x. covek x \ \ konj x" by auto qed text\ (2) naredni korak raspisan \ lemma assumes "\ x. konj x \ ima_potkovice x" assumes "\ (\ x. covek x \ ima_potkovice x)" assumes "\ x. covek x" shows "\ x. covek x \ \ konj x" proof - from assms(3) obtain x where "covek x" by auto have "konj x \ \ konj x" by auto from this have "covek x \ \ konj x" proof assume "konj x" show "covek x \ \ konj x" sorry next assume "\ konj x" show "covek x \ \ konj x" sorry qed from this show "\ x. covek x \ \ konj x" by auto qed text\ (3) kompletan dokaz --- nije bas elegantan, bolje je koristiti prirodnu dedukciju \ lemma assumes "\ x. konj x \ ima_potkovice x" assumes "\ (\ x. covek x \ ima_potkovice x)" assumes "\ x. covek x" shows "\ x. covek x \ \ konj x" proof - from assms(3) obtain x where "covek x" by auto have "konj x \ \ konj x" by auto from this have "covek x \ \ konj x" proof assume "konj x" show "covek x \ \ konj x" proof from `covek x` show "covek x" by auto next show "\ konj x" proof assume "konj x" from this assms(1) have "ima_potkovice x" by auto from `covek x` this have "\ x. covek x \ ima_potkovice x" by auto from this assms(2) show False by auto qed qed next assume "\ konj x" from this and `covek x` show "covek x \ \ konj x" by auto qed from this show "\ x. covek x \ \ konj x" by auto qed text\ ako je svaki kvadrat romb; i ako je svaki kvadrat pravougaonik; i ako znamo da postoji makar jedan kvadrat; onda postoji makar jedan romb koji je istovremeno i pravougaonik \ lemma "(\ x. kvadrat x \ romb x) \ (\ x. kvadrat x \ pravougaonik x) \ (\ x. kvadrat x) \ (\ x. romb x \ pravougaonik x)" apply (rule impI) apply (erule conjE) apply (erule conjE) apply (erule exE) (* ovim se uvodi x koji je kvadrat *) apply (erule_tac x = "x" in allE) apply (erule_tac x = "x" in allE) apply (rule_tac x = "x" in exI) apply (rule conjI) apply (erule impE) apply assumption apply assumption apply (erule impE) apply assumption apply (erule impE) apply assumption apply assumption done lemma assumes "\ x. kvadrat x \ romb x" assumes "\ x. kvadrat x \ pravougaonik x" assumes "\ x. kvadrat x" shows "\ x. romb x \ pravougaonik x" proof - from assms(3) obtain x where "kvadrat x" by auto from this assms(2) have "pravougaonik x" by auto from `kvadrat x` assms(1) have "romb x" by auto from this `pravougaonik x` show "\ x. romb x \ pravougaonik x" by auto qed end