
武蔵野個別指導塾の特徴
高校情報I 論理演算の基本—入力の組から真理値表を作り条件の違いを説明する|武蔵野個別指導塾

2つのスイッチの全入力を表と実行結果で照合し、両方が真のときも含めて読み解く論理演算です。
よくあるのは、高校生が「AまたはBが入っていれば開く」と聞き、両方が真の行を除いてしまう場面です。片方ずつ試すと期待どおりに開くので、誤りに気づきにくいのです。両方が入っている組も試し、言葉と出力の対応を確かめましょう。
ここではスイッチの状態を使ってAND・OR・NOTを設計します。0は偽、1は真を表し、出力の1を開く、0を閉じると決めます。これは判定のための約束であり、機械の構造そのものを表す図ではありません。
条件を表にする問い
問われ方の1つは、文章から演算を選ぶものです。「両方が入ったとき開く」なら、片方が切れている状態を通してはいけません。もう1つは、与えられた回路や式から各入力の出力を埋めるものです。3つ目は、表と要求を比較し、違う行を示して式を直すものです。いずれも名前を暗記するだけでなく、どの組を通すかを確定します。
入力AとBにはそれぞれ0か1を与えます。出力も0か1で答え、入力の順は A、B とします。同じ値でも別々のスイッチの状態です。2つの入力をそれぞれ固定してもう一方を変えると、(0, 0)、(0, 1)、(1, 0)、(1, 1) の4組が抜けなく並びます。1組を試した結果から、残りの組の結果を決めることはできません。
「または」は日常の会話ではどちらか片方と受け取られることもあります。しかし論理演算のORでは、少なくとも一方が真なら真です。両方が真の組も含みます。片方だけを許す条件が必要なら、その旨を別に指定し、ORと区別して設計します。
3つの演算と真理値表
ANDは入力が両方とも1のとき1です。ORは入力のうち1が少なくとも1つあるとき1です。NOTは1つの入力を反転し、0を1、1を0にします。ANDとORは2入力、NOTは1入力という違いにも注意します。図1のように、入力の意味を決めてからそれぞれの結果へ進みます。

図1のように、AとBの2本からANDまたはORの出力を作り、NOTはAだけを受け取ります。NOTの結果はBを見ずに決まります。下の真理値表は、ありうる入力と出力を行にしたものです。NOT Aの値が同じAについて2回現れるのは、Bの2状態を並べているためです。
| A | B | A AND B | A OR B | NOT A |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
AND列では最後の行に注目します。Aが1でもBが0なら、両方という条件を満たしません。OR列では最初の行以外は少なくとも一方が1です。最後の行も条件を満たすので1です。NOT列では、Aが0の2行が1、Aが1の2行が0です。Bを反転する列とは異なります。
表の各行を作るときは、先に入力を4組書き、演算ごとの条件に照らして出力を入れます。入力を書きながら出力も埋めると、(1, 1) を落としやすくなります。入力が0か1の2通りずつという前提があるので、4組を列挙すればこの範囲の全入力を調べられます。
基本例題:2つの確認がそろったら開く
展示箱のふたを開く条件を考えます。スイッチAは固定具を外したら1、Bは安全確認を終えたら1です。両方が1のときだけ開く判定を作り、4組の出力を0か1で答えてください。実際の機械の安全を保証するものではなく、判定条件を練習する設定です。
まず手で考えます。(0, 0) はどちらの確認も済んでいないので閉じます。(0, 1) は固定具が残り、(1, 0) は安全確認が残るので、どちらも閉じます。(1, 1) は2条件がそろうので開きます。順番どおりの期待値は 0、0、0、1 です。図2のように2本の入力をANDに渡し、結果を開閉へ対応させます。

図2のように、入力がともに1の場合に出力が1です。結果の1を場面へ戻すと、固定具が外れ、安全確認も終わっていることを確認できます。たとえば (1, 0) では後者が未完了なので、出力0が要求に合います。
次の自作コードは真偽値を演算し、結果を整数として表示します。入力はコード内に固定し、対話入力は受け付けません。表示順はA、B、AND、OR、NOT Aです。
pairs = [(0, 0), (0, 1), (1, 0), (1, 1)]
for a, b in pairs:
x = bool(a)
y = bool(b)
both = x and y
either = x or y
inverse = not x
print(a, b, int(both), int(either), int(inverse))
1行目は入力の4組を順に用意します。2行目は1組ずつaとbに取り出します。3、4行目は0と1を真偽値に変え、5行目がAND、6行目がOR、7行目がAのNOTです。8行目は真偽値を0か1へ戻して表示します。たとえば (0, 1) の途中ではxが偽、yが真で、bothは偽、eitherとinverseは真です。繰り返しは有限個の4組を取り出し終えると止まります。
Python 3.14.8で、上に示した4組を入力として実行すると次の出力を得ます。期待したAND列は手で求めた 0、0、0、1 と一致します。
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
出力を表と行ごとに照らすとORとNOTも一致します。全入力を調べたことと、各演算の定義を各行に適用したことが、この小さな入力範囲での確認の根拠です。実行が成功したという事実だけでは、要求の読み違いまで防げません。開くべき行を先に決めてから比較します。
標準例題:どちらかの連絡で開く
別の展示箱ではAを係からの連絡、Bを管理者からの連絡とし、少なくとも一方の連絡があれば開く約束です。両者から連絡があっても開きます。入力順は先ほどと同じとし、開閉の出力を0か1で答えてください。
連絡がない (0, 0) は0、片方からある (0, 1) と (1, 0) は1です。両方からある (1, 1) にも少なくとも一方が含まれるため1です。期待値は 0、1、1、1 で、先の実行のOR列と一致します。最後の1を場面へ戻せば、連絡が2件あっても開くという条件に合います。ANDを使うと片方だけの2行が0となり、要求を満たしません。
設計の分かれ目は「少なくとも一方」か「両方」かです。入力名が変わっても、出力にしたい行を並べれば演算を選べます。単に「または」とだけ書かれていて片方限定かどうかが不明な現実の依頼では、許される組を先に確認して仕様に記します。
発展例題:閉じる条件から考える
別の箱でAは点検が必要なら1、Bは準備が不足していれば1とします。いずれかの問題があると閉じ、どちらの問題もないとき開くと決めます。A、Bの順に4組を並べ、開く出力を0か1で答えてください。
まず問題があるかどうかは A OR B です。その結果を反転すると、開く条件は NOT (A OR B) になります。途中列を省かず書くと、OR列は 0、1、1、1、開く列は 1、0、0、0 です。最初の行を箱の状態に戻すと、点検の必要も準備不足もないので開いてよく、残りの行では少なくとも1つの問題があるため閉じます。
NOTの対象はORの結果全体です。NOT A OR B とすると (0, 1) で1になり、準備不足でも開いてしまいます。かっこで対象を明示し、途中のOR列を作ると、この違いを追えます。先のコードのOR列を0と1で反転すれば期待値と照合できます。これは同じ4組についての説明であり、入力を増やした場合の表を省略できるという意味ではありません。
間違えた行を直す
標準例題のORを「片方だけ」と誤解すると、誤った出力は 0、1、1、0 です。手で4行を再現すると、最初に要求と食い違うのは (1, 1) です。図3のように、その行の両方の入力が1であることと、要求の「少なくとも一方」を並べて見ます。

