이 과제의 목표는 가능한 모든 정지 프로그램을 원하는 언어 로 (결과적으로) 출력 하는 것입니다. 처음에는 이것이 불가능한 것처럼 들릴 수 있지만 실행 순서를 매우 신중하게 선택하여이를 달성 할 수 있습니다.
아래는이를 설명하기위한 ASCII 다이어그램입니다. 열은 가능한 모든 프로그램의 번호를 나타냅니다 (각 프로그램은 유한 알파벳의 한정된 수의 기호입니다). 각 행이 해당 프로그램 실행의 단일 단계를 나타내도록하십시오. 은 X
시간 단계에서 해당 프로그램에 의해 수행되는 실행을 나타낸다.
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
알 수 있듯이 프로그램 2와 4는 중단되지 않습니다. 한 번에 하나씩 실행하면 컨트롤러가 프로그램 2 인 무한 루프에 갇히고 프로그램 3 이상을 출력하지 않습니다.
대신 더브 테일 방식 을 사용합니다 . 문자는 처음 26 단계의 가능한 실행 순서를 나타냅니다. *
의 해당 프로그램은 중단하고 출력 장소입니다. .
들 아직 실행되지 않은 단계입니다.
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
대상 언어에 대한 요구 사항
대상 언어 (병렬 해석)는 Turing-complete 여야합니다. 그 외에는 훨씬 큰 언어의 Turing-complete 하위 세트를 포함하여 Turing-complete 인 모든 언어가 될 수 있습니다 . 순환 태그 시스템 규칙과 같은 것을 자유롭게 해석 할 수도 있습니다. 튜링이 완료된 이유를 보여줄 수있는 한 테스트 할 언어를 만들 수도 있습니다.
예를 들어, brainfuck을 테스트하기로 선택한 경우 []-+<>
입력이 지원되지 않고 출력이 버려지기 때문에 서브 세트 만 테스트하는 것이 가장 좋습니다 (아래 참조).
"컨트롤러"프로그램 (골프하는 프로그램)에 대해서는 특별한 요구 사항이 없습니다. 일반적인 언어 제한이 적용됩니다.
무한한 프로그램 목록을 만드는 방법
대부분의 프로그래밍 언어는 유한 알파벳의 일련의 기호로 표시 될 수 있습니다. 이 경우 길이를 늘리는 순서대로 가능한 모든 프로그램 목록을 열거하는 것이 상대적으로 쉽습니다. 사용하는 알파벳 은 대상 언어 의 요구 사항 을 나타내야 합니다. 대부분의 경우 이것은 인쇄 가능한 ASCII입니다. 언어가 추가 기능으로 유니 코드를 지원하는 경우 ASCII 만 가능한 모든 유니 코드 문자 조합을 테스트하지 않아야합니다. 사용하는 언어 만 사용하는 경우 []-+<>
"주석"ASCII 문자의 다양한 조합을 테스트하지 마십시오. APL과 같은 언어에는 자체 특수 알파벳이 있습니다.
언어가 Fractran 또는 Turing Machines와 같이 알파벳이 아닌 방식으로 가장 잘 설명되어 있으면 가능한 모든 유효한 프로그램 목록을 생성하는 다른 동일한 방법이 있습니다.
점점 늘어나는 프로그램 목록 해석
이 과제의 핵심 부분은 점점 늘어나는 프로그램 목록에 대해 병렬 인터프리터를 작성하는 것입니다. 이를위한 몇 가지 기본 단계가 있습니다.
- 한정된 수의 프로그램을 목록에 추가
- 한정된 기간 동안 목록의 각 프로그램을 개별적으로 해석하십시오. 이는 각각에 대해 하나의 명령 단계를 수행하여 수행 할 수 있습니다. 모든 상태를 저장하십시오.
- 목록에서 종료 / 오류 발생 프로그램을 모두 제거하십시오.
- 깨끗하게 정지 된 * 프로그램 출력
- 더 많은 프로그램을 목록에 추가
- 각 프로그램을 차례로 시뮬레이션하여 중단 된 이전 프로그램의 실행을 선택합니다.
- 목록에서 종료 / 오류 발생 프로그램을 모두 제거하십시오.
- 깨끗하게 정지 된 * 프로그램 출력
- 반복
* 정지 된 프로그램 만 출력하십시오. 이는 실행 중에 구문 오류나 포착되지 않은 예외가 발생하지 않았 음을 의미합니다. 입력을 요구하는 프로그램도 출력하지 않고 종료해야합니다. 프로그램이 출력을 생성하면 종료하지 말고 출력을 버려야합니다.
더 많은 규칙
- 테스트 된 프로그램을 포함하기 위해 새 스레드를 생성해서는 안됩니다. 이렇게하면 병렬 작업이 호스트 OS / 기타 소프트웨어로 오프로드됩니다.
- 편집 : 미래의 허점을 막기
eval
위해 테스트 된 프로그램 코드의 일부를 허용하지 않습니다 . 인터프리터 코드에서 코드 블록 할 수 있습니다eval
. (BF-in-Python 답변은이 규칙에 따라 여전히 유효합니다.) - 이것은 코드 골프입니다
- 제출 한 언어는 테스트 / 출력하는 언어와 같을 필요 는 없습니다 .
- 사용 가능한 메모리가 무한하다고 가정해야합니다.
- Turing-completeness를 증명할 때 입력이 프로그램에 하드 코딩되고 프로그램의 내부 상태에서 출력을 읽을 수 있다고 가정 할 수 있습니다.
- 프로그램이 자체적으로 출력되면 잘못되었거나 폴리 글 롯일 수 있습니다.
"If your program outputs itself, it is probably wrong or a polyglot."