Brainfuck Turing을 완성하기에 몇 쌍의 괄호로 충분합니까?


12

Brainfuck은 8 개의 기호 만 사용하는 Turing 완전한 프로그래밍 언어입니다 (I / O를 무시하는 경우 6).

튜링 완전성에 밀어 두 개의 가장 주목할만한 사람은 []본질적으로, 브레인 퍽의 라벨과 고토.

일반적으로 Brainfuck의 프로그램은 여러 세트를 사용 []하지만 Brainfuck Turing을 완성하기 위해 얼마나 많은 쌍의 괄호를 사용해야하는지 궁금합니다.

더 간단히 말해서, n- 상태 튜링 머신을 시뮬레이트해야하는 가장 적은 괄호는 무엇입니까 (1, 2 및 3 개의 상태 튜링 머신에 대한 괄호 수를 제공하십시오)?

노트:

우리는 무한 테이프를 가정하고 계산 한계가 없다고 가정합니다.

2 기호 튜링 기


1
"이 괄호 쌍은 몇 개를 사용해야합니까?" "사용해야 함"을 명확히 할 수 있습니까? 예를 들어, BrainF에 까지 세도록 요청하면 어떻게 21000000됩니까?
John L.

@ Apass.Jack 최소 괄호 수
MilkyWay90

1
아, 튜링 머신을 n 의 함수로 시뮬레이션하기위한 최소 브라켓 수를 의미 했습니까? 어쨌든, 가능한 간단한 간단한 예를 들어 줄 수 있습니까? nn
John L.

1
@ Apass.Jack 좋아, 나는 단일 상태 Turing Machine에서 작동하는 버그가있는 BF 프로그램을 제안 할 것이다
MilkyWay90

@ Apass.Jack Nevermind, 그것은 너무 어렵다. 기본적으로 프로그래밍 언어 인 Turing Machine But Way Worse에 대한 BF 인터프리터를 두 개의 가능한 기호 (0 및 1) 만 사용하고 I / O 및 정지 기능을 완전히 제거 할 때 BF 인터프리터를 작성 하십시오
MilkyWay90

답변:


9

이것은 @ ais523의 답변을 한 단계 더 발전 시켜 두 세트의 대괄호로 줄였으며 골롬 통치자 이론을 기반으로 한 더 작은 셀 배치를 사용했습니다. ais523이있다 이 건설을위한 컴파일러를 만들 뿐만 아니라, 이 TIO 세션 TWM 카운터의 추적을 디버그 실행 샘플 결과 BF 프로그램을 보여주는.

원본과 마찬가지로 이것은 Waterfall 모델 의 프로그램으로 시작하며 일반성을 잃지 않는 몇 가지 제한 사항이 있습니다.

  1. 모든 카운터는 동일한 자체 재설정 값 R 갖습니다 . 즉, TWM 트리거 맵 f 는 모든 x에 대해 f(x,x)=R 속성을 갖습니다 .x
  2. 정지 카운터 h 가 하나 있습니다 .
  3. 카운터 의 수 c 는 소수 p에 대해 (p1)/2 입니다 .p

골롬 통치자

Erdős–Turán 구조Welch–Costas 배열 의 순열 함수와 결합하여 필요한 속성을 가진 Golomb 눈금자를 얻습니다.

(이 결합 된 구성은 새로운 아이디어가 될 수 없지만 Wikipedia 에서이 두 조각을 발견하고 함께 맞았습니다.)

rp=2c+1 의 기본 근 이라고하자 . 기능 정의

g(k)=4ck((rk1)mod(2c+1)),k=0,,2c1.

  1. g2 c g ( i ) g ( j ) i , j { 0 , , 2 c - 1 } 는 차수 의 골롬 통치자 입니다 . 즉, 차이 는 고유 한 숫자 모든 쌍에 대해 고유합니다 .2cg(i)g(j)i,j{0,,2c1}
  2. g(k)mod(2c) 는 모든 값 정확히 한 번만 취합니다 .0,,2c1

테이프 구조

