【问题标题】:how to draw an automaton diagram?如何绘制自动机图?
【发布时间】:2017-06-13 13:17:50
【问题描述】:

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

文件“automatagraphicstest1.ml”,第 44 行,字符 22-37:错误: 这个表达式有类型 自动化 -> Format.formatter -> int * char * int -> unit 但是需要一个 Format.formatter -> 'a -> unit 类型的表达式 自动类型与 Format.formatter 类型不兼容

【问题讨论】:

  • 请为您的代码使用 pastebin。您的编辑器的屏幕截图无法使用。
  • pastebin.com/5NSb7qFU 这是我想要的另一个尝试如果你看它你可能会明白我想在这里做什么

标签: ocaml graphviz diagram dot finite-automata


【解决方案1】:

要修复您的类型错误,只需将 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 -&gt; 'a -&gt; unit 类型的东西。您的函数fmt_automaton1 将自动机作为额外的第一个参数,因此我们需要先部分应用它,然后我们才能提供转换列表。

【讨论】:

  • 我明白了,但我需要测试一个 inedge 是否是我们在记录中作为初始状态的 int : etat_initial 然后我们必须执行 node [shape = point]start ;开始-> inedge;并且如果 outedge 是最终状态,如果它属于列表 etats_finaux 那么它应该是 node [shape = doublecircle]outedge;[shape = circle];inedge->outedge[label='by'];
  • 并为所有常规过渡形成圆形,但问题出在 fmt
  • fmt_transitions* 它只需要一个列表,我不知道用什么来转义字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2012-02-18
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多