我这里有这个代码:
type ('state,'letter) automaton = {
initial : 'state ;
final : 'state -> bool ;
transition : 'letter -> 'state -> 'state ;
}
let example_graph =
{
nodes = ['a'; 'c'; 'd'; 'f'; 'g'; 'h'; 'k'];
edges = ['h', 'g'; 'k', 'f'; 'f', 'b'; 'f', 'c'; 'c', 'b']
}
这是OCaml网站提供的关于graths的默认示例。
我的问题是,如何使用OCaml
中的图表?我的意思是Lists
我们有一个大的功能页面,可以帮助我们使用它,但我还没有找到任何有关图形的预定义函数。
我有一个复杂的工作与图形有关,更确切地说,我需要用automaton
建立OCaml
,但首先我想了解如何做简单的思考,如从图中获取nodes
,如何转换节点和边输入值,或者如何使用此处的图形进行测试,例如我如何在节点之间移动...(以及你可以记住的每一个简单的动作,或者我可以获得更多信息的任何地方都会有帮助)
基本上我想知道网上是否有任何地方我可以获得有关OCaml或函数中图形的更好信息,如果你们可以帮我一个忙!
谢谢
PS:我已经完成了我的搜索,发现没有什么真正有用的(仅适用于像我这样的初学者的复杂代码)
答案 0 :(得分:1)
嗯,我认为ocamlgraph对于一个新的OCaml程序员来说有点复杂(但后来使用它会是一个好主意)。
据我所知,您希望以可理解的方式处理节点和边缘。
首先,我会向您提供测试Map module(使用它的tutorial)的建议,因为这是一种快速而简单的方法(我使用此实现Glushkov's construction模块,它的效果非常好。)
为您提供一个小小的见解:
type ('state,'letter) automaton = {
initial : 'state ;
final : 'state -> bool ;
transition : 'letter -> 'state -> 'state ;
}
这就是你到现在为止看到自动机的方式。
type ('state,'letter) automaton = {
initial : 'state ;
final : 'state -> bool ;
transition : ('letter, 'state) list Map.Make('state);
}
这就是我看到它的方式(这不是一个正确的实现,因为'state
不是一个明显的有序类型,但这个想法就在这里)。您可以将任何州映射到列表(如果您了解如何创建新映射,则可以使用Set而不是列表)。
尝试自己实现它,它可以非常有用,你可以学到很多东西。
答案 1 :(得分:1)
由于OCamlgraph库,OCaml对图表提供了出色的支持。它有很好的文档记录,非常强大,但它依赖于仿函数很多,而且它们通常会混淆OCaml新手。所以你也可以考虑尝试我们为程序分析而开始的另一个graph library。它不会发布到官方的opam存储库,但您始终可以从我们自己的存储库中获取最新的alpha版本:
opam repository add git://github.com/BinaryAnalysisPlatform/opam-repository.git
opam install graphlib
P.S。 Graphlib不是OCamlgraph的替代品,它可以很好地使用它。它只是有点不同的焦点。当graphlib时,OCamlGraph更专注于可用于任何图形表示的通用算法 更侧重于图形数据结构。所以它更容易使用,但更难扩展。