평평한 표현을위한 가장 간단한 완벽한 콤비 네이터 기본 쌍


9

Chris Okasaki의 논문 " Flattening Combinators : Surviving Without 괄호 "에서 그는 응용 연산자 나 괄호없이 Turing-complete 표현을 인코딩하기위한 기초로 두 개의 결합자가 충분하고 필요하다는 것을 보여줍니다.

응용 연산자와 접두사 코딩 S 및 K 콤비 네이터를 통해 " 이진 람다 미적분 및 조합 논리 " 에서 John Trump의 콤비네이션 논리 인코딩과 비교할 때 플랫 표현식에 두 개의 콤비 네이터 만 있으면 코드 밀도가 최적으로 증가합니다. 그 결과 Goedel 번호 매기기는 정식 표현이 일반적으로 구문 상 유효하지 않은 프로그램에 대한 설명을 허용하는 대부분의 계산 및 최소 설명 길이 관련 esolangs와 달리 모든 정수를 유효하고 잘 구성된 닫힌 용어 식에 매핑합니다.

그러나 오카 사키의 인코딩은 람다 미적분학 용어에서 비트 스트링으로의 단방향 매핑에 가장 도움이되는 것으로, 실제 축소 명령으로 사용될 때이 축소에 사용 된 두 결합기가 상대적으로 복잡하기 때문에 반드시 다른 방법은 아닙니다.

응용 연산자가 필요없는 가장 간단한 완벽한 결합기 기준 쌍은 무엇입니까?


1
관련성이 있는지 확실하지 않지만 단일 용어로 형성된 람다 미적분의 기저가 있음에 유의하십시오 . 이로 인해 고델 (Gödel) 번호 매기기가 훨씬 간단 해졌습니다. cs.uu.nl/research/techreps/repo/CS-1989/1989-14.pdf
chi

답변:


2

거의 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이 더 작은 프로그램으로 이끈다는 가설은 내 프로그램이 간단한 기능을 배우고 구성한 다음 개선 된 천장에서 더 큰 기능을 배우면서 천천히 확인되고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.