図3のように、誤った0を1に修正します。原因はORを片方限定と読んだことです。修正後の4行は 0、1、1、1 で、先のコードを再実行したOR列と一致します。修正した行だけでなく、片方の2行と両方0の行も再確認し、別の行を壊していないことを見ます。
入力が0と1以外の値だった場合は、ここで定めた表の対象外です。上のコードは固定された入力を使うので、壊れた外部入力を検出する仕組みはありません。例えば数値2をboolに渡すと真になるため、未知の入力にそのまま使うと誤った状態を受け入れます。外から受け取る設計では、0か1かを検査し、違えば判定せず入力エラーとして扱うと決めます。空の入力や文字も同じく判定しません。外部機器の応答待ちや時間切れはこの固定入力の演算にはなく、実機へつなぐなら別途、待ち時間と失敗時の動作を定めて試す必要があります。
入力検査を追加する場合の試験も、正常な4組と同程度に具体化します。数値2、負の数、空の入力、数字以外の文字はそれぞれ入力エラーを期待し、開閉の判定を行わないことを確認します。0と1を文字で受け取る設計なら、変換前に許す文字を決め、空白を許すかも仕様に書きます。変換に失敗した場合を0として扱うと、未入力が偽のスイッチに化けるため、エラーと正常な0は分けます。実機との通信を加える場合には、正常応答に加え、応答なし、途中で切断、判定不能な応答、時間切れを別々に試し、失敗時に開閉指令を出さないなどの動作をあらかじめ定めます。これらは拡張時の試験設計であり、上の固定入力のコードを使った実行結果ではありません。
練習:条件を入力の組へ戻す
各問は独立した設定です。0は偽、1は真、出力1は指定された動作を行うことを表します。入力は0か1に限ります。表の順は (0, 0)、(0, 1)、(1, 0)、(1, 1) です。
- 2つの鍵A、Bがともにかかったら表示灯をつけます。演算名と4行の出力を答えてください。
- 2つの呼出しボタンA、Bの少なくとも一方が押されたらベルを鳴らします。演算名と4行の出力を答えてください。
- Aが1なら照明を消し、Aが0ならつけます。Aが0、1の順に照明の出力と演算名を答えてください。
- Aが在庫不足、Bが点検中を表します。いずれの状態でもないとき貸出可能とする出力を、途中のOR列とともに4行で答えてください。
- ORの表を 0、1、1、0 と書いた人がいます。誤った入力の組と正しい値を答え、両方のボタンが押された場合のベルの動作に戻して理由を述べてください。
解答と照合
- AND、0、0、0、1です。最後の行では2つの鍵がかかっているので点灯し、片方が0の行では両方という条件が成立しません。基本例の実行のAND列でも一致します。
- OR、0、1、1、1です。両方が押された最後の行も呼出しがあるのでベルを鳴らします。実行のOR列と照合できます。
- NOT、1、0です。Aが0では照明をつけ、1では消すという指定へ戻して確かめます。実行表のNOT A列はAが0の行で1、Aが1の行で0です。
- OR列は 0、1、1、1、貸出可能の列は 1、0、0、0 です。最初の行は不足も点検もないので貸出可能です。他の行には少なくとも1つ問題があり、貸出不可です。実行のOR列を反転して照合します。
- (1, 1) が誤りで、正しくは1です。両方押されたときにも少なくとも一方が押されているのでベルが鳴ります。残る3行はORの定義に一致します。
覚えておくこと
- ANDは両方が真のとき真です。
- ORは少なくとも一方が真のとき真で、両方が真の行も含みます。
- NOTは指定した1つの値を反転します。
- 入力の全組を並べ、要求と出力を1行ずつ照合します。
表を埋める途中で迷ったら、先に演算名を探すより、その行で箱やベルがどう動くべきかを言葉にします。個別指導で確かめる際は、本人が (1, 1) を含む入力を漏れなく書けるか、ORの行を場面に戻して説明できるかを見ます。NOTでは反転する対象を指さし、途中列と最終列のどちらを見ているかも確かめます。入力の組と動作を結び直すと、表の1行が論理演算を支えます。
読んで終わりにするか、ここから変えるか。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




