설명을 위해 Google을 시도했지만 대부분의 링크는 "FRACTRAN이 완전히 완료되었습니다. 예를 들어 곱셈을 살펴 보겠습니다."
xkcd 포럼 게시물에서 FRACTRAN 이 포스터가 Turing Completeness를 이해하는 데 도움이 되었다고 말한 것을 기억 합니다. 나는 언어 역학을 보는 것이 분명하지 않기 때문에이 esolang이 왜 Turing complete인지에 대한 직관적 인 설명을 찾고 있습니다.
설명을 위해 Google을 시도했지만 대부분의 링크는 "FRACTRAN이 완전히 완료되었습니다. 예를 들어 곱셈을 살펴 보겠습니다."
xkcd 포럼 게시물에서 FRACTRAN 이 포스터가 Turing Completeness를 이해하는 데 도움이 되었다고 말한 것을 기억 합니다. 나는 언어 역학을 보는 것이 분명하지 않기 때문에이 esolang이 왜 Turing complete인지에 대한 직관적 인 설명을 찾고 있습니다.
답변:
명령형 언어가 튜링을 완료하려면 다음이 있어야합니다.
FRACTRAN은 소수의 지수에 데이터를 저장하는 일련의 분수로 구성된 언어입니다.
두 개의 숫자를 더하고 싶다고합시다 : 2 a 3 b 는 5 ab가됩니다.
455 11 1 3 11 1 ---,-,-,-,-,- 33 13 11 7 2 3
위의 변경을 수행하기위한 FRACTRAN 프로그램입니다.
72 (2 3 3 2 ) 와 같은 숫자로 시작합니다 . 프로그램은 명령어에 곱할 때 다른 정수 (나머지는 허용되지 않음) 인 숫자를 찾을 때까지 '전달'됩니다.
72
에 도달 할 때까지 앞으로 실행됩니다 11/2
. 그런 다음 숫자를 나누고 2
곱합니다 11
(11의 거듭 제곱은 변수 임). 이 제공합니다 396
. 396
는 33으로 나눌 수 있고 (3의 거듭 제곱과 11을 줄임) 455를 곱합니다 (5, 7 및 13 변수 증가). 등등. 이 프로그램과 상태 테이블에 대한 자세한 설명은 FRACTRAN wikipedia 페이지 에서 읽을 수 있습니다 .
튜링 완전성에 터치가에서 찾을 수 있다는 스택 거래소에 다른 FRACTRAN 재질 : 브레인 퍽로 변환 Fractran는 (좋아, 그건입니다 정말 자신의 시간을 생산적으로 사용)
Fractran이 Turing-complete 인 이유는 레지스터 시스템을 시뮬레이션하기 때문입니다. 숫자의 소인수 분해는 레지스터의 내용을 저장하는 반면, 나누기와 곱셈은 레지스터에서 조건부로 더하고 빼는 방법입니다.
여기에 트릭 (이론에 길을 잃지이 시작)의 일부 장면 뒤에, 이것은 점이다 민스키 레지스터 기계 는 특정 테이프 (프로그램) 기계를 튜링 것을 증명했다있는 경우 테이프가로 표시됩니다 괴델 번호 입니다 FRACTRAN 번호가 정확히 무엇인지 (링크 된 wikipedia 페이지에서) :
Gödel은 소인수 분해에 기반한 시스템을 사용했습니다. 그는 먼저 자신이 다루고있는 공식 산술 언어로 각 기본 기호에 고유 한 자연수를 할당했습니다.
따라서 조건부 루프, 고델 (Gödel) 숫자로 저장된 임의의 변수, 튜링 머신이 있습니다.
FRACTRAN의 특성과 같은 Collatz에 대한 다른 재미있는 독서는 Ca n't Decide 에서 읽을 수 있습니까? 미정! 이것은 Collatz 추측과 FRACTRAN 및 정지 문제와 관련이 있습니다.
FRACTRAN은 머리를 숙이기가 조금 어렵습니다.
다음과 같은 프로그램을 고려하십시오.
LABEL: start
block1
block2
block3
...
END
여기서 각 블록은 다음과 같은 형식입니다.
IF(registers X >= a, Y >= b) # or any combination of registers
THEN
X -= a
Y -= b
I += n
J += m
goto start
위의 곱셈 프로그램의 첫 번째 진술 :
455 --- 33
이 형식으로 다음과 같이 작성됩니다 :
IF(register `3` >= 1 && `11` >= 1)
THEN
`3` -= 1
`11` -= 1
`5` += 1
`7` += 1
`13` += 1
goto start
따라서 Turing 완전성에 필요한 데이터 스토리지 및 루핑 구성을 명확하게 볼 수 있습니다. 매우 초보적이지만 간단한 레지스터 머신으로 존재하고 실행되지만 실제로 할 수있는 모든 것입니다.
아직도 확신하지 않습니까?
이것은 Dimitri Hendricks 의 계산 모델에 관한 강의에서 대부분 빌 렸습니다.
이것은 (2/3)
가산기 (2 a 3 b- > 3 a + b ) 인 매우 간단한 프로그램 을 취하지 만 파괴적입니다 .2의 값은 프로세스의 일부로 지워집니다.
그러한 파괴를 쉽게하지 못하게하는 더 높은 수준의 FRACTRAN을 작성할 수 있습니다.
원래 프로그램은 다음과 같이 생각할 수 있습니다.
2 α :-→ α 삼
F 2 에서는 일종의 '기능'을 지정할 수 있습니다.
10 1 α :-→ α,-→ β 3 1 삼 β :-→ β 5
F 2 프로그램 (P)을 표준 FRACTRAN 프로그램으로 변환하려면 다음을 수행하십시오.
에이스 p :-→ q,-→ r,--> s, ... bdf
된다 :
aq cr es -,-,-, ... bp dp fp
이 작업은 프라임 p, q, r 및 s를 사용하여 프로그램 상태를 저장합니다.
그리고 우리는 레지스터 머신을 가지고 있습니다. 그것은 임의의 큰 숫자와 두 개의 명령어를 저장하는 유한 한 수의 레지스터를 가지고 있습니다 :
이 레지스터 머신은 튜링 완료된 것으로 표시되었습니다.
그런 다음 기계 프로세스의 일부로 레지스터 머신 프로그램을 FRACTRAN 프로그램으로 컴파일 하는 여러 슬라이드에 대한 프로세스를 보여줍니다 .
원래:
p (i) inc (x (i), m) = ---- → m 1 1 1 jzdec (x (i), m1, m2) = ---- → m2,-→ m1 p (i) 1
따라서이 두 가지 컴퓨팅 모델의 동등성으로 인해 FRACTRAN은 튜링 완료되었습니다.
Btw, 당신이 정말로 마음을 날려 버리고 싶다면, Code Golf : Fractran 을 읽으십시오 . 일부 사람들은 다른 FRACTRAN 프로그램을 실행하기 위해 FRACTRAN 프로그램을 작성했습니다.