I am trying to solve the following Turing machine challenge:
Design a Turing machine that accepts the language L, where L is Xan, with n = 0 + 1 + 2 + 3 +....+ M
Examples:
Xa: accepted because M is 1, and 0+1 is 1.Xaaa: accepted because M is 2, and 0+1+2 is 3.Xaaaaa: rejected, because there is no M for which the sum is 5.I tried to take this approach:
turn one a to Y (I picked Y, nothing special about it).
turn two a into Y's, but this is where I get stuck: How can I find out how many a's will be converted into Y's?
You could use an algorithm where before the "X" you store a number of "a" which have to be paired with the same number of "a" after the "X". During successful pairing, the left-side "a" are removed and at the right of the "X" and the matched "a", a new "X" is placed, while the old "X" becomes an "a" as well, so that now these matched "a" are at the left of the "X" and the process can repeat.
We can achieve that by using "X" to temporarily mark those "a" that have been paired. Here is a more detailed algorithm description:
If after the (last) "X" there is a blank: accept
While before the (first) "X" there is an "a":
Otherwise (there is a blank before the first "X"):
Repeat from the top
Here is a transition table for the above algorithm ("_" represents a blank):
| state | read | write | move head | next state |
|---|---|---|---|---|
| start | X | right | check | |
| check | _ | left | accept | |
| check | a | left | toLeft | |
| toLeft | a or X | left | toLeft | |
| toLeft | _ | right | wipeLeft | |
| wipeLeft | a | _ | right | wipeRight |
| wipeLeft | X | a | right | replaceX |
| replaceX | X | a | right | replaceX |
| replaceX | a | X | right | check |
| replaceX | _ | left | reject | |
| wipeRight | a | right | wipeRight | |
| wipeRight | X | right | wipeRight2 | |
| wipeRight2 | X | right | wipeRight2 | |
| wipeRight2 | a | X | left | toLeft |
| wipeRight2 | _ | left | reject |
And finally a snippet that runs this transition table on your input:
createTuring({
transitions: [
{ state: "start", read: "X", move: "R", nextState: "check" },
{ state: "check", read: "_", move: "L", nextState: "accept" },
{ state: "check", read: "a", move: "L", nextState: "toLeft" },
{ state: "toLeft", read: "aX", move: "L", nextState: "toLeft" },
{ state: "toLeft", read: "_", move: "R", nextState: "wipeLeft" },
{ state: "wipeLeft", read: "a", write: "_", move: "R", nextState: "wipeRight" },
{ state: "wipeLeft", read: "X", write: "a", move: "R", nextState: "replaceX" },
{ state: "replaceX", read: "X", write: "a", move: "R", nextState: "replaceX" },
{ state: "replaceX", read: "a", write: "X", move: "R", nextState: "check" },
{ state: "replaceX", read: "_", move: "L", nextState: "reject" },
{ state: "wipeRight", read: "a", move: "R", nextState: "wipeRight" },
{ state: "wipeRight", read: "X", move: "R", nextState: "wipeRight2" },
{ state: "wipeRight2", read: "X", move: "R", nextState: "wipeRight2" },
{ state: "wipeRight2", read: "a", write: "X", move: "L", nextState: "toLeft" },
{ state: "wipeRight2", read: "_", move: "L", nextState: "reject" },
],
initState: "start",
tape: "Xa",
});
<script src="https://trincot.github.io/turing.js"></script>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With