【问题标题】:Is there a C/C++ library that allows you to find out whether a set of expressions are mutually exclusive?是否有一个 C/C++ 库可以让您找出一组表达式是否互斥?
【发布时间】:2010-08-27 12:02:42
【问题描述】:

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

x 3;

x

这意味着类似:

x 3);

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

((b > 3) && (b

((b > 3) || (b

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

谢谢,

丹尼尔

【问题讨论】:

  • 作为更新,该方法与帕特里克的回答大体相似。当你构造一个约束时,在内存中只有一个表示它,尽管某些表达式的操作数可以切换。 IE。构造 "(x=1)" 产生 "true" 并且对约束进行操作非常直观。谢谢,

标签: c++ expression reasoning


【解决方案1】:

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

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

检查它们是否相等很容易:b>3b>3 相等,b>3b<=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)

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

【讨论】:

  • 我想除了操作每个表达式的图形之外,还有一种方法是枚举每个表达式的真值表,然后比较它们。
  • @Oli,这将要求您具有明确的 a 和 b 值。 OP 问的是如何在没有实际值的情况下进行比较。
  • @Oli 生成真值表可能在某些情况下有效,但有些表达式可能会生成难以处理的大表。
  • @dan:但是,真值表的大小与 Patrick 建议的逻辑图的可能排列数相同......
  • @dan:同意,Patrick 的图表与 # 个变量成正比。但是,我不认为基于对数字逻辑讲座的模糊回忆,找到一组确定的规则(在一般情况下)允许比较两个布尔表达式的身份(正如帕特里克的方法所要求的)是微不足道的。如果我是对的,那么您最终可能不得不在图表中列举德摩根规则的所有潜在应用等。显然,如果我错了,那么帕特里克的方法肯定更好。
猜你喜欢
  • 2011-08-25
  • 2015-04-20
  • 2012-09-01
  • 2013-03-13
  • 2011-05-23
  • 2023-02-24
  • 2022-11-19
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多