基本情報技術者試験とは
基本情報技術者試験は、情報処理推進機構(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リポジトリで公開している。





コメント