Я создал функцию, которая возвращает список переходов. Переходы имеют тип 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» распознаваться списком переходов с учетом начального состояния или нет. У меня проблемы с написанием этой функции ... Мне нужна функция, которая, учитывая список переходов и строку, возвращает «истина» в случае распознавания или ложь в отрицательном случае.