Вы можете использовать грамматики с определенным предложением (DCG) для реализации конечного преобразователя состояния.Хотя DCG не выполняют много композиционных операций на производственной стороне, они достаточно хороши в реализации распознавания.
Итак, вы хотите распознать два разных типа прогонов 1.Таким образом, в основном я предполагаю, что строка ввода выглядит в расширенной форме Backus Naur (EBNF):
line :== exs run1 exs run2 exs | exs.
exs :== { "x" } "x".
run1 :== { "1" } "1".
run2 :== { "1" } "1".
Для задачи распознавания вы можете написать DCG без атрибутов (далее следует текст Prolog, вы можете поместитьв файле или напрямую обратитесь к нему через? - [пользователь]):
line --> exs, run1, exs, run2, exs | exs.
run1 --> "1", run1.
run1 --> "1".
run2 --> "1", run2.
run2 --> "1".
exs --> "x", exs.
exs --> "x".
Вот несколько примеров выполнения:
?- phrase(line,"xxx").
Yes
?- phrase(line,"xxx111xxx111xxx").
Yes
?- phrase(line,"xxx111xxx").
No
Для производственной задачи вы можете просто добавить атрибуты кDCG.Использовать список различий проще всего:
line(I,O) --> exs(I,H), run1(H,J), exs(J,K), run2(K,L), exs(L,O) | exs(I,O).
run1([0'1|I],O) --> "1", run1(I,O).
run1([0'1|H],H) --> "1".
run2([0'2|I],O) --> "1", run2(I,O).
run2([0'2|H],H) --> "1".
exs([0'x|I],O) --> "x", exs(I,O).
exs([0'x|H],H) --> "x".
Вот несколько примеров выполнения:
?- phrase(line(R,[]),"xxx").
R = [120, 120, 120]
?- phrase(line(R,[]),"xxx111xxx111xxx").
R = [120, 120, 120, 49, 49, 49, 120, 120, 120, 50, 50, 50, 120, 120, 120]
?- phrase(line(R,[]),"xxx111xxx").
No
Примечание: 0 '- это нотация Пролога для кода символа.В ascii мы имеем 0'x = 120, 0'1 = 49, 0'2 = 50, что объясняет результат.Вышеуказанное должно работать в большинстве систем Prolog, поскольку они поддерживают DCG.
Пока
Определенная грамматика предложения
http://en.wikipedia.org/wiki/Definite_clause_grammar
Преобразователь конечного состояния
http://en.wikipedia.org/wiki/Finite_state_transducer