真理値表(truth table)を作成する
真理値表って、たぶん自分で要素に分解して作成していくものだと思うのですが、めんどくさくないですか。というか自分でやると合ってるんだか間違ってるんだか不安です。基礎がしっかりできていれば間違うことはないのでしょうけどね。
簡単な例ですが、 p かつ q 「p ^ q」 の場合はこうなります。Tが真、Fが偽です。
p q (p ^ q)
F F F
F T F
T F F
T T T
選言、p または q 「p ∨ q」の真理値表は↓こうなります。(「∨」の半角ってどうやったら出せるんだ、、)
p q (p ∨ q)
F F F
F T T
T F T
T T T
調子に乗って含意も出してみます。p ならば q 「p → q」
p q (p → q)
F F T
F T T
T F F
T T T
含意の真理値表、ここでいう2番目の真理値はいつも違和感があるのですが、ワタシだけではないはず。日本語で例文をさらっと聞いたら絶対にTにはならないと思う。でもこれで合ってます。
この例なら簡単ですが、命題数がもっと増えたり、「~(~p ∨ ~q)」 これくらいまで複雑に(これで複雑かよ、というツッコミはなしで…)になるとかなり怪しいです。この論理を具体的な言葉で表したり、頭で理解するのもツラい。「pでないか、またはqでないか、ではない」。。ワケわからん。
ということで、ある論理式から真理値表を自動で生成してくれる方法を探してみました。
Webでお手軽に
ウェブ経由ならここで簡単に生成することができます。入力するそばから間違ってる云々と怒られますが、最後まで論理式を入れるとちゃんと回答してくれます。
「~(~p or ~q)」を投入してみます。
p q ¬(¬p ∨ ¬q)
F F F
F T F
T F F
T T T
便利ですね! 自分で作成した真理値表の答え合わせにも使えそうです。個人的にはブラウザの常駐タブとして置いておきたいくらいです。ちなみに上の方で挙げた例もこのサイトで生成したものを貼り付けてます。
Pythonでやってみたい
言語はなんでもいいのですが、なんとなく真理値表をパッと生成してくれそうなところで Pythonでやってみることにしました。
といってもコーディングをガシガシやるつもりはないので、超手抜きでできる方法を探しました。「truths」というモジュールがあるようです。そのものズバリ、真理値表を作成するためのモジュールです。なんでもあるんですね。pythonはこのライブラリの豊富さが魅力ですね。
pypi.org truths 1.2
Anacondaが入っていてもこのモジュールは標準ではなかったので、インストールが必要でした。端末から pip install truths 。おっと、pipが無いぞと怒られてしまいました。
sudo apt install python-pip しろとのことですが、ワタシはsynapticでやりたいので、そちらでpython-pipをインストールしました。どちらでやっても同じです。
改めてtruthsをインストールし、試してみることにします。簡単な使い方は↑のサイトに書いてあります。
>>> print truths.Truths(['a', 'b', 'x'])
+---+---+---+
| a | b | x |
+---+---+---+
| 0 | 0 | 0 |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
| 1 | 1 | 1 |
+---+---+---+
おぉ、できました。ここではガタガタに見えてるかもしれませんが、端末でやるとキレイに表示してくれます。1が真で、0が偽です。個人的に、T/F表記の方が好きなんですけどね。贅沢言っちゃいけませんね。タダなんだし。
いよいよやってみたかった論理式を投入します。
>>> print truths.Truths(['p', 'q'], ['not (not p or not q)'], ints=False)
+-------+-------+----------------------+
| p | q | not (not p or not q) |
+-------+-------+----------------------+
| False | False | False |
| False | True | False |
| True | False | False |
| True | True | True |
+-------+-------+----------------------+
当たり前ですがWeb版でやったときのと同じになってますね。T/F表記もできました。
これは遊べそうです。