1
第44行它给了我一个类型的错误键入自动不兼容formatter
型IM试图绘制使用graphviz
这里的自动机的代码:如何纠正函数式编程中的这个错误?
(*d'abord definissons le type automate*)
type automate = {
etat_initial : int;
ensemble_des_etats : int list;
alphabets : char list;
transitions :(int*char*int) list;
etats_finaux : int list
};;
(*prenons une variable a1 du type automate qu'on a definit precedemment
comme
exemple*)
let a1={
etat_initial=1;
ensemble_des_etats=[1;2];
alphabets=['a';'b'];
transitions=[(1,'b',2);(2,'c',3)];
etats_finaux=[2]
};;
let rec member a l =
match l with
| [] -> false
| x::rl -> x=a || member a rl;;
let fmt_transition auto fmt (inedge,by,outedge)=
if member outedge auto.etats_finaux=true then
Format.fprintf fmt "@[node [shape = doublecircle]%d;@]" outedge;
if inedge=auto.etat_initial then
Format.fprintf fmt "@[node [shape = point]start;node [shape = circle];start
-> %d ;@]" inedge;
Format.fprintf fmt "@[%d -> %d [label=\"%c\"];@]" inedge outedge by;;
let fmt_transitions auto fmt =
Format.fprintf fmt "@[<v 2>digraph output {@,%[email protected],@]}@,@."
(Format.pp_print_list (fmt_transition auto)) auto.transitions
;;
let call_dot auto =
let cmd = "dot -Tpng | display -" in
let (sout, sin, serr) as channels =
Unix.open_process_full cmd (Unix.environment()) in
let fmt = Format.formatter_of_out_channel sin in
<b>Format.fprintf fmt "%[email protected]" fmt_transitions auto;</b>
channels
let cleanup channels =
(* missing: flush channels, empty buffers *)
Unix.close_process_full channels;;
call_dot a1 ;;
也涉及到了问题[我怎么能代表图形的自动机从较不使用循环过渡INT *字符*为int的列表(http://stackoverflow.com/questions/41780982/how- can-i-represent-an-automaton-graphics-from-a-list-of-intcharint-represe)和[如何绘制自动机图?](http://stackoverflow.com/questions/41901071/how-to -draw-AN-自动机-图)。 –