如何绘制自动机图?

时间:2017-01-27 18:52:47

标签: ocaml graphviz diagram dot finite-automata

我根据许多人给我的建议使用graphviz,但我遇到了问题。我想使用ocamlFormat.module中写一个点,我有一个包含五个字段的记录,这些字段定义了一个自动机,包括由int*char*int列表和最终状态表示的转换。由int列表表示。第一个字段是初始状态,即一个int。我还定义了一个函数成员,它接受一个参数并测试它是否是给定列表的成员。我怎么能这样做,我可以写一个完整的点来识别初始状态并用节点[shape = point]start ; start -> x表示它,其他过渡用圆圈表示,最后的状态用双圈表示?我尝试过这样做,但是遇到问题当我编译它时,它说

  

文件“automatagraphicstest1.ml”,第44行,字符22-37:错误:   这个表达式有类型            自动化 - > Format.formatter - > int * char * int - >单元          但是表达式的格式是Format.formatter - > 'a - >单元          类型automate与Format.formatter类型

不兼容

1 个答案:

答案 0 :(得分:0)

要修复类型错误,只需将fmt_transitions函数替换为:

let fmt_transitions fmt auto =
  Format.fprintf fmt "@[<v 2>digraph output {@,%a@,@]}@,@."
    (Format.pp_print_list (fmt_transition1 auto)) auto.transitions

您的问题是pp_print_list需要Format.formatter -> 'a -> unit类型的内容。你的函数fmt_automaton1将自动机作为额外的第一个参数,所以我们需要先部分应用它,然后我们才能提供转换列表。