{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Pravdivostní tabulky\n", "\n", "---" ], "metadata": { "id": "nECGmqDPwfjV" } }, { "cell_type": "markdown", "source": [ "## Instalace a import" ], "metadata": { "id": "QqlKMVNESnAy" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YKaRYO1pA_Cu" }, "outputs": [], "source": [ "%pip install truth-table-generator" ] }, { "cell_type": "code", "source": [ "import ttg" ], "metadata": { "id": "1GC4peTNwz5H" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Výroky, přepis pomocí formulí\n", "\n", "### Logické spojky\n", "* negace\n", " * v ttg zápis pomocí `not`, případně `-`, nebo `~` (`not p`, `-p`, `~p`)\n", " * `not p` je pravdivé tehdy, když `p` není pravdivé\n", "* a zároveň\n", " * v ttg zápis pomocí `and`, například `p and q`\n", " * `p and q` je pravdivé pouze v případě, kdy jsou obě formule `p` i `q` pravdivé\n", "* nebo\n", " * v ttg t zápis pomocí `or`, například `p or q`\n", " * `p or q` je pravdivé pouze v případě, kdy je pravdivá alespoň jedna z formulí `p` a `q`\n", "* implikace\n", " * v ttg zápis pomocí `=>`, například `p => q`\n", " * `p => q` je pravdivé, pokud `p` není pravdivé nebo je `q` pravdivé\n", "* ekvivalence\n", " * v ttg zápis pomocí `=`, například `p = q`\n", " * `p = q` je pravdivé, pokud mají `p` a `q` stejnou pravdivostní hodnotu (buď jsou oba nepravdivé, nebo oba pravdivé)\n", "\n", "### Problémy `ttg`\n", "* Balíček `truth-table-generator` má očividně problém s použitím více operátorů na stejné úrovni uzávorkování (například `a and b and c`)\n", "* Řešením je doplnění závorek\n", " * `(a and b) and c`, případně `a and (b and c)`\n", " * pozor: `a => (b => c)` a `(a => b) => c)` nejsou ekvivalentní zápisy! Stejně tak `(-a) => b` není ekvivalentní zápisu `-(a => b)`.\n", " * doporučuju závorkovat i negaci (například `a => (-b)`), i když to vypadá, že v tomto případě vše funguje jak má.\n" ], "metadata": { "id": "ddv5IiaBxCsj" } }, { "cell_type": "markdown", "source": [ "### Přepis českých vět pomocí formulí\n", "\n" ], "metadata": { "id": "igDs9Z43cC7T" } }, { "cell_type": "markdown", "source": [ "### Cvičení 1\n", "\n", "Text:\n", "\n", "*Červenáček je členem RŠ, ale není pravda, že zároveň\n", "Štětináč pěstuje krysy a Rychlonožka je statečný.*\n", "\n", "Analýza:\n", "* *Červenáček je členem RŠ* --> atomická formule `p`\n", "* *Štětináč pěstuje krysy* --> atomická formule `q`\n", "* *Rychlonožka je statečný* --> atomická formule `r`\n", "* tj. `p and -(q and r)`" ], "metadata": { "id": "_fml7CAVgBHG" } }, { "cell_type": "code", "source": [ "print(ttg.Truths([\"p\", \"q\", \"r\"], [\"p and (-(q and r))\"]))" ], "metadata": { "id": "R42uHwJjhVnl" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Cvičení 2\n", "\n", "Premisy:\n", "* *Není pravda, že zároveň Mirek Dušín je statečný a Bohouš je pravdomluvný.*\n", "* *Mirek Dušín je statečný.*\n", "\n", "Závěr:\n", "* *Bohouš není pravdomluvný.*\n", "\n", "Analýza:\n", "* Pokud máme premisy a závěr, víme, že ověřujeme platnost \"pokud platí premisy, pak platí i závěr\"\n", "* *Mirek Dušín je statečný* --> atomická formule `m`\n", "* *Bohouš je pravdomluvný* --> atomická formule `b`\n", "* *Není pravda, že zároveň Mirek Dušín je statečný a Bohouš je pravdomluvný.* --> `-(m and b)`\n", "* Z premis vyplývá závěr: `(-(m and b) and m) => -b`\n", "* V buňce níže jsem doplnil závorky i kolem `-(m and b)` (tj. `(-(m and b))`), bez toho to zlobilo" ], "metadata": { "id": "CIV8ekuXhvGA" } }, { "cell_type": "code", "source": [ "print(ttg.Truths([\"m\", \"b\"], [\"-(m and b)\", \"((-(m and b)) and m) => -b\"]))" ], "metadata": { "id": "YsgKPABJkxp1" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "V tomto případě nám v posledním sloupci vyšly \"samé jedničky,\" tj. jedná se o tautologii a výrok je tzv. \"deduktivně platný.\"" ], "metadata": { "id": "EvVJ_JK4lxEm" } }, { "cell_type": "markdown", "source": [ "### Cvičení 3\n", "\n", "Premisy:\n", "* *Rychlonožka, Červenáček a Bohouš běželi závod u Masné ohrady.*\n", "* *Není pravda, že Rychlonožka a Štětináč běželi závod u Masné ohrady.*\n", "\n", "Závěr:\n", "* *Není pravda, že Bohouš a Štětináč běželi závod u Masné ohrady.*\n", "\n", "Analýza:\n", "* *Rychlonožka běžel závod* --> atomická formule `r`\n", "* *Červenáček běžel závod* --> atomická formule `c`\n", "* *Bohouš běžel závod* --> atomická formule `b`\n", "* *Štětináč běžel závod* --> atomická formule `s`\n", "* *R, Č a B běželi závod* --> `r and c and b`\n", "* *Není pravda, že R a Š běželi závod* --> `-(r and s)`\n", "* *Není pravda, že B a Š běželi závod* --> `-(b and s)`\n", "* Z premis vyplývá závěr: `((r and c and b) and -(r and s)) => -(b and s)`\n", "* Níže opět doplněné nějaké závorky" ], "metadata": { "id": "SgBmCeQhlaXP" } }, { "cell_type": "code", "source": [ "print(ttg.Truths([\"r\", \"c\", \"b\", \"s\"], [\"((r and c) and b)\", \"-(r and s)\", \"-(b and s)\", \"(((r and c) and b) and (-(r and s))) => (-(b and s))\"]))" ], "metadata": { "id": "eFWv8KQvnJgM" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "To, že se opět jedná o výrok deduktivně platný, může v tomto případě působit poněkud neintuitivně. Při bližším pohledu na premisy je jasné, že nikdy nemohou být současně platné (Rychlonožka nemůže současně závod běžet i neběžet). V takových případech je argument deduktivně platný nezávisle na závěru. V těchto případech také nedokážeme nic říct o pravdivosti závěru." ], "metadata": { "id": "nrFsAGlpnjEB" } }, { "cell_type": "markdown", "source": [ "### Cvičení 4\n", "\n", "Text:\n", "\n", "*Jestli Mirek Dušín potkal v klubovně Červenáčka, tak\n", "Červenáček byl v klubovně. Jestli tam Červenáček byl, tak\n", "Červenáček nezametá doma chodník. Pokud ale\n", "Červenáčkův tatínek přijel domů, tak Červenáček zametá\n", "chodník. Z toho plyne, že potkal-li MD v klubovně\n", "Červenáčka, tak Červenáčkův tatínek nepřijel domů.*\n", "\n", "Analýza:\n", "\n", "* *Jestli Mirek Dušín potkal v klubovně Červenáčka, tak\n", "Červenáček byl v klubovně.*\n", " * *Mirek Dušín potkal v klubovně Červenáčka* --> atomická formule `p`\n", " * *Červenáček byl v klubovně* --> atomická formule `q`\n", " * tj. `p => q`\n", "* *Jestli tam Červenáček byl, tak Červenáček nezametá doma chodník.*\n", " * *Červenáček byl v klubovně* --> už je přiřazena atomická formule `q`\n", " * *Červenáček **zametá** doma chodník* --> atomická formule `r`\n", " * tj. `q => -r` (v textu je \"nezametá\"!)\n", "* *Pokud ale Červenáčkův tatínek přijel domů, tak Červenáček zametá chodník.*\n", " * *Červenáčkův tatínek přijel domů* --> atomická formule `s`\n", " * *Červenáček zametá chodník* --> už máme přiřaženo `r`\n", " * tj. `s => r`\n", "* *Z toho plyne, že potkal-li MD v klubovně Červenáčka, tak Červenáčkův tatínek nepřijel domů.*\n", " * Tohle je trochu složitější k přepisu, zkusím to tedy trochu víc komentovat:\n", " * *Z toho plyne* nás může vést k pravidlu modus ponens (pokud platí výroky `a` a `a => b`, pak nutně platí i výrok `b`)\n", " * V tomto případě by se dalo *Z toho plyne, že potkal-li MD v klubovně Červenáčka,* intepretovat jako \"Pokud platí výrok `p => q` (první věta) a zároveň `q => -r` (druhá věta) a zároveň `s => r` (třetí věta) a zároveň `p` (Mirek Dušín potkal v klubovně Červenáčka),\"\n", " * *Červenáčkův tatínek nepřijel domů* --> víme, že odpovídá `-s`\n", " * Pokud to celé přepíšeme pomocí logických spojek, dostáváme: `((p => q) and (q => -r) and (s => r) and p) => -s`, což je formule, jejíž pravdivost nás zajímá\n", " * Aby ttg fungoval jak má, v kódu níže jsem doplnil potřebné závorky" ], "metadata": { "id": "7-F2u1ARWJW0" } }, { "cell_type": "code", "source": [ "print(ttg.Truths([\"p\", \"q\", \"r\", \"s\"], [\"p => q\", \"q => (-r)\", \"s => r\", \"((((p => q) and (q => (-r))) and (s => r)) and p) => (-s)\"]))" ], "metadata": { "id": "dB_tNXX9w2aE" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Cvičení 5 - k procvičení\n", "\n", "Premisa:\n", "* *Mažňák je porazitelný.*\n", "\n", "Závěr:\n", "* *Mažňák není neporazitelný.*" ], "metadata": { "id": "yLvnzHT3o7mh" } }, { "cell_type": "code", "source": [], "metadata": { "id": "8iNDrAfJpOLc" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Cvičení 6 - k procvičení\n", "\n", "Text:\n", "\n", "*Karel nebo Petr, ale ne Marie šli na výlet. Karel nešel na\n", "výlet, takže Petr šel na výlet.*" ], "metadata": { "id": "wmValPzxpPou" } }, { "cell_type": "code", "source": [], "metadata": { "id": "TyvjFSBHppRJ" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Cvičení 7 - k procvičení\n", "\n", "Text:\n", "\n", "*Protože ani Karel, ani Petr nešli na výstavu, není pravda, že\n", "Karel a Pavel šli na výstavu.*" ], "metadata": { "id": "yx3IaTMSqTq1" } }, { "cell_type": "code", "source": [], "metadata": { "id": "o1PQ4W3dqTPx" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Cvičení 8 - k procvičení\n", "\n", "Text:\n", "\n", "*Plicní rakovina není způsobena kouřením, protože: rakovina\n", "plic je častější mezi kouřícími muži než mezi kouřícími\n", "ženami. Bylo-li by kouření příčinou rakoviny plic, nemohlo\n", "by toto být pravda. Fakt, že plicní rakovina je obvyklejší\n", "mezi kuřáky než mezi kuřačkami implikuje, že je způsobena\n", "něčím v mužské genetické výbavě. Ale je-li způsobena\n", "genomem, pak není způsobena kouřením.*" ], "metadata": { "id": "iQp6nWwMpqXA" } }, { "cell_type": "code", "source": [], "metadata": { "id": "lC3x2ZC-qRof" }, "execution_count": null, "outputs": [] } ] }