각 TWM 카운터 에 대해 폴백 셀값 셀 두 BF 테이프 셀 위치를 지정합니다 .x{0,,c1}u ( x ) v ( x ) u(x) v(x)

u(x)=g(k1)<v(x)=g(k2) with u(x)v(x)x(modc)

의 두 번째 속성 에는 정확히 두 개의 고유 한 값이 있습니다.gk1,k2

폴백 셀의 내용은 카운터가 방금 방문한 경우, 있을 때 카운터 자체 재설정 값의 두 배인 경우를 제외하고 대부분 으로 유지됩니다 . 값 셀은 해당 TWM 카운터 값의 두 배로 유지됩니다.02R

BF 프로그램 실행 (유한 수)으로 도달 할 수있는 다른 모든 셀은 홀수 값으로 유지되므로 항상 0이 아닌 것으로 테스트됩니다. 초기화 후에는 모든 셀 조정이 일정한 양이므로 자동입니다.

원하는 경우, 초기 BF 테이프 위치의 왼쪽으로 이동하는 것을 피하기 위해 모든 셀 위치를 일정하게 오른쪽으로 이동할 수 있습니다.

BF 프로그램 구조

하자 정지 단계 카운터 값과 대체 셀 사이의 거리 및하자 숫자 충분히 큰 것이 모든 카운터에 대한 . 기본 BF 프로그램 구조는H=v(h)u(h)NcN+1v((x+1)modc)u(x)x

초기화 조정[ >×(H+cN+1) [ <×c × H] <×H ]

초기화

초기화 단계 마지막에 카운터는 방문되었고 저스트 현재 셀의 대체 세포 인 경우 모든 셀이 상태에서, 초기 값으로 설정 프로그램에 의해 도달 :u(c1)

  1. 값 셀은 카운터 이 미리 감소 된 것을 제외하고 해당 TWM 카운터의 초기 내용의 두 배로 초기화됩니다 .0
  2. 대체 세포로 설정 세포 제외 로 설정되어, .0u(c1)2R
  3. 프로그램이 도달 할 수있는 다른 모든 셀 (유한 숫자)은 로 설정됩니다 .1

그런 다음 프로그램의 첫 번째에 도달하기 전에 테이프 포인터가 (항상 0이 아닌 셀) 위치로 이동합니다 .u(c1)H[

외부 루프의 시작

외부 루프의 반복이 시작될 때 테이프 포인터는 카운터 대해 또는 에 있습니다.u(x)Hv(x)Hx

하자 방문 할 다음 카운터 수.y=((x+1)modc)

움직임 는 테이프 포인터를 왼쪽이 아닌 위치에 놓습니다 .>×(H+cN+1)y(modc)v(y)

내부 루프 씩 좌측으로 현재 검색어 제로 셀. 카운터 가 0이면 (0) 값 셀 . 그렇지 않으면 대체 셀 찾을 수 있습니다.[ <×c c y v ( y ) u ( y )]cyv(y)u(y)

발견 된 셀이 새 활성 셀이됩니다.

조정

조정 단계는 현재 셀에 대한 상대적인 위치에 기초하여 상기 테이프에 다양한 세포를 조절한다. 이 섹션에는 +-><명령 만 포함되어 있으므로 이러한 조정은 무조건 수행됩니다. 그러나 모든 카운터 관련 셀이 Golomb 눈금자 패턴이기 때문에 현재 활성 셀에 적합하지 않은 조정은 모든 중요한 셀을 놓치고 대신 부적합한 셀을 조정합니다 (홀수 유지).

따라서 조정은 상대적 위치만을 기반으로하기 때문에 활성 셀의 자체 조정을 제외하고 가능한 모든 활성 및 조정 셀 쌍에 대해 별도의 코드가 프로그램에 포함 되어야합니다.

필요한 조정은 다음과 같습니다.

  1. 이전 카운터의 폴백 셀 를 조정하십시오 .u(x)2R
  2. 현재 카운터의 대체 세포 조절 에 의해 , 제외 현재 액티브 셀인지 우리는 중단되도록한다.u(y)2RV ( H )v(h)
  3. 다음 카운터의 값 셀 를 (카운터 감소).v((y+1)modc)2
  4. 활성 셀이 값 셀 (카운터 가 0에 도달 한 경우) TWM 트리거 맵에서 모든 값 셀 를 만큼 조정하십시오 . 자체는 의해 조정됩니다 .v(y)yv(z)2f(y,z)v(y)2R

위의 첫 번째 및 두 번째 조정은 모든 활성 셀 이 동일한 값, 즉 값 셀의 경우 폴백 셀의 경우 자체 조정해야한다는 사실에 의해 필요합니다 . 이를 위해서는 대체 셀을 준비하고 정리 하여 값 및 대체 브랜치에서 모두 으로 돌아 오도록해야합니다 .2R0

외부 루프의 끝

움직임 는 조정 단계의 끝에서 테이프 포인터가 활성 셀의 왼쪽 으로 위치 이동 한다는 것을 나타낸다.<×HH

모든 활성 셀들에 대한 다른 정지 단계 카운터 값 전지보다 ,이 관련성이없는 셀 등 홀수 및 비 - 제로이고, 상기 외부 루프가 다른 반복에 대해 계속된다.v(h)

들어 , 포인터 대신에 이에 대응하는 대체 셀에 배치되는 우리가 제로로 유지하는 상기 예외를 만든되는, 프로그램이 종료되므로 최종 관통 하고 정지하고.v(h)u(h)]


