创建一个互斥的代码路径列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个互斥的代码路径列表相关的知识,希望对你有一定的参考价值。

这是一个普遍的问题,不是一种语言特有的。基本上:如何将1-deep代码路径列表(即if条件列表)转换为互斥if条件列表?即是否有一系列算法可以做到这一点?我觉得这是编译器中的常见问题。

让我们约束问题。我们有一个非常简单的语言。

  • 整数变量
  • 带有两个二元运算符的if / else条件==和!=
  • 执行从上到下发生
  • 没有副作用:如果b = 1然后b = 2,我们可以删除第一个作业

例:

if a == 1 { b = 1 }
if a == 2 { b = 2 }
if a != 3 { b = 2 }
if a == 4 { b = 3 }

将被转换为例如:

if a == 4 { b = 3 }
else if a != 3 { b = 2 }

如果这个问题得到解决,那么支持<,>,&,|会更具挑战性。

答案

我做了一些研究。所以有两个步骤:

  1. 检测互斥性
  2. 使两个非互斥条件相互排斥

如sepp2k已经说过的,可以使用SAT求解器来检测互斥性。不知道它们是如何在内部工作的,但是一位同事给出了使用格子作为值的抽象解释思想的暗示。

ad 2.在一种天真的方法中,对于两个非互斥的代码路径A和B,我们简单地用条件A和B,A和~B以及~A和B替换它们。

以上是关于创建一个互斥的代码路径列表的主要内容,如果未能解决你的问题,请参考以下文章

如何创建片段以重复变量编号中的代码行

如何将 r ggplot 图存储为 html 代码片段

带有两个列表片段的可滚动布局

互斥锁 & 共享锁

如何从片段内的列表视图打开链接网址?

ReentrantReadWriteLock场景应用