필자는 명령형 프로그래밍 언어에서 언어 튜링을 완벽하게하기위한 제어 흐름 구조로 while-do 루프가 충분하다는 것을 알고 있습니다 (제어 흐름이 진행되는 한-물론 우리는 무제한 메모리와 특정 연산자가 필요합니다 ...) . 내 질문의 요지는 : do-while 루프가 while-do 루프와 동일한 계산 능력을 가지고 있습니까? 다시 말해, 명령어를 완전히 건너 뛸 수없는 경우 언어가 튜링 완료 상태가 될 수 있습니다.
여기서 의미의 일부가 모호 할 수 있다는 것을 알고 있으므로 실제 질문을 구체적인 예를 들어 설명하겠습니다.
Brainfuck (BF)은 유일한 제어 흐름이 while-do 루프 인 Turing tarpit [...]
입니다 (Brainfuck에 익숙하지 않은 경우 질문 하단에 완전한 언어 사양이 있음). 하자의 새로운 언어 BF의 * 정의 ,.+-<>
BF의 경우와 동일한 의미를 갖는다를하지만, 대신에 []
우리가 {}
할 - while 루프를 의미한다. 즉, BF와의 유일한 차이점은 추가 반복을 건너 뛸 수 있기 전에 모든 루프가 적어도 한 번 실행된다는 것입니다.
BF * 튜링이 완료 되었습니까? 그렇다면 BF를 BF *로 변환하는 방법에 관심이 있습니다. 그렇지 않은 경우 어떻게 증명합니까?
내 자신의 일부 관찰 :
- 모든 BF 프로그램을 BF *로 번역 할 수있는 것은 아닙니다. 예를 들어, 값을 읽거나 인쇄하지 않을 수있는 BF *로 프로그램을 작성하는 것은 불가능합니다. 프로그램이 하나 이상의 값을 인쇄 할 수있는 경우 항상 하나 이상의 값을 인쇄합니다. 그러나 BF *로 변환 될 수있는 BF의 Turing-complete 하위 집합이있을 수 있습니다.
- 우리는 간단하게 변환 할 수 없습니다
[f]
(여기서f
몇 가지 임의 만 구성된 브레인 퍽 프로그램+-[]<>
)에 A) 때문에, (첫 번째 반복의 효과를 취소하기위한 시도) 하지 모든 계산 가능한 함수는 계산 가능한 역이 그것을 한 경우에도와 B), 이 단계를 재귀 적으로 적용한다고해서 반드시 루프 수가 적을 필요 는 없습니다.f-1{f}
f-1
f
다음은 Brainfuck 언어에 대한 간략한 개요입니다. Brainfuck은 각 셀에 바이트 값이 포함 된 무한 테이프에서 작동하며 처음에는 0입니다. 오버플로가 줄 바꿈되므로 255를 증가 시키면 0이되고 그 반대도 마찬가지입니다. 이 언어는 8 가지 명령으로 구성됩니다.
+ Increment the current cell.
- Decrement the current cell.
> Move tape head to the right.
< Move tape head to the left.
, Input a character from STDIN into the current cell.
. Output the current cell as a character to STDOUT.
[ If the current cell is zero, jump past the matching ].
] If the current cell is non-zero, jump back to just behind the matching [.
[]
BF에서 "while"루프를 정확하게 정의하지는 않습니다. 표에서와 같이 왼쪽 및 오른쪽 대괄호는 현재 셀 0/0이 아닌 값을 평가합니다. 그렇다면 해당 {}
중괄호 평가 논리에 대한 정확한 설명은 무엇 입니까? Computer Science Chat 에서 추가 대화 / 토론을 제안하십시오 . 또한 귀하의 "관측"은 증거가없는 "가정"또는 "제안"과 유사합니다.
{}
것이라고 생각했다 . 다음 며칠 동안 시간이 많지 않지만 시간이 있으면 채팅에 참여할 것입니다. {
}
]
{}
및 데려가는 []
, BF * 튜링 완료된다. BF []
는 Turing 완전한 언어에서 while-do 루프와 유사하거나 유사한 구조 라는 것을 이해합니다 .