4

私が設計したデータフロープログラミング言語用のコンパイラを書いています。私が本当に気に入っている機能の1つは、次のことを表現できることです。

x<-b>3の場合はa+1;

x <-a --1 if b <= 3;

これは次のようなことを意味します:

x <-a-1 + 2 *(b> 3);

コンパイラがそれを知る必要がありますが、これをやってのけるために:

((b> 3)&&(b <= 3))= false

((b> 3)||(b <= 3))= true

これらの2つのステートメント(およびはるかに複雑なステートメント)を検証できることを誰もが知っているC / C ++ライブラリはありますか?または、同様のシステムの詳細を誰もが知っているWeb経由で入手可能な論文はありますか?または誰かが可能なアプローチを説明できますか?

ありがとう、

ダニエル

4

1 に答える 1

3

2つの式が等しいか、まったく異なるかを示す簡単なルールの小さなセットが必要だと思います。

最も簡単なものから始めましょう:b>3とb<= 3

それらが等しいかどうかを確認するのは簡単です:b>3そしてb>3等しい、b>3そしてb<=3明らかにそうではありません。

それらが完全に異なるかどうかを確認するには、とを比較する必要がb>3ありNOT (b<=3)ます。その前にNOTを追加するだけで、「異なる」比較を「等しい」比較に変更しました。

NOT (b<=3)これで、ソフトウェアにに変換するロジックが含まれるはず(b>3)です。そして、これらは完全に等しいので、元のものは完全に異なります。

比較がより難しい場合は、モルガンの法則を使い始める必要があります。この法則は、次の式が等しいと述べています。

NOT (A AND B) is equal to NOT A OR NOT B
NOT (A OR B) is equal to NOT A AND NOT B

次に、両方のルールを組み合わせます。

  • いずれかの式の前にNOTを置きます
  • モルガンの法則を使用して、式の最も基本的な部分に配布しないでください。
  • 次に、すべての要素を比較します

たとえば、次の式が完全に異なるかどうかを知りたいとします。

(a<3) and not (b>=7)
(b>=7) or (a>=3)

最初に2番目のものの前に大きなNOTを置きます:

NOT ((b>=7) or (a>=3))

次に、NOTを配布します。

(NOT (b>=7)) and (NOT (a>=3))

次に、最初のルールを使用して、両方の式からNOTSを削除します。

(a<3) and (b<7)
(b<7) and (a<3)

次に、2つの式の間で同じ要素を見つけます。この場合、最初の式のすべての要素が2番目の式にあり、その逆も同様です。これは、元の表現が完全に異なることを意味します。

于 2010-08-27T12:33:18.480 に答える