거의 1 년 후이 문제로 돌아와서 게시하기 전에 몇 가지 중요한 연구를 놓쳤다는 것을 깨달았습니다.
Jot 은 컴팩트 한 Goedel 번호 매기기로 나타낼 수있는 비교적 간단한 두 개의 결합기 B & X를 사용하여 내가 요구 한 청구서에 맞는 것 같습니다.
파이썬으로 그의 참조 구현을 단순화했습니다.
def S(x): return lambda y: lambda z: x(z)(y(z))
def K(x): return lambda y: x
def X(x): return x(S)(K)
def B(x): return lambda y: lambda z: x(y(z))
def I(x): return x
def J(n): return (B if n & 1 else X)(J(n >> 1)) if n else I
J (n)은 Goedel 번호 n으로 표시되는 프로그램을 나타내는 내장 함수를 반환합니다.
B (교회 인코딩 된 곱셈과 동일)는 기능적 적용 (괄호)의 기능을 수행하며 단일 기준 Iota 결합기 X의 S / K 절반을 분리 할 수 있습니다.
이 언어의 몇 가지 중요한 속성이 2000 년경 언어 창시자 크리스 바커 (Chris Barker)의 웹 사이트에서 (거의) 뻔뻔스럽게 훔치고 있습니다.
Jot는 구문에서 정규 언어이지만 Turing-complete입니다. J (n)의 구현에서 호스트 언어가 꼬리 재귀를 지원하는 경우 비트 열 프로그램 형식을 구문 분석하는 데 필요한 스택 공간이 없음을 알 수 있습니다.
Turing-completeness의 증거는 Chris 사이트에서도 제공되며 S 및 K 조합자를 사용하여 이미 알려진 Turing-complete 조합 논리를 구현합니다.
K ==> 11100
S ==> 11111000
AB ==> 1[A][B], where A & B are arbitrary CL combinators built up from K & S
Jot에는 구문 오류가 없으며 Goedel 번호 n이 지정된 모든 프로그램이 유효한 프로그램입니다. 사소한 것으로의 구문 분석을 단순화 할뿐만 아니라 이론적으로 잘못된 형식의 프로그램을 건너 뛰어야하는 Turing-complete 인코딩보다 Jot을 훨씬 더 포용 적으로 만들어야하기 때문에 이것은 아마도 내 연구에서 가장 중요한 측면 일 것입니다.
나는 Jot에서 함수의 Kolmogorov 복잡성을 찾는 반 결정 가능한 문제를 무차별 강제로 '해결'하는 몇 가지 도구를 작성했습니다. 프로그래머에게 의존하여 함수 매핑의 매우 특징적인 훈련 예제를 지정한 다음 모든 훈련 예제가 일치 할 때까지 모든 Jot 프로그램을 열거하고 마지막으로 원래의 자세한 구현과 찾은 함수의 동등성에 대한 증거를 시도합니다.
현재 제한된 리소스로 최대 40 비트까지만 작동합니다. 훨씬 더 큰 프로그램을 배우기 위해 SAT 솔버로 다시 작성하려고합니다. 부울 수식으로 경계 중첩 클로저를 언 롤링하는 방법을 알고 있다면 새로운 질문에 도움을주십시오 .
이제 John Tromp의 Binary Lambda Calculus와의 흥미로운 비교를 위해 간결하게 알려져 있지만 구문 오류가 발생할 수 있습니다. 다음 프로그램은 몇 초 만에 학습 프로그램에 의해 생성되었습니다.
Function Jot Binary Lambda Calculus |J| |B|
--------|----------|--------------------------|---|---
SUCC J(18400) "000000011100101111011010" 15 24
CHURCH_0 J(154) "000010" 8 6
CHURCH_1 J(0) "00000111010" 1 11
CHURCH_2 J(588826) "0000011100111010" 20 16
IS_ZERO J(5) "00010110000000100000110" 3 23
MUL J(280) "0000000111100111010" 9 19
EXP J(18108) "00000110110" 15 11
S J(8) "00000001011110100111010" 4 23
K J(4) "0000110" 3 7
AND J(16) "0000010111010000010" 5 19
OR J(9050) "00000101110000011010" 14 20
내 실험에서 Jot이 더 작은 프로그램으로 이끈다는 가설은 내 프로그램이 간단한 기능을 배우고 구성한 다음 개선 된 천장에서 더 큰 기능을 배우면서 천천히 확인되고 있습니다.