Detecting infinite loop in brainfuck program

前端 未结 9 1514
无人及你
无人及你 2021-02-04 00:18

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,

相关标签:
9条回答
  • 2021-02-04 01:10

    Alan Turing would like to have a word with you.

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

    0 讨论(0)
  • 2021-02-04 01:10

    Let's say you did write a program that could detect whether this program would run in an infinite loop. Let's say for the sake of simplicity that this program was written in brainfuck to analyze brainfuck programs (though this is not a precondition of the following proof, because any language can emulate brainfuck and brainfuck can emulate any language).

    Now let's say you extend the checker program to make a new program. This new program exits immediately when its input loops indefinitely, and loops forever when its input exits at some point.

    If you input this new program into itself, what will the results be?

    If this program loops forever when run, then by its own definition it should exit immediately when run with itself as input. And vice versa. The checker program cannot possibly exist, because its very existence implies a contradiction.

    As has been mentioned before, you are essentially restating the famous halting problem: http://en.wikipedia.org/wiki/Halting_problem

    Ed. I want to make clear that the above disproof is not my own, but is essentially the famous disproof Alan Turing gave back in 1936.

    0 讨论(0)
  • 2021-02-04 01:11

    State in bf is a single array of chars.

    If I were you, I'd take a hash of the bf interpreter state on every "]" (or once in rand(1, 100) "]"s*) and assert that the set of hashes is unique.

    The second (or more) time I see a certain hash, I save the whole state aside.

    The third (or more) time I see a certain hash, I compare the whole state to the saved one(s) and if there's a match, I quit.

    On every input command ('.', IIRC) I reset my saved states and list of hashes.

    An optimization is to only hash the part of state that was touched.

    I haven't solved the halting problem - I'm detecting infinite loops while running the program.

    *The rand is to make the check independent of loop period

    0 讨论(0)
提交回复
热议问题