|
|
|
 |
|
真理を求める 真理を示す
真理を求める
真理表の1セットの結果に対してブール表現を検索する。
変数が何回か繰り返されるような長いブール表現は時々ソースコードの中に入っている。このようなブール表現はより簡単な何らかのブール表現で置き換えることができればもっと効率的でもっとエレガントになるだろう。
たとえば、ブール表現
result = a & (b | c) ^ a & ~b | ~c ;
はa、b、cの変数がそれぞれ2回繰り返されたので、以下のようなより簡単なブール表現で置き換えられる可能性がある。
result = a & b | ~c ;
カルノー図(またはベイチ図)はブール式をよく理解するためにとても役に立つのに対して、このツールは時間を節約するために役に立つかもしれない(運がよければ ^^)。まずは、ブール表現に対して真理を示すを用いて真理表を構築して、その結果に対してブール表現を以下で検索する。
注意:Javascriptではビット演算子の優先順位は ~, &, ^, | で、表現 a|~b&c^d の意味は a|(((~b)&c))^d) または論理的には a || (((!b) && c) XOR d) である。しかしJavascriptは論理的XORをサポートしていないので、それを a XOR b = (a || b) && !(a && b)でシミュレートする。
例
僕がこのツールを書いたのはもっと単純なツール、HTMLエンコーダに取り組んだときだった。エンコード関数の核心には文字がHTMLコード表にエントリがあるかをチェックして、あればそれを返す、なければ元の文字を返す。さらに文字がスペースの場合は、ユーザがそれをエンコードするかどうかを選択できる。これが働くにつぎのような分枝を必要とする。
return spc ? (html ? html : c) : (c==' ' ? c : (html ? html : c)) ;
この分枝をブール式として考えるとその真理表は以下のようなものになる。
| spc | html | c==' ' | 結果 | |
| 1 | 1 | 1 | 1 | (html) |
| 1 | 1 | 0 | 1 | (html) |
| 1 | 0 | 1 | 0 | (c) |
| 1 | 0 | 0 | 0 | (c) |
| 0 | 1 | 1 | 0 | (c) |
| 0 | 1 | 0 | 1 | (html) |
| 0 | 0 | 1 | 0 | (c) |
| | 0 | 0 | 0 | 0 | (c) |
さて、まったく同じ結果を返すようなもっと単純なブール表現で以上の分枝を置き換えたい。やるべきことはただひとつ、「11000100」という結果に対して3変数で検索するだけ。表現の長さが3のときは何も表現を見つからなかったが、4のときは以下の表現を見つかった。
(b & c & ~a) ^ b
(b & ~c) | (a & b)
Javascriptは論理的なXORを持っていないので、分枝を置き換えるには以下のように最後の表現を使うことにした。
return ((html && !(c==' ')) | (spc && html)) ? html : c ;
このツールを利用したほとんどのお客様は以下のツールも利用しました。 カレンダー (9.1%), Source (9.1%), Source (9.1%) |
|