4

我正在为我设计的数据流编程语言编写编译器。我真正喜欢它的功能之一是您可以表达以下内容:

x <- a + 1 如果 b > 3;

x <- a - 1 如果 b <= 3;

这意味着类似:

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

为了实现这一点,编译器需要知道:

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

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

是否有任何人都知道的 C/C++ 库能够验证这两个语句(以及更复杂的语句)?或者是否有任何文件可以通过网络获得任何人都知道类似系统的详细信息?或者有人可以描述一种可能的方法吗?

谢谢,

丹尼尔

4

1 回答 1

3

我认为您需要一小组简单的规则来告诉您两个表达式是否相等或完全不同。

让我们从最简单的开始:b>3 和 b<=3

检查它们是否相等很容易:b>3并且b>3相等,但b>3显然b<=3不是。

要查看它们是否完全不同,我们必须比较b>3NOT (b<=3)。通过简单地在它前面添加 NOT,我们将“distinct”更改为“equal”比较。

您的软件现在应该具有转换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 放在表达式之一的前面
  • 使用摩根定律将 NOT 分配到表达式的最基本部分。
  • 然后比较所有元素

例如,假设我们想知道以下表达式是否完全不同:

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

首先在第二个之前放一个大的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)

然后在两个表达式之间找到相同的元素。在这种情况下,第一个表达式中的所有元素都可以在第二个表达式中找到,反之亦然。这意味着原始表达式是完全不同的。

于 2010-08-27T12:33:18.480 回答