基本情報技術者試験問題に挑戦しよう!「命題の真理値」~Pythonでつくって確かめる~ 【GitHub対応】

パソコン GitHubでつくって学ぶ

基本情報技術者試験とは

基本情報技術者試験は、情報処理推進機構(IPA)が実施し、「情報処理の促進に関する法律」に基づき経済産業省が認定する国家試験である。
ITエンジニアとしてキャリアをスタートする方のIT基礎力を問う試験で、「ITエンジニアの登竜門」とも言われる。
科目Aと科目Bの両科目で合格点を取らなければ、基本情報技術者試験の合格とはならない。

それでは、基本情報技術者試験(科目A)のサンプル問題にチャレンジしてみよう。
今回は、論理的に導いた答えを、Pythonですべての組み合わせを実際に調べることで裏付けてみる。

なお、この記事で使用するコードは、筆者の学習用リポジトリ pc-labo-fe-exam-python の 03_shinrichi フォルダにまとめている。

サンプル問題(科目A)

問3
P,Q,R はいずれも命題である。命題P の真理値は真であり,命題 (not P ) or Q
及び命題 (not Q ) or R のいずれの真理値も真であることが分かっている。Q,R の
真理値はどれか。ここで,X or Y はX とY の論理和,not X はX の否定を表す。

正解:エ

それでは、問題を検討してみよう。

論理和(A OR B)と否定(NOT A)

論理和とは、AとBのどちらか一方、または両方が「1」の場合に、答えが「1」となる論理演算。

否定とは、入力の反対が答えになる論理演算。

設問から命題Pは真となっているので、そのPが含まれる「 (not P ) or Q=真」について考えてみよう。
まず、Pが「真」なので、not Pは「偽」となる。すると、「 (not P ) or Q= 真」は「偽 or Q =真」と書き換えることができる。

そして、論理和の特徴を満たすためには、Qは「真」であることがわかる。

次に、 「(not Q ) or R=真」について考えてみよう。

先ほど、Qは「真」とわかったので、 (not Q ) は「偽」である。すると、「(not Q ) or R=真」は「偽 or R=真」と書き換えることができる。先ほど同様、論理和の特徴を満たすためには、Rは「真」であることがわかる。

したがって、QとRはいずれも真である。

Pythonでつくって確かめてみよう

手計算で1つずつ真偽をたどる代わりに、P・Q・Rが取り得るすべての真偽の組み合わせ(2の3乗=8通り)をPythonで総当たりし、問題文の条件をすべて満たす組み合わせだけを絞り込んでみよう。

from itertools import product


def check(P, Q, R):
    """問題文の3つの条件をすべて満たすかを判定する"""
    cond1 = P                       # 命題Pの真理値は真
    cond2 = (not P) or Q            # (not P) or Q が真
    cond3 = (not Q) or R            # (not Q) or R が真
    return cond1 and cond2 and cond3


print("P     Q     R     -> 条件をすべて満たすか")
for P, Q, R in product([True, False], repeat=3):
    mark = "◯" if check(P, Q, R) else ""
    print(f"{str(P):<5} {str(Q):<5} {str(R):<5} {mark}")

print()
print("=== 条件をすべて満たす組み合わせ ===")
for P, Q, R in product([True, False], repeat=3):
    if check(P, Q, R):
        print(f"P={P}, Q={Q}, R={R}")

実行例

P     Q     R     -> 条件をすべて満たすか
True  True  True  ◯
True  True  False 
True  False True  
True  False False 
False True  True  
False True  False 
False False True  
False False False 

=== 条件をすべて満たす組み合わせ ===
P=True, Q=True, R=True

itertools.product([True, False], repeat=3) を使うと、P・Q・Rそれぞれが True か False を取るすべての組み合わせ(8通り)を自動で生成できる。check() 関数は、問題文の3つの条件(Pは真、(not P) or Q は真、(not Q) or R は真)をそのままPythonの論理演算子 not と or で表現したものである。

8通りすべてを表にしてみると、条件をすべて満たす組み合わせは P=真, Q=真, R=真 の1通りだけであることが確認できる。これは、手計算で導いた「QとRはいずれも真である」という結論と一致している。

手計算では「Pが真だから~」と1本の筋道をたどって答えにたどり着いたが、Pythonで全パターンを総当たりすると、他の組み合わせでは条件を満たさないことまで含めて、答えの一意性を確認できるのが利点である。

まとめ

  • 命題の真理値の問題は、否定(not)と論理和(or)の定義に沿って1つずつ真偽をたどることで解ける
  • Pythonの itertools.product を使えば、命題が取り得るすべての真偽の組み合わせを総当たりでき、手計算の結論を裏付けられる
  • 全パターンを確認することで、「他の組み合わせでは条件を満たさない」ことまで含めて納得感を持って理解できる

筆者のリポジトリ

この記事で扱ったコードは、以下の筆者のGitHubリポジトリで公開している。

GitHub – HappyTalk10/pc-labo-fe-exam-python
Contribute to HappyTalk10/pc-labo-fe-exam-python development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました