Отказ от ответственности: Ваш вопрос очень общий, следовательно, и ответ такой. Обратите внимание, что я не эксперт по ТМ, а
этот подход обычно не будет очень эффективным (я даже не могу обещать, что он всегда будет эффективным).
Я просто записываю здесь некоторые мысли.
Я бы предложил попробовать такой подход: возьмите свой псевдокод и уменьшите его так, чтобы
он состоит только из а) логических переменных и б) if
-статементов.
Например:
if THIS_LETTER_IS("A"):
found_an_even_number_of_A = not found_an_even_number_of_A
if THIS_LETTER_IS("Q") and previous_letter_was_X and found_an_even_number_of_A
and not checking_for_alternative_2:
# can't be a word of alternative 1, so check for alternative 2
going_back_to_start_to_check_for_alternative_2 = True
if going_back_to_start_to_check_for_alternative_2:
MOVE_TO_PREVIOUS
else:
MOVE_TO_NEXT
if going_back_to_start_to_check_for_alternative_2 and THIS_LETTER_IS(EMPTY):
# reached the beginning, so let's check for alternative 2
going_back_to_start_to_check_for_alternative_2 = False
checking_for_alternative_2 = True
Если вы вложили if
s, замените их на and
s; удалить блоки else
с помощью not
:
if something:
if something_else:
do_a
else:
do_b
становится
if something and something_else:
do_a
if something and not something_else:
do_b
Каждый блок if
должен содержать только одну MOVE_TO_PREVIOUS
или MOVE_TO_NEXT
, возможно, команду WRITE
и любое число.
переменных назначений.
Заполните все if
предложения, чтобы каждый ваших логических значений И текущая буква всегда проверялись, дублируя
блоки, где необходимо. Пример: * +1028 *
if something and something_else:
do_a
становится
if THIS_LETTER_IS("A") and something and something_else and something_i_dont_care_about_here:
do_a
if THIS_LETTER_IS("A") and something and something_else and not something_i_dont_care_about_here:
do_a
if THIS_LETTER_IS("Q") and something and something_else and something_i_dont_care_about_here:
do_a
if THIS_LETTER_IS("Q") and something and something_else and not something_i_dont_care_about_here:
do_a
Теперь, если у вас есть n логических и m букв, у вас должно быть m * 2 n if
с.
Представьте, что вы сохранили логические значения в битовом поле, поэтому каждая возможная комбинация логических значений представляет собой
целое число. Следовательно, вышесказанное становится
if THIS_LETTER_IS("A") and bitfield[0] and bitfield[1] and bitfield[2]:
do_a
if THIS_LETTER_IS("A") and bitfield[0] and bitfield[1] and not bitfield[2]:
do_a
# ...
, который затем становится
if THIS_LETTER_IS("A") and bitfield == 7:
do_a
if THIS_LETTER_IS("A") and bitfield == 3:
do_a
# ...
Это целочисленное значение для битового поля является состоянием машины Тьюринга. Часть do_a
- это просто присвоение логическим значениям (т. Е. Битовое поле, так что это ваше новое состояние), команда записи (если ее нет, просто напишите письмо, которое уже было
там) и команда перемещения, отсюда явный переход машины Тьюринга.
Надеюсь, все вышеперечисленное имеет смысл.