Я написал простой интерпретатор brainfuck в языке скриптов MATLAB. Он управляется случайными программами bf для выполнения (как часть проекта генетического алгоритма). Проблема, с которой я сталкиваюсь, заключается в том, что программа оказывается бесконечной петлей в большом числе случаев, и, следовательно, GA застревает в точке.
Итак, мне нужен механизм для обнаружения бесконечных циклов и избежать выполнения этого кода в bf.
Очевидный (тривиальный) случай, когда у меня естьОбнаружение бесконечного цикла в программе brainfuck
[]
я могу обнаружить это и отказаться от выполнения этой программы.
Для нетривиальных случаев я понял, что основная идея: определить, как одна итерация цикла меняет текущую ячейку. Если изменение отрицательное, мы в конечном итоге достигнем 0, поэтому это конечная петля. В противном случае, если изменение неотрицательно, это бесконечный цикл.
Реализация это легко для случая одного цикла, но с вложенными циклами он становится очень сложным. Так, например, (в дальнейшем (1) относится к содержимому ячейки 1 и т.д.)
++++ Put 4 in 1st cell (1)
>+++ Put 3 in (2)
<[ While((1) is non zero)
-- Decrease (1) by 2
>[ While((2) is non zero)
- Decrement (2)
<+ Increment (1)
>]
(2) would be 0 at this point
+++ Increase (2) by 3 making (2) = 3
<] (1) was decreased by 2 and then increased by 3, so net effect is increment
и, следовательно, код работает и на. Однако наивная проверка количества + и s'-файлов, сделанных на ячейке 1, скажет, что число -'s больше, поэтому не будет обнаруживать бесконечный цикл.
Может ли кто-нибудь подумать о хорошем алгоритме обнаружения бесконечных циклов, учитывая произвольное вложение произвольного числа циклов в bf?
EDIT: Я знаю, что проблема с остановкой в общем случае неразрешима, но я не был уверен, не было ли особых случаев исключения. Как, может быть, Matlab может функционировать как машина Super Turing, способная определить остановку программы bf. Я мог бы быть ужасно ошибаюсь, но если так, я хотел бы точно знать, как и почему.
ВТОРОЙ РЕДАКТОР: Я написал то, что я называю бесконечным детектором цикла. Вероятно, он пропускает некоторые крайние случаи (или, что менее вероятно, каким-то образом избегает лап мистера Тьюринга), но, похоже, работает для меня на данный момент. В псевдокоде формы, здесь идет:
subroutine bfexec(bfprogram)
begin
Looping through the bfprogram,
If(current character is '[')
Find the corresponding ']'
Store the code between the two brackets in, say, 'subprog'
Save the value of the current cell in oldval
Call bfexec recursively with subprog
Save the value of the current cell in newval
If(newval >= oldval)
Raise an 'infinite loop' error and exit
EndIf
/* Do other character's processings */
EndIf
EndLoop
end
Matlab не может быть супертурным, потому что он работает в машине для тренировки (ваш компьютер). Поскольку состояние ограничено, подход снимка, подробно описанный Aur Saraf, должен работать, и, хотя в худшем случае довольно плохо, многие бесконечные петли в BF должны быть обнаружены быстро. – 2008-12-17 10:58:39
`[]` только бесконечно циклически, если значение под указателем не `0`. Да, это было бы бесполезно, если бы использовалось в точке, где значение указателя может быть только `0` (как в начале программы), но это не обязательно ошибка. – Skilldrick 2010-05-16 21:14:59
Что такое Super Turing Machine в любом случае ... Возможно, вы ссылаетесь на «Stannett, M. 1990. X-Machines и проблема с остановкой: построение машины Super-Turing. Формальные аспекты вычислений, 2, 331-341.`? – 2011-04-06 17:08:44