F# 编译细节和可达性算法
我是否应该对一个名为rule的图的部分的可达性进行分析:如果验证了某个布尔条件,就可以到达一个节点。每个节点只知道其前身,存在不同类型的节点,并且并非所有节点都有待验证的条件。规则被放置在一个文件中 我做了在规则的解析中,我通过使用甄别并集进行选择,并根据执行流程对节点进行排序。现在,我应该进行一种静态分析,告知用户,在特定条件下,某些节点是不可访问的。图形有多个入口点,但只有一个出口点 教授让我翻译F中的布尔条件,并通过编译进行检查。但我注意到,即使我编写了以下代码,F编译器也没有给我警告:F# 编译细节和可达性算法,f#,graph,boolean-logic,reachability,F#,Graph,Boolean Logic,Reachability,我是否应该对一个名为rule的图的部分的可达性进行分析:如果验证了某个布尔条件,就可以到达一个节点。每个节点只知道其前身,存在不同类型的节点,并且并非所有节点都有待验证的条件。规则被放置在一个文件中 我做了在规则的解析中,我通过使用甄别并集进行选择,并根据执行流程对节点进行排序。现在,我应该进行一种静态分析,告知用户,在特定条件下,某些节点是不可访问的。图形有多个入口点,但只有一个出口点 教授让我翻译F中的布尔条件,并通过编译进行检查。但我注意到,即使我编写了以下代码,F编译器也没有给我警告:
let tryCondition cond =
if cond then
if not cond then "Not reachable"
else "Reachable"
else "bye"
或
有没有更好的解决方案,而且不太复杂,可以在F中实现来解决这个问题?或者编译器中是否有一个选项允许我获取有关无法访问的代码的信息
这是一个图的例子,我必须检查各个分支的可达性。IN块用于从数据库加载列,而Select块用于选择所有且仅选择满足给定条件的行。我应该静态地检查这些条件是否相互矛盾。解决这个问题没有简单的方法。如果您能够编写一个始终有效的静态分析工具,那么您还可以解决问题,这是不可能的 我认为F编译器目前没有进行任何复杂的可达性分析。如果您想像示例中那样仅对布尔条件和整数实现此检查,那么您可以解析F表达式,将其转换为一些逻辑公式,然后使用检查是否存在条件所适用的值 要解析源代码,可以使用发行版,如果只想在显式标记的表达式上运行工具,也可以使用F引号。使用后者更容易启动 有关SMT解算器的更多信息,请查看Microsoft Research提供的。您也可以自己实现这类工具的一个简单版本——对于布尔条件,您无法查看任何数字
解决这个问题没有简单的办法。如果您能够编写一个始终有效的静态分析工具,那么您还可以解决问题,这是不可能的 我认为F编译器目前没有进行任何复杂的可达性分析。如果您想像示例中那样仅对布尔条件和整数实现此检查,那么您可以解析F表达式,将其转换为一些逻辑公式,然后使用检查是否存在条件所适用的值 要解析源代码,可以使用发行版,如果只想在显式标记的表达式上运行工具,也可以使用F引号。使用后者更容易启动 有关SMT解算器的更多信息,请查看Microsoft Research提供的。您也可以自己实现这类工具的一个简单版本——对于布尔条件,您无法查看任何数字
谢谢你的回复。现在我来记录,你就会知道这是否是我需要的。我添加了一些注释和图片,希望能起到说明作用。谢谢您的回复。现在我来记录,你就会知道这是否是我需要的。我添加了一些注释和图片,希望能起到说明作用。
let tryConditionTwo num =
match num with
| x as t when x > 0 -> match t with
| y when y < 0 -> "Not reachable"
| _ -> "Reachable"
| _ -> "bye"