代码之家  ›  专栏  ›  技术社区  ›  dan_waterworth

是否有一个C/C++库允许你找出一组表达式是否互斥?

  •  4
  • dan_waterworth  · 技术社区  · 14 年前

    我正在为我设计的数据流编程语言编写一个编译器。我非常喜欢它的一个特点是,您可以表达以下内容:

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

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

    这意味着:

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

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

    有没有人知道的C/C++库能够验证这2个语句(以及更复杂的语句)?或者网上有没有人知道类似系统的细节的论文?或者有人能描述一种可能的方法吗?

    丹尼尔

    1 回复  |  直到 14 年前
        1
  •  3
  •   Patrick    14 年前

    我认为你需要一套简单的规则来告诉你两个表达式是相等的,还是完全不同的。

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

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

    b>3个 NOT (b<=3) . 通过简单地在前面添加NOT,我们将“distinct”改为“equal”比较。

    您的软件现在应该有了转换的逻辑 否(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
    

    现在将这两个规则结合起来:

    • 不要放在其中一个表达式前面
    • 不要用摩根斯定律把它分配到表达式最基本的部分。
    • 然后比较所有元素

    e、 g.假设我们想知道下列表达式是否完全不同:

    (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))
    

    现在使用第一条规则从两个表达式中删除not:

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