Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting infinite loop in brainfuck program

Tags:

I have written a simple brainfuck interpreter in MATLAB script language. It is fed random bf programs to execute (as part of a genetic algorithm project). The problem I face is, the program turns out to have an infinite loop in a sizeable number of cases, and hence the GA gets stuck at the point.
So, I need a mechanism to detect infinite loops and avoid executing that code in bf.
One obvious (trivial) case is when I have

[] 

I can detect this and refuse to run that program.
For the non-trivial cases, I figured out that the basic idea is: to determine how one iteration of the loop changes the current cell. If the change is negative, we're eventually going to reach 0, so it's a finite loop. Otherwise, if the change is non-negative, it's an infinite loop.
Implementing this is easy for the case of a single loop, but with nested loops it becomes very complicated. For example, (in what follows (1) refers to contents of cell 1, etc. )

++++ 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 

and hence the code runs on and on. A naive check of the number of +'s and -'s done on cell 1, however, would say the number of -'s is more, so would not detect the infinite loop.
Can anyone think of a good algorithm to detect infinite loops, given arbitrary nesting of arbitrary number of loops in bf?

EDIT: I do know that the halting problem is unsolvable in general, but I was not sure whether there did not exist special case exceptions. Like, maybe Matlab might function as a Super Turing machine able to determine the halting of the bf program. I might be horribly wrong, but if so, I would like to know exactly how and why.

SECOND EDIT: I have written what I purport to be infinite loop detector. It probably misses some edge cases (or less probably, somehow escapes Mr. Turing's clutches), but seems to work for me as of now. In pseudocode form, here it goes:

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 
like image 624
Sundar R Avatar asked Dec 15 '08 05:12

Sundar R


People also ask

How are infinite loops detected?

To detect infinite loops, Business Automation Workflow monitors the number of executed JavaScript instructions in each script activity. It sets an instruction threshold and a timeout to check the duration of the script activity.

Can a computer detect an infinite loop?

Equivalently, no computer program can infallibly tell if another computer program will get stuck in an infinite loop. In other words, no computer program can infallibly tell if another program is completely free of bugs.

How do you check for infinite loops in Python?

If the Python program outputs data, but you never see that output, that's a good indicator you have an infinite loop. You can test all your functions in the repl, and the function that does "not come back" [to the command prompt] is a likely suspect.

What is infinite loop in programming?

An infinite loop (sometimes called an endless loop ) is a piece of coding that lacks a functional exit so that it repeats indefinitely. In computer programming, a loop is a sequence of instruction s that is continually repeated until a certain condition is reached.


1 Answers

Alan Turing would like to have a word with you.

http://en.wikipedia.org/wiki/Halting_problem

like image 99
dancavallaro Avatar answered Oct 21 '22 03:10

dancavallaro