【问题标题】:Construct logic statements through parsing a file通过解析文件构造逻辑语句
【发布时间】:2015-05-12 08:11:23
【问题描述】:

我遇到了读取包含逻辑语句的输入文件的问题,我需要构建一个真值表来确定 ASK 是否匹配任何/所有已确定的模型。我可能希望读入的一些数据的示例是:

(p & z => x) => ((p | d) & z)

请不要太拘泥于这个例子以及它是否真的有意义,我只是为了展示我可能会看到的不同作品而编造出来。多个这样的语句可以用分号分隔。

我已经整理出没有任何戏剧性的分号拆分,现在有一个包含每个单独语句的字符串向量,其中每个字符串如上所示。现在在不涉及括号的情况下,我相信确定这些陈述将是相当直接的,但在他们的参与下,我现在需要在其他人之前计算不同的部分。例如:

(p | d) = result 然后(result & x)

我看到人们讨论使用堆栈来确定开括号是否正确关闭的概念,但我认为这不适合我的情况,因为这不允许我确定哪些语句在什么集合中的括号。

我目前的想法是使用堆栈的想法,并尝试确定语句的“深度”(基本上是嵌套多远),然后用每个语句标记这个数字,但我相信这听起来像一个不优雅的解决方案。有没有人对我应该如何构建一个算法来正确解决问题有任何提示?

【问题讨论】:

  • 您不能为此使用shunting yard algorithm 吗?它应该注意括号和逻辑运算符的不同优先级。
  • @MOehm 我现在就去看看,谢谢你的链接。我很快就会在这里发表评论。
  • 你可以构造一棵二叉树
  • 也可以实现recursive descent parser
  • 到目前为止,Shunting Yard 算法似乎是可行的方法。递归下降解析器看起来很有趣,但可能比我需要的更复杂。二叉树也是表示我发现的数据的一种非常好的方法。我将首先尝试实现 Shutting Yard 算法,看看我能取得什么进展。谢谢大家的建议!

标签: c++ algorithm fileparsing


【解决方案1】:

您需要构建一个表达式树,其中您的变量是叶子。

你的表达将变成:

        =>
       / \
      /   \
     /     \
    =>      &
   / \     / \
  &   X   |   Z
 / \     / \
p   z   P   D

一旦你建立了这种表示,评估就很简单了。

另一种具有相同结果的方法是将表达式简化为 RPN(您可以在其中使用堆栈想法):

P, Z, &, X, =>, P, D, |, Z, &, =>

按照 cmets 中的建议,您可以使用调车场算法来做到这一点。

【讨论】:

  • 谢谢你,我花了好几个小时来处理这个特殊问题,但这非常有帮助。我确实最终使用了 RPN 方法,这似乎很好地完成了这个技巧。我认为应该注意的一件事是,关于逻辑运算符没有操作顺序,所以它本质上是先到先得(除非涉及括号)。
猜你喜欢
  • 2022-08-15
  • 2010-09-22
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多