2017-01-27 3 views
0

Я использовал graphviz на основе рекомендации, данной мне многими людьми, но у меня возникла проблема. Я хочу написать точку в ocaml, используя Format.module, и у меня есть запись с пятью полями, которые определяют автомат, включая переходы, которые представлены списком int*char*int и конечными состояниями, которые представлены списком int. Первое поле - это начальное состояние, которое равно int. Я также определил член функции, который принимает параметр и проверяет, является ли он членом данного списка. Как я могу сделать так, чтобы я мог написать полную точку, которая распознает начальное состояние и представляет его с узлом [shape = point]start ; start -> x, а остальные переходы с кругами и конечными состояниями с двойными кругами? Я попытался сделать это, но я столкнулся с проблемами Когда я компилирую его, он говориткак рисовать диаграмму автомата?

File "automatagraphicstest1.ml", line 44, characters 22-37: Error: This expression has type automate -> Format.formatter -> int * char * int -> unit but an expression was expected of type Format.formatter -> 'a -> unit Type automate is not compatible with type Format.formatter

+0

Пожалуйста, используйте пастообразный код для вашего кода. Снимок экрана вашего редактора непригоден. – Drup

+0

http://pastebin.com/QK5qxEhd –

+0

http://pastebin.com/5NSb7qFU это еще одна попытка того, что я хочу, если вы посмотрите на нее, вы можете понять, что я хочу здесь сделать –

ответ

0

Чтобы исправить ошибку типа, просто замените функцию fmt_transitions этим:

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

Ваш вопрос является то, что pp_print_list ожидает что-то типа Format.formatter -> 'a -> unit. Ваша функция fmt_automaton1 берет автомат как дополнительный первый аргумент, поэтому нам нужно сначала его частично применить, затем мы можем предоставить список переходов.

+0

Я получаю это, но мне нужно проверьте, является ли inteded значением int, которое мы имеем в записи в качестве начального состояния: etat_initial, тогда мы должны выполнить start [shape = point] start; start -> inedge; а также, если выход является конечным состоянием, если он принадлежит списку etats_finaux, тогда он должен быть узлом [shape = doublecircle] outedge; [shape = circle]; inedge-> outedge [label = 'by']; –

+0

и круг формы для всех регулярных переходов, но проблема в fmt –

+0

fmt_transitions * он принимает только список, и я не знаю, что использовать для выхода из строки –

Смежные вопросы