12

두 세트의 대괄호 로이 작업을 수행하는 것이 불가능하다는 것을 100 % 확신하지 못합니다. 그러나 BF 테이프의 셀이 제한되지 않은 값을 허용하면 3 세트의 대괄호로 충분합니다. (간단하게하기 위해 테이프 헤드를 시작점에서 왼쪽으로 이동할 수 있다고 가정합니다. 비록이 구조는 테이프의 유한 영역 만 사용하기 때문에 시작 부분에 충분히 많은 >명령을 추가하여 제한을 해제 할 수 있습니다 . 아래의 구성은 Artin의 추측을 전제로합니다.임의로 큰 프로그램을 컴파일 할 수 있습니다. 그러나 Artin의 추측이 틀리더라도 아래의 구성을 사용하여 Turing-complete language의 통역사를 BF로 번역하고 통역사에 입력으로 임의의 프로그램을 실행하여 Turing-completeness를 간접적으로 보여줄 수 있습니다.

우리가 무한한 BF로 컴파일하는 Turing-complete 언어 는 가장 단순한 계산 모델 중 하나 인 Waterfall 모델입니다. 그것을 아직 모르는 사람들을 위해, 그것은 다수의 카운터 (및 그것들의 초기 값)와 카운터 쌍에서 정수까지 의 함수 됩니다; 프로그램 실행은 모든 카운터에서 1을 반복적으로 빼고 카운터 가 0이면 각 카운터 를 더합니다 (프로그램은 여러 카운터에 동시에 발생하지 않도록 작성됩니다). 내 링크 뒤에이 언어에 대한 튜링 완전성 증거가 있습니다. 일반성을 잃지 않으면 모든 카운터가 동일한 자체 재설정 값을 갖는다 고 가정합니다 (예 :fxf(x,y)yf(x,x) 는 모든 대해 동일하다 ); 이는 특정 에 대해 각 상수 동일한 상수를 추가해도 프로그램의 동작이 변경되지 않기 때문에 안전한 가정 입니다.xxf(x,y)

를 카운터의 수로 하자 . 일반성 (Artin의 추측을 가정)의 손실없이, 즉 가정 갖는다 시근 2.하자 수 , 2보다 큰 최소의 힘 . 일반성을 잃지 않으면 는 보다 작을 것이다 ( 는 다항식으로 묶여 있고, 는 기하 급수적으로 증가하므로 충분히 큰 는 효과가있다).ppqp(1+s+s2)sp2q2p2q2pp

테이프 배열은 다음과 같습니다. 각 카운터에 정수 번호를 매 (일반성을 잃지 않고 단일 중단 카운터가 있다고 가정하고 번호를 가정합니다 ). 대부분의 카운터 값은 테이프 셀 에 저장되는 테이프 0을 제외하고 테이프 셀 에 저장됩니다 . 셀 -1부터 까지의 홀수 번째 테이프 셀0i<p22i2q2p+1+2p+1테이프 셀이 카운터 왼쪽에 있지 않으면 항상 1을 유지합니다.이 경우 항상 0을 유지합니다. 카운터로 사용되지 않는 짝수 번호의 테이프 셀은 관련이없는 값을 갖습니다 (0 일 수도 아닐 수도 있음). ); 명시된 범위 밖의 홀수 번째 테이프 셀도 관련이없는 값을 갖는다. 테이프를 적절한 초기 상태로 설정하려면 많은 수의 테이프 요소 만 일정한 값으로 초기화해야합니다. 즉, 일련의 <>+-명령으로 수행 할 수 있으므로 (사실 >+필요) 브래킷이 없습니다. 이 초기화가 끝나면 테이프 포인터를 셀 -1로 옮깁니다.

