이 OISC는 다음과 같이 정의 된 Fokker의 X- 콤비 네이터를 기반 으로합니다.
X=λf .f (λg h x .g x (h x)) (λa b c .a)
SKI 미적분 이 튜링 이라는 사실을 인정하면 위의 콤비 네이터도 튜링 완료입니다. 이것은 S , K 및 I 를 다음 과 같이 X 로 작성할 수 있기 때문입니다 .XSKIX
SKI=S K K=X (X X)=X X=X (X X) ( X 엑스) ( X 엑스)
XOISC 작동 방식
내부적으로 XOISC에는 (처음에는 비어있는) 스택이 있으며, 을 인수로 사용하는 명령 은 다음을 수행합니다.엔
- 스택에서 요소 (기능 f 1 … f N )를 팝 하고 f 1 ( f 2 ( … ( f N엔에프1… f엔에프1 ( f2 ( … ( f엔 엑스) … ) )
명령이 더 이상 남아 있지 않으면 XOISC는 모든 명령 줄 인수 (있는 경우)를 스택으로 푸시합니다. 예를 들면 다음과 같습니다.
[ s1, ... , 이야 엠전에 스택, 1, ... , 엔인수]
최종 계산은 .( … ( ( … ( s1 에스2) … ) s 엠) 1) … ) a엔
XOISC의 하나의 명령어는 하나의 인수 (메모리 오프셋) 만 취하므로 해당 명령어의 이름을 사용할 이유도 없습니다. 따라서 유효한 소스 파일은 다음과 같이 개행 또는 공백으로 구분 된 정수로만 구성됩니다.
0 0 2 0 1 0 1
온라인으로 사용해보십시오!
예
위 예제를 보자 (오른쪽으로 자라는 스택).
0020101팝 0 및 적용 (즉, 단일 X 푸시 ) :다시 간단히 X 를 누릅니다. :팝 2 ( a , b )를 누르고 a ( b X ) :단순히 X 를 누르십시오 :1 ( a )를 팝 하고 X를 누릅니다 . :단순히 X 를 누르십시오 :1 ( a )를 팝 하고 X를 누릅니다 . :[ X][ X, X ][ X ( X 엑스) ][ X ( X 엑스) , X ][ X ( X 엑스) , X 엑스][ X ( X 엑스) , X 엑스, X ][ X ( X 엑스) , X 엑스, X 엑스]
마지막으로 스택을 평가 : 또는 덜 괄호 X ( X X ) ( X X ) ( X X ) 우리는 좋은 오래된로 인식하는 S K K의 정체성 기능.( ( X ( X 엑스) ) ( X 엑스) ) ( X 엑스)엑스 ( X 엑스) ( X 엑스) ( X 엑스)에스 케이 케이
튜링 완성도
증거 아이디어
XOISC가 튜링을 완료하려면 괄호와 조합 의 (올바른) 인터리빙을 번역 할 수 있어야합니다 . 이것은 팝업, 적용 및 푸시가 올바른 연관 방식으로 수행되기 때문에 가능합니다 (함수 적용은 왼쪽 연관 임).엑스
이러한 표현식 을 번역하려면 다음과 같이 쉬운 방법이 있습니다. 항상 현재 괄호 레벨의 처음부터 하나의 요소 만 남도록 많은 요소를 팝하십시오.엑스
예를 들어, 이전에 사용한 표현식 : ( ( X ( X 엑스) ) ( X 엑스) ) ( X 엑스)
- 를 얻으려면 간단히엑스
0
- 다음으로 우리는 새로운 수준의 괄호 안에 있습니다.
0
- 이제 두 개의 괄호가 닫히므로 2 개의 요소를 표시해야합니다.
2
- 다시 우리는 새로운 수준의 괄호 안에 있습니다.
0
- 두 괄호, 다시 닫습니다
2
- 그리고 다시
그래서 우리는 다른 의미 론적으로 XOISC 프로그램으로 끝납니다.
0 0 2 0 2 0 2
온라인으로 사용해보십시오!
엑스
공식적인 증거
SKI 미적분이 튜링을 완료 한 것을 감안할 때 다음 두 가지를 보여줘야합니다.
- 엑스
- 엑스
소개에서 세 가지 평등을 증명하는 첫 번째 부분은 매우 지루하고 공간 소모적이며 흥미롭지 않습니다. 따라서이 게시물에 넣는 대신 여기에서 찾을 수 있습니다 * .
엑스
엑스엑스에프 지에프지
0
엑스에프1… F엔지1… G케이에프지에프 지
에프1… F엔 지1… G케이− 1 ( G케이+ 1 )에프지지에프에프 지
통역사
입력
타입이 지정되지 않은 람다 미적분은 우리가 원하는 모든 것에 대해 우리 자신의 데이터 타입을 정의해야하기 때문에 통역사가 교회 숫자를 인식하는 것은 번거 롭습니다. 이것은 입력을 제공 할 때 자동으로 숫자를 해당하는 교회 숫자로 변환합니다.
예를 들어 두 개의 숫자를 곱하는 프로그램이 있습니다. 온라인으로 사용해보십시오!
또한 De Bruijn 인덱스 ( 예 : S
결합 자 \\\(3 1 (2 1))
(또는 λλλ(3 1 (2 1))
)) 를 사용하여 함수를 인수로 제공 할 수도 있습니다 . 그러나 그것은 또한 인식 S
, K
, I
물론 X
콤비를.
산출
기본적으로 인터프리터는 출력이 정수를 인코딩하는지 확인하고, 그렇지 않으면 결과와 함께 해당 숫자를 출력합니다. 편의상 -b
인터프리터가 부울을 대신 일치 시키도록 지시 하는 플래그가 있습니다 (마지막 예 참조).
어셈블러
물론 어떤 저수준 언어라도 고수준 언어를 그 언어로 변환하는 어셈블러가 필요합니다. 간단히 모든 입력 (위 참조)을 사용하여 -a
플래그 를 사용하여 XOISC 프로그램으로 변환 하고 온라인으로 사용해보십시오! **
* 링크가 다운 된 경우이 게시물에 HTML 주석으로 된 사본이 있습니다.
** 이로 인해 우선 순위를 테스트하는 프로그램이 만들어집니다. 온라인으로 사용해보십시오!