真理表

 コンピュータで扱う式の中に論理式があります。これは値が真または偽を持つ式で,条件式を表すときなどに使われます。If 文や,While 文の条件式として使われるものです。

 例えば,

(a>=1) and (b<0)

は論理式の簡単なものの1つです。このようなものを扱う学問として記号論理学がありますが,その中に命題論理学という分野があります。この命題論理学は真と偽の組み合わせでどのような結果が得られるかを調べる分野です。

 この命題論理学での使われる基本的道具として,真理表があります。

真理表は例えば,pとqを論理式としたとき,p -> q (pならばq)がいつ真になり,いつ偽になるかを表にしたものが p -> q の真理表です。

p -> q の真理表

p q p -> q

 コンピュータで表れる論理式は命題論理式だけではありませんが,論理演算子

and, or, not, xor, imp, eqv, =,

の意味はこの真理表で決定(定義)されます。

論理定数・論理変数

 Basic ではもともとは論理式そのものを対象とはしていませんでしたが,近年 Visual Basic では論理型をサポートしています。

Tiny Basic も Ver. 1.09 から論理型定数・変数をサポートしています。この変数・定数を使うと,命題論理式における真理表を作成するプログラムを簡単に書くことができます。

 ここでは,論理型変数・定数の使い方を説明しながら,真理表を作成するプログラムを書いてみましょう。


論理定数

 論理定数は真,または,偽の2種類のみです。Basic では

 真を True

 偽を False

で表します。


論理変数

 論理変数は論理値を保持する変数です。論理変数を使う場合,変数宣言する必要があります。宣言は Public または Dim を使って宣言します。

例:pを論理変数として,使うことを宣言する。

Dim p as boolean

論理学者 Boole にちなんで論理型がboole型といわれることから,この用語 as boolean が用いられます。


論理型を使った簡単なプログラムを挙げます。説明のため行番号を付けます。

01   Dim p as boolean
02   a=2
03   p=a>1
04   Print p
05   a=-1
06   p=a>1
07   Print p
08   End

1行で p を論理型変数として宣言しています。

3行目で p = a > 1 としていますが,これは a>1 であるかどうかの結果を p に代入しています。これは真ですから,p にはTrue が代入されます。

4行目はこの結果を表示するわけですが,結果は True と表示されます。

6行目で再び,p = a > 1 としていますが,今度は aは-1ですから,この論理値は偽になります。従って,7行目では False が表示されます。

真理表の計算

 適当に,命題論理式を与えたとき,その真理表を作成するプログラムを作りましょう。

簡単のため,2変数 p と q からできる論理式 f(p,q) を考えます。


1.まず使う変数を宣言します。

Dim p as boolean
Dim q as boolean

2.f(p,q) も論理値関数として定義します。

Function f(p as boolean, q as boolean) as boolean
    f = (p xor q) imp (not p)
End function

この関数の中の式を変えるとそれに対応する真理表が出来ます。
関数の引数はすべて局所的変数で型宣言もする必要があります。
関数の値として論理値を返す場合も関数自体を論理型宣言をする必要があります。


3.表の作成

 これはpとqが全ての真理値の組み合わせを取って行けば良いので, For 文を使うことにします。そのための補助として新たな論理配列変数を使いましょう。tv(1) の時真,tv(2) の時偽とする配列変数を作ります。

Dim tv(2) as boolean
tv(1)=True
tv(2)=False

とします。これを使うと,表の作成部分が次のように書けます。

For i=1 to 2
   p = tv(i)
   For j=1 to 2
      q = tv(j)
      Print p,q,f(p,q)
   Next j
Next j

4.結果表示の改良

 上のことを纏めれば真理表を書くことができますが,少しだけ改良をしましょう。上のままでは真なら True 偽なら False と表示され,形がくずれます。

 それを改良するため,Treuとき真,Falseのとき偽と文字として表示しましょう。そのための関数を定義します。例えばそれを B2Sとしましょう。(Boole to String の意味を込めています。)

Function B2S(b as boolean) as string
   Select case b
      Case True : B2S = " 真 "
      Case False: B2S = " 偽 "
   End select
End Function
プログラム

以上のプログラムを纏めると以下のようになります。プログラムはここです。

Dim p as boolean
Dim q as boolean
Dim tv(2) as boolean

tv(1)=True
tv(2)=False

Function f(p as boolean, q as boolean) as boolean
    f = (p xor q) imp (not p)
End function


Print " p    q    f"
Print
For i=1 to 2
   p=tv(i)
   For j=1 to 2
      q=tv(j)
      Print B2S(p);" ";B2S(q);" ";B2S(f(p,q))
   Next j
Next i 
End

Function B2S(b as boolean) as string
   Select case b
      Case True : B2S = " 真 "
      Case False: B2S = " 偽 "
   End select
End Function
まとめ

 Basic では宣言や型を余り気にしないでプログラミングするというのが,もともとのBasic の考えであったかも知れません。しかし,論理式を数でもって代用するのはむしろ不自然ですし,論理型として扱った方が分かりやすいプログラムになることも多々あります。また,型の認識は中級以上のプログラマーに取っては必須のことでもあります。

Tiny Basic でも色々な型宣言ができますから,それに慣れるのも良いでしょう。