Я новичок в Ocaml и для домашнего задания я должен написать функцию filter_reachable
это берет грамматику и возвращает уменьшенную грамматику с удаленными недостижимыми правилами. Единственными модулями, которые мне разрешено использовать, являются модули Pervasives и List, и никаких других модулей.
Идея состоит в том, чтобы сначала составить список всех достижимых нетерминалов. Тогда правило достижимо, если его нетерминальная часть находится в списке всех достижимых нетерминалов. Все доступные правила затем помещаются в новый список и соединяются с начальным символом для создания уменьшенной грамматики.
Мое решение ниже. Однако это не работает, и я не понимаю, почему. Может кто-нибудь помочь мне это исправить?
let rec member x s=
match s with
[]->false
| y::ys-> (x = y) || member x ys
(*the type of a symbol*)
type ('nonterminal, 'terminal) symbol =
| N of 'nonterminal
| T of 'terminal
let rec get_nont sl=
match sl with
|[]->[]
|h::t->match h with
|N x-> x::get_nont t
|T y-> get_nont t
let rec get_rea_nont (n,r) =
n::(match r with
|[]->[]
|h::t->match h with
| a,b -> if a=n then (get_nont b)@(get_rea_nont (n,t))
else get_rea_nont(n,t)
| _-> [])
let rec fil (st,rl)=
let x = get_rea_nont(st,rl) in
(match rl with
|[]-> []
|h::t-> match h with
|a,b -> if (member a x) then h::fil(st,t)
else fil(st,t)
|_->[]
|_->[]
)
let rec filter(st,rl)=
(st,fil(st,rl))