Я пытаюсь написать программу в Haskell, которая возвращает список достижимых состояний, начиная с начального состояния, аналогично первому поиску глубины.Возвращение всех достижимых состояний в DFA, начиная с начального состояния
states_reachable :: Eq st => DFA st -> [st]
states_reachable (qs, sigma, delta, s, inF) =
[delta q a | q <- qs, a <- sigma]
Примечание:
- QS это множество состояний
- сигма является алфавита
- дельта является функцией перехода, которая принимает состояние и символ и возвращает следующее состояние
- с начальным состояние
- Inf это функция, которая возвращает истину, если состояние является принимающим состоянием, иначе ложь
В качестве функции определяется в настоящее время:
[delta q a | q <- qs, a <- sigma]
возвращается все состояния в DFA (что неверно).
Я хотел бы заполнить список, начав с начального состояния s и проверив функцию дельта с каждым входом.
Например:
// returns the states reachable from the initial state for all symbols in sigma
[delta s a | a <- sigma]
Следующим шагом будет повторить процедуру для каждого нового состояния добавляется в список. Это может добавить дубликаты, но я могу удалить их позже.
Тогда я попробовал:
[delta q a | q <- [delta s a | a <- sigma], a <- sigma]
Я думал, что это может работать, но это не потому, что это создает внутренний список, а затем использовать его для заполнения внешнего списка, а затем останавливается.
Мне нужно рекурсивно построить этот список, исследуя все новые состояния, возвращаемые функцией дельта.
Напоминает этой бумаги http://matt.might.net/papers/might2011derivatives.pdf, а также вы можете посмотреть на реализация TDFA для вдохновения, как реализовать в Haskell https://hackage.haskell.org/package/regex-tdfa –