Ocaml - Проверить, по списку переходов, распознается ли слово - PullRequest
0 голосов
/ 20 июня 2020

Я создал функцию, которая возвращает список переходов. Переходы имеют тип int * char * int. например (0 'E' 1); (1 'A' 2). Допустимый алфавит для переходов: A, C, G and T, а символ 'E' представляет эпсилон.

type transition = int * char * int;;
let get_start (a,_,_) = a;;
let get_char (_,a,_) = a;;
let get_end (_,_,a) = a;;

Начальное и конечное состояния сохраняются в следующих переменных.

...
let i_strt = ref !state_initial;;
let i_end = ref !state_end;;

exception Out_of_loop;;
let seq = read_line();;(* string to be tested *)
let len_seq = String.length seq -1;;
let lst_trs_length = List.length !aux_transitions -1;; (* aux_transitions -> all transitions*)
let i = ref 0;;
let f = ref 0;;

while !i <= len_seq  do
  let c_r = seq.[i]in (* c_r = 'A' seq = ACGT*)
  try
    while !j <= lst_trs_length do
      let aux_trs = List.nth !aux_transitions !j in (* 0 'E' 1 -> 1 'A' 2 ....*)
      if (get_start aux_trs) = !i_strt then (*  *)
        let aux_chr = get_char aux_trs in (* 'A' *)
        if aux_chr = c_r then(
          i_strt := get_end aux_trs; (* i_strt = 1*)
          raise Out_of_loop
        )
        else if aux_chr = 'E' then(
          i_strt := get_end aux_trs;
          j := -1
        );
      j := !j+1
    done;
  with Out_of_loop ->();    
  i := !i +1
done;

Я пытаюсь использовать эти два цикла, чтобы проверить, может ли строка «seq» распознаваться списком переходов с учетом начального состояния или нет. У меня проблемы с написанием этой функции ... Мне нужна функция, которая, учитывая список переходов и строку, возвращает «истина» в случае распознавания или ложь в отрицательном случае.

...