はじめに〜探究としての情報学習

iii
第４章
この章では，情報Ｉで扱う「論理回路」の原理について，数学で扱う論理の考え方（背理法の原理や同値の概念など）と併せて解説していきます。身の回りの電気機器は、スイッチが押されたり、センサーがある値以上または以下の数値を観測されたりすると，何らかの反応を示すようになっています。スイッチはONかOFF，センサーは反応するか否かのように2つの状態で表現でき，特に0か1あるいはTRUE（真）かFALSE（偽）の2値で表すことができます。このように入出力情報を0または1で表現できるデジタルな電子回路で，以下の３つの基本回路（AND，OR，NOT）の組み合わせで実現できるものを論理回路といい、その入出力の対応をまとめた表を真理表（真理値表）といいます。以下では「0がFALSE」,「1がTRUE」として対応させて考え，ここでいう真理値とは「TRUE/FALSE」のことを表します。ちなみに0．1のデータはコンピュータの内部では電圧の高低で表現されます。 AND回路（論理積回路）
AND回路は，A，Bの入力がともに1（TRUE）のときのみ，出力が1（TRUE），それ以外は0 (FALSE)とするものです。 AとBが両方ともに真であるときのみ，その結果を真とする「ＡかつB」という論理演算に対応し，「Ａ∧ B」と記します。例えばパソコンで文字入力をする場面で，キーボードのSHIFTキーとAキーを同時に押すと大文字の「A」が表示できますが，この場合，A:「SHIFTキーが押される」，B:「Aのキー
OR回路は，A，Bいずれかの少なくとも一方の入力が1（True）のとき，結果を1とするもの，つまり，ＡかBの少なくとも一方が真のとき，結果を真とする「ＡまたはB」という論理演算に対応し，「ＡＶＢ」で表します。例えば、人が誰も乗っていない2基のエレベータがあり、いずれか一方の「↑」ボタンが押されると「上の階に行くエレベータが止まる」という仕組みを表現することができます。2つの「↑」ボタンが同時に押されても同じ結果を示します。
NOT回路は，入力された1，0の情報を0，1に反転させる回路です。「Ā」で表します。レストランのランチメニューで「パンまたはライスがつきます」といった場合は通常「どちらか一方のみ(either A or B)」を表しますが，論理の世界での「または」（OR）は「少なくとも一方」の意味になります。「どちらか一方」を表す論理回路として，あとで扱うXOR回路というものがあります。 AND回路とOR回路はそれぞれスイッチの直列回路と並列回路に対応させることができますが、NOT回路はそうはいきません。実際には例えばトランジスタという茶子を複数利用して実現されていて，なかなか複雑なものとなっています。ここではあくまでこれらの基本回路を組み合わせた「論理」に注目して，考えていくことにします。 (1)次の回路はNAND回路とよばれるものである。対応する真理表を作成しなさい。 (出力結果はA ∧ Bの否定であることから、A ∧ Bと表す。NANDのNはNOTの意） A B (2)（1）と以下に示す回路の2つについて、入出力の結果が一致することを真理表で確認し，ド・モルガンの法則A ∧ B ⇔ A ∨ Bが成り立つことを示せ（(2)の出力結果は天とBをOR回路で結んでいるので天V Bと表す)。 (3)あるタクシーには，2つの後部座席A, Bのシートベルトが締められているときだけ，「シートベルトを着用してください」のランプ表示が消えるようになっています。（1）（2）の論理回路の入力のA, Bは「各席のシートベルトが締められているとき1，そうでないとき0」とし，出力Lは「『シートベルトを着用してください』のランプが点いているとき1．消えているとき0」とします。この例を用いて、ド・モルガンの法則が成り立っていることを説明せよ。 (考え方)例えば（1）では，まずA, Bの入力がともに1のとき， AND回路で1が出力され， NOT回路で反転されて0が出力されます。このようにA, Bの入力値の組み合わせ4通りについて順に調べます。数学でベン図というものを学びます。これはA  Bを条件としたとき、A  Bを満たすものの集合（真理集合）を下図のように重なりを持つように記したもので，ＡとВ両方満たす部分がこの重なりの部分に対応し，ＡＮＢと書きます。また，ＡとＢの少なくとも一方を満たすものの集合は，A，Bのいずれかで囲まれる部分に対応し，A ∪ Bと書きます（論理演算の∧と∨に対応していますが、微妙に異なることに注意)。この図を利用すると，A ∩ B以外の部分A ∩ Bと，A以外の部分AとB以外の部分Bを合わせた部分AUBとが一致する,つまりA ∩ B = AUBが成り立つことがわかります。これとAUB = An Bを集合のド・モルガンの法則といいます。例題の（2）はこれの論理演算版に相当します。あとで紹介しますが，論理回路はベン図との対応で考えるとわかりやすくなります。 (1)例えばA、Bが1のときは、AND回路の出力が1で、NOT回路を通ると0に反転します。それ以外の組み合わせは入力に0（FALSE）が含まれるので，AND回路の出力が0で， NOT回路で1に反転します。
(2)例えばA, Bがともに1のとき，OR回路に2つとも0が入力されて0が出力されます。 Aが1でBが0のときは、OR回路に0と1が入力されて、1が出力されます。他同様、A, Bがいずれか0のとき，OR回路に1（TRUE）が少なくとも1つ入力されるので，出力は1になります。
以上から，真理表の結果が完全に一致し，ド・モルガンの法則天∧Ｂ ⇔天∨Ｂが成り立つことがわかります。 (3) (1)は「A, Bのシートベルトがともに締められている」以外のとき,『シートベルト着用』の表示が点灯されることを表します。つまり「Aが締められていないかBが締められていないかの一方が少なくとも成り立つ」とき、『シートベルト着用』の表示が出ることになり、これは(2)の回路の説明に合致することから，ド・モルガンの法則が成り立つことがわかります。例題4.1（1）のNAND回路を利用した次の回路を考えます。AND回路の手前で入力Aが2つに分岐しています。
これはAの入力値が，黒丸の結節点で分岐して，AND回路の2つの入力値となることを表します。つまりAの入力値が1のとき，AND回路の入力値は2つとも1となって1が出力， NOT回路で反転して0が出力されます。またAの入力値が0のとき，AND回路の入力値は2つとも0となって0が出力，NOT回路で反転して1が出力されます。つまり，この入出力結果はNOT回路に一致することがわかります。この回路で最初に分岐したあとはNAND回路を表しているので，NOT回路がNAND回路だけで表せたことになります。あとで紹介しますが，AND回路もOR回路もNAND回路だけで表すことができ，実際の論理回路はNAND回路のみで表すことができます。ある部屋の照明は同じ部屋の2つのボタンA、Bで制御できるようになっていて、入出力の結果は上の論理回路で表されます。ここで入力A,  Bは「各ボタンがONのときを1，OFFのとき0」を表し，出力Lは「照明がついているとき1，消えているとき0」を表します。ただし，回路の分岐は図の黒点で示された2点のみとします（この回路をXOR回路といいます)。 (1)入出力結果を示す真理表を作成し、照明の制御を例に論理回路の意味を解釈せよ。 (2) XOR回路は次の図に示す回路と同じ入出力結果になります。空欄にあてはまる回路として適切なものをあとの1～4の中から一つ選びなさい。 (1)例えばA, Bが1 (スイッチがON)のときは，上のAND回路にはAから1が入力，Bからは手前のNOT回路で反転された0が入力される結果として，0が出力されます。同様に(8)製品A,  B,  Cの個数を入れる配列num_abcについて, 「num_abc  =  0」を記述する場所として最も適切な位置を①〜④の中から一つ選びなさい。 (9)空欄　ソ　　チ　┃にあてはまる内容をそれぞれ答えなさい。ある鉄道路線は環状線となっていて、S0～S5までの6つの駅があります。駅間の距離はS0-S1，S1-S2，…，S5-S0駅間の順に，配列dist_list = [2,3,2,4,3,2]に格納されています（単位はkm）。この路線の２駅p, q間の,外回り(outer)と内回り(inner)の距離が短いほうについて、移動距離を算出するmin  dist関数を定義します。さらに，この鉄道会社の運賃は3km未満の移動が150円で，3 km以上は2 kmごとに30円ずつ加算して計算されます。この路線の2駅間について，運賃表fare_listを作成することにします。間1　この環状路線一周の総移動距離loop_distを以下のコードで求めます。例えばS0-S1間の距離はdist_list[0] = 2, SO-S5駅間はdist_list[5]で取り出します。range(a,b)は「a以上b未満」,  len(a)は「配列aの要素数」を表します。 (1)空欄　ア　　にあてはまる内容を答え，空欄　イエ ┃にあてはまる内容を以下の解答群から1つずつ選びなさい（同じものを複数回選んでも構わない）。エつの解答群イ1. dist_label 2. dist_list 4. len(dist_list) 3. loop_dist 5. len(dist_list)-1     6. len(dist_list)+1間2　次にSp駅とSq駅(p, qは0～5のいずれかの整数)間の外回りの移動距離(outer_dist)と，内回り（inner_dist）の移動距離の小さいほうを求める関数min_distを次のコードで定愛します。 # Sp駅とSq駅間の,内回り外回りの近いほうの距離を求めるdef min_dist(dist_list,p,q): loop_dist =  ア    # さきほどの1周の距離を求めるコードを転記for i in range(0,イ): loop_dist = ウ +  エ [i] if p > q: # p > qのとき，p,qの値を入れ替えるouter_dist = 0 for i in range(p,力):共H [i] outer_dist =ク- inner_dist = if outer_dist >= inner_dist: return n else: returnサ(2) [オ ]の3行で,次の(a) ～ (c)を並べ替えて順に実行します。正しい順番を示したものをあとの1～6の中から1つ選びなさい。 (b)q = temp    (c)temp = p (a) p = q 1. (a) (b) (c) 2. (a) (c) (b) 3. (b) (a) (c) 4. (b) (c) (a) 6. (c) (b) (a) 5. (c) (a) (b)カ　]~　サ　]にあてはまる内容を，以下の解答群から1つずつ選びなさい（同(3)空欄じものを複数回選んでも構わない)。サ の解答群力1. loop_dist 2. dist_list     3. inner_dist     4. outer_dist 5. len(dist_list) 6. len(dist_list)-1 7. len(dist_list)+1 8. q 9. q-1 10. q+1 (4)次のコードの実行結果を答えなさい。 print(min_dist(dist_list,5,1))間３　次に，電車での移動距離がdist [km]のときの運賃を求める関数fareを以下のコードで定義します。例えば3km以上5km未満のときは180円となります。