Вы можете использовать Грамматики с определенными параметрами (DCG) для реализации преобразователя конечного состояния. Хотя DCG не выполняют много композиционных операций на стороне производства, они неплохо реализуют сторону распознавания.
Итак, вы хотите распознать два разных типа пробегов 1. Поэтому в основном я предполагаю, что входная строка выглядит следующим образом в Extended Backus Наура (EBNF):
line :== exs run1 exs run2 exs | exs.
exs :== { "x" } "x".
run1 :== { "1" } "1".
run2 :== { "1" } "1".
Для решения задачи распознавания вы можете написать DCG без атрибутов (что далее следует текст Пролог, вы можете поместить в файл или непосредственно обращаться к нему с помощью - [пользователя]):
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
для производственной задачи вы можете просто добавить атрибуты к ВС. Использование списка разностных работ простой:
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.
Bye
Определенная Раздел Грамматика
http://en.wikipedia.org/wiki/Definite_clause_grammar
конечных состояний датчика
http://en.wikipedia.org/wiki/Finite_state_transducer
Непонятно, как эти таблицы представлены; не могли бы вы привести пример? Далее, как вы определяете, какое «пятно» первое, а второе? И как вы определяете «пятно»? –
Эти таблицы представляют собой списки, в которых их элементы являются списками. Пятнами являются элементы, которые являются соседями и имеют значение 1.Я хочу разделить эти два пятна, поворачивая элементы одного пятна только от 1 до 2 – user1118501
Нет, нет findall, извините. –