这是一个普遍的问题,不是一种语言特有的。基本上:如何将1-deep代码路径列表(即if条件列表)转换为互斥if条件列表?即是否有一系列算法可以做到这一点?我觉得这是编译器中的常见问题。
让我们约束问题。我们有一个非常简单的语言。
例:
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 }
如果这个问题得到解决,那么支持<,>,&,|会更具挑战性。
我做了一些研究。所以有两个步骤:
如sepp2k已经说过的,可以使用SAT求解器来检测互斥性。不知道它们是如何在内部工作的,但是一位同事给出了使用格子作为值的抽象解释思想的暗示。
ad 2.在一种天真的方法中,对于两个非互斥的代码路径A和B,我们简单地用条件A和B,A和~B以及~A和B替换它们。