Monthly Archives: April 2019

論理値の演算で→(IMP, implication, ならば)があればなぜ便利か?

ブール代数の演算では、AND(∧)、OR(∨)、NOT(¬)があれば、どんな論理式でも構築できるというのが基本ではあるが、命題論理の世界では、PとQが命題(真か偽かのどちらかの結論しか持たない記述)として、P→Qという演算を定義し、頻繁に利用する。この演算は、Pが真の時は、Qの真偽の値が得られる一方、ちょっとわかりにくいのが、Pが偽ならP→Qは真になるというルールだ。ここで、「ならば」というのを日本語として解釈すると、しっくりこない。これは『強いて言えば「ならば」みたいな感じ』程度での理解をしておくのがいいだろう。

この→は、命題論理だけではなく、もちろん、ブール代数でも定義して利用可能だ。論理式で記述すると、P→Qは「¬P ∨ Q」となる。ということは、プログラミング言語できちんと書けるではないかということになるのだが、 →に相当する演算子はあまりプログラミング言語としてサポートしている例は少ない。例えば、OCL(Object Constraint Language)ではサポートされているが、JavaScriptなど他ではあまり見ない。もちろん、演算子の定義ができれば自分で作るという手もあるが、言語でサポートされていない機能はそれだけ馴染みが薄いとも言える。しかしながら、→を使った方がシンプルに論理式を記述できるとしたら、プログラムの中で使ってみたくなる。

→演算が便利な場合はないかと例を考えてみた。ここで、何か商品を販売するときに、付随するオプション的な項目が、それぞれ状態があるとすると、→が使えると考えた。例えば、名刺印刷という基本的なテキストのみの印刷を行う商品があるとする。これに、「顔写真印刷」「会社ロゴ」印刷がオプションとして、追加料金を取っているとしよう。顔写真、会社ロゴ、いずれも画像ファイルを入稿しなければならない。つまり、入稿を確認して、印刷に入れるということだが、もちろん顔写真オプションを選択していないなら、入稿の有無は関係ない。次のように命題を定義する。

P = 顔写真印刷を申し込んだ
Q = 会社ロゴ印刷を申し込んだ
Y = 顔写真の画像をアップロードした
Z = 会社ロゴの画像をアップロードした

そして、名刺印刷のための版下作成が可能かどうか(ここでは簡単のためにオプションの画像が必要であれば入手されているという状況だけで考える)は、以下の論理式で求めることができる。

P→Y ∧ Q→Z

もちろん、真理値表を記述して全部検証すれば問題ないのはわかるが、まずはシンプルに意味的に検証しよう。P、Qはいずれも、→の左辺にあり、値が偽なら、つまり、オプションとして申し込んでいなければ→の結果は真になる。つまり、∧の両側は申し込みしていないものは常に真になり、真偽は申し込みをしているものに限って考えれば良いということになる。そして、申し込みをしていれば、アップロードしたかどうかで、∧の両側の値は決まるので、上記の式が真になるのは両方とも真、つまり、申し込んだオプションが全てアップロードされた場合に真になる。繰り返すが、オプションを何も申し込んでいないと式の結果はやはり真になり、オプション関係なしに印刷に入れば良いということだ。そういった状況が一気に→が表現しているとも言える。

真理値表を作成すると、以下のようになる。なお、オプションとして申し込みをしていないのにアップロードしているという矛盾した状況もある(表の最後の列に*を記述)が、申し込みをしていないという状況だけが結果に影響されるので、そのために式を修正する必要はない。言い換えれば、うまく→の右辺の状況を打ち消してくれている。

PYQZP→YQ→ZP→Y ∧ Q→Z
0000111
0001111 *
0010100
0011111
0100111 *
0101111 *
0110100 *
0111111 *
1000010
1001010 *
1010000
1011010
1100111
1101111 *
1110100
1111111

以上のように、「商品のオプション」という状況なら、→演算でシンプルに論理式を記述できそうだ。もちろん、¬と∨で展開してもさほどではないが、複雑な式は別の機会にみた場合には、間違いを誘発しそうな感じがありありとする。また、→での記述の方が、要求や要件の記述に近いと言うことも期待できるのである。