프로그램의 일반적인 형태는 다음과 같습니다.

초기화 조정[>>>[ >×(2p1) [ <×(2p) ]>-] <<<]

초기화는 테이프를 예상 모양으로 만들고 포인터를 셀 -1에 놓습니다. 이것은 카운터 왼쪽의 셀이 아니며 (0은 2의 거듭 제곱이 아닙니다) 값 1을 가지며 루프에 들어갑니다. 이 가장 바깥 쪽 루프에 대한 루프 불변은 테이프 포인터가 카운터의 왼쪽에있는 세 개의 셀 (각 루프 반복의 시작과 끝)에 있다는 것입니다. 따라서 카운터 2의 왼쪽에 3 개의 셀이있는 경우에만 루프가 종료된다는 것을 알 수 있습니다 (각 다른 카운터에는 왼쪽에 1 개의 3 개의 셀이 있습니다. 0은 두 개의 카운터의 테이프 위치를 의미합니다) 2 개의 셀이 떨어져 있습니다 .2와 다른 2의 거듭 제곱은 과 이며 의 이진 표현은 s의 문자열에서 의 문자열로 변경됩니다2122q01s 또는 그 반대의 경우는 4 회 이상이므로 2의 거듭 제곱에서 1을 벗어날 수 없습니다.

