编译细节和可达性算法F#

时间:2011-06-15 07:57:43

标签: f# graph boolean-logic reachability

我是否应该对图形的某些部分(称为规则)的可达性进行分析:如果验证了某个布尔条件,则可以到达节点。每个节点仅知道其前任,有不同类型的节点,并且并非所有节点都具有要保护的条件以进行验证。该规则放在一个文件中。

我对规则进行了解析,我选择了(通过使用有区别的联合)并按照执行流程对节点进行了排序。现在,我应该进行一种静态分析,告知用户,对于指定的条件,某些节点是不可达的。图表有多个入口点,但只有一个出口点。

教授告诉我在F#中翻译布尔条件并通过编译检查它。但我注意到,即使我编写了以下代码,F#编译器也没有给出警告:

let tryCondition cond =
if cond then
    if not cond then "Not reachable"
    else "Reachable"
else "bye"

let tryConditionTwo num =
match num with
| x as t when x > 0 -> match t with
                       | y when y < 0 -> "Not reachable"
                       | _ -> "Reachable"
| _ -> "bye"

有没有更好的解决方案,而且在F#中实现的解决方案不是太复杂?或者编译器中是否有一个选项可以让我获取有关无法访问的代码的信息?

编辑:这是我必须检查各个分支的可达性的图表示例。 “IN”块用于从数据库加载列,而“Select”块用于选择全部且仅选择满足给定条件的行。我应该静态地检查这些条件是否相互矛盾。

An example of rule graph

1 个答案:

答案 0 :(得分:3)

没有简单的方法来解决问题。如果你能够编写一个始终有效的静态分析工具,你也可以解决Halting problem而且(可证)不可能。

我认为F#编译器目前不进行任何复杂的可达性分析。如果你想只针对布尔条件和整数(如你的例子中)实现这个检查,那么你可以解析F#表达式,将其转换为某个逻辑公式,然后使用SMT solver检查是否有任何值条件将保持不变。

  • 要解析源代码,您可以使用open-source F#版本,也可以使用F#引用(如果您只想在明确标记的表达式上运行工具)。使用后者更容易入手。

  • 有关SMT求解器的更多信息,可以查看Microsoft Research的{​​{3}}。您也可以自己实现此类工具的简单版本 - 对于布尔条件(无数字),您可以查看Z3 project