두 번째 루프는 카운터를 반복해서 반복하여 감소시킵니다. 루프 불변은 테이프 포인터가 항상 카운터를 가리키고 있다는 것입니다. 따라서 일부 카운터가 0이되면 루프가 종료됩니다. 감소는 단지 -; 한 카운터에서 다음 카운터로가는 방법은 더 복잡합니다. 기본 아이디어는 공백을 에서 오른쪽 으로 이동하면 홀수 셀 에 위치하게됩니다.이 카운터는 모든 카운터의 오른쪽에 있습니다 ( 마지막 카운터이고 때문에 양수 )는 긍정적이다; modulo ,이 값은 (Fermat 's Little Theorem에 의해) 일치합니다 . 가장 안쪽의 루프는2p12x2p+2x12p2x1x2p2x+12p 공간은 테이프 셀 모듈로 의 인덱스를 변경하지 않으며 결국 셀 이 값을 갖는 모듈로 (일부 카운터의 왼쪽에 있는 셀)에 일치해야합니다 . 우리의 원시 루트 요구 사항 때문에 정확히 하나의 그러한 셀이 있습니다 ( 은 modulo 에 적합하고 은 에 일치 합니다 다른 , 여기서 는 밑이 2 인 모듈로 대한 이산 대수입니다 ). 또한, 테이프 포인터 모듈로의 위치가 임을 알 수 있습니다2p2x+12p2q112p2log2,p(r)+112r1rlog2,pp2p중간 루프를 돌 때마다 씩 증가 합니다. 따라서 테이프 포인터는 모든 카운터 사이를 순환해야 합니다 (값이 모듈로 순서 ). 따라서, 모든 반복, 우리는 모든 카운터 (AS 요구)를 감소시킨다. 루프가 반복적으로 도중에 끊어지면 루프를 다시 입력 할 때 감소를 다시 시작합니다 (가장 바깥 쪽 루프의 나머지 부분이 테이프 포인터 위치를 완전히 변경하지 않기 때문에).2p2pp

카운터가 0에 도달하면 중간 루프가 중단되어 "조정"코드로 이동합니다. 이것은 기본적으로 의 인코딩입니다 . 모든 쌍 , 카운터 의 테이프 위치가 카운터 의 왼쪽 / 오른쪽과 같은 현재 테이프 포인터의 왼쪽 / 오른쪽과 동일한 거리 인 테이프 요소에 를 추가합니다. 테이프 위치 (그리고 테이프 포인터를 시작 위치로 다시 제거) 때 거리는 고유합니다.f(x,y)f(x,y)yxxy

  • 2 개의 힘의 차이는 하나 이상의 문자열로 이루어진 이진수 0 문자열 이상의 다음의 숫자의 시작의 장소 값들 (상기의 개시 문자열 와 각각 더 크고 작은 것에 따라 ); 따라서 모든 차이점이 명확합니다. * 2와 의 거듭 제곱의 차이 는 과 의 스트링 사이에 적어도 두 개의 전이를 포함해야합니다 (100xyq10q 이러한 전이를 4 개 이상 포함하면 빼기는 2) 만 제거 할 수 있으므로 2의 2 제곱의 모든 차이와 구별되며 이러한 차이는 분명히 서로 다릅니다.

들면 , 우리는 분명히 이동 거리가 0 인 것을 발견하지만 모든 때문에 동일한, 우리는 현재의 셀의 조정으로 사용할 수있다. 따라서 조정 코드는 모든 카운터에 대해 "카운터가 0을 칠 때"효과를 구현한다는 것을 알 수 있습니다. 실제로 카운터를 나타내는 모든 셀은 올바른 양으로 조정되며 다른 모든 조정은 카운터가 아닌 짝수 셀에 영향을 미치며 (두 짝수의 차이는 짝수) 프로그램 동작에 영향을 미치지 않습니다.x=yf(x,y)

따라서 이제 폭포 모델에서 BF 로의 프로그램 (정지 동작 포함, 튜링 완료에는 필요하지 않은 I / O 제외)의 프로그램을 3 쌍의 브래킷과 3 쌍만 사용하여 컴파일했습니다. 괄호는 충분합니다.


좋은 작업! 나는 당신이 TNB 에서이 일을 보았습니다!
MilkyWay90

나는 당신이 p + 2 이상이어야한다고 생각합니다. S = P + 1, q는 2의 거듭 제곱보다 적은 1
Ørjan 요한센

필자는 소수 이론을 요구하지 않는 것처럼 훨씬 간단한 카운터 배치를 발견했다고 생각 2p*2^i+2i합니다.
Ørjan Johansen

@ ØrjanJohansen : 그렇습니다. #esoteric (이 글을 쓴 후 언젠가)에서 그 구성을 언급 한 것 같습니다. 실제로 필요한 것은 각 요소가 모듈 수만큼 다른 모듈로를 갖는 골롬 통치자이며, 최적의 요소를 찾는 것은 어렵지만, 내가 찾은 가장 긴 것은 (무차별 적 인 힘) [0, 1, 3, 7, 20, 32, 42, 53, 58]p에 대한 다양한 방법이 있습니다. = 9).
ais523

오, 당신은 그렇게했습니다 (내 두뇌가 수학 모드에 있다고 거부하기 전에 바로 내 변명이 있습니다 : P). 그렇다면 k = 0이면 충분하다는 것을 알았습니다. Wikipedia의 Erdős-Turan_construction 은 요소의 첫 번째 절반 만 사용하면 다 항적으로 성장하고 (아마도 O ()-최적입니까?) 하나를 제공한다고 생각합니다 (다른 절반은 mod p).
Ørjan Johansen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.