교회 부호화

Church encoding

수학에서 처치 인코딩람다 미적분학에서 데이터와 연산자를 나타내는 수단입니다.교회 숫자는 람다 표기법을 사용한 자연수의 표현이다.이 방법은 람다 미적분의 데이터를 처음으로 이런 방식으로 인코딩한 Alonzo Church의 이름을 따서 명명되었습니다.

일반적으로 다른 표기법(정수, 부울란, 쌍, 목록 및 태그 부착 결합 등)에서 원시적인 것으로 간주되는 용어는 교회 인코딩에서 상위 함수에 매핑됩니다.Church-Turing 논문은 계산 가능한 연산자(및 그 피연산자)는 Church 인코딩으로 [dubious ]표현될 수 있다고 주장한다.비정형 람다 미적분학에서 유일한 원시 데이터 유형은 함수입니다.

사용하다

Church 인코딩을 직접 구현하면 O( )에서( n ( n ) ( n \ O ( 로의 액세스 조작이 느려지고, 여기서 \ n은 데이터 구조의 크기이므로 Church 인코딩이 [1]실용적이지 않습니다.연구에 따르면 이는 표적 최적화를 통해 해결할 수 있지만, 대부분의 기능적 프로그래밍 언어는 대신 중간 표현을 확장하여 대수적 데이터 유형을 [2]포함합니다.그럼에도 불구하고 Church 인코딩은 부분 평가와 정리 [1]증명에 대한 자연스러운 표현이기 때문에 이론적인 논쟁에서 종종 사용된다.상위 [3]유형을 사용하여 작업을 입력할 수 있으며 원시 재귀에 쉽게 액세스할 [1]수 있습니다.함수가 유일한 원시 데이터 유형이라는 가정은 많은 증거를 합리화합니다.

교회 인코딩은 완전하지만 대표적으로만 가능합니다.표현을 일반 데이터 유형으로 변환하여 사람들에게 표시하기 위해서는 추가 기능이 필요합니다.처치의 정리에서 등가의 결정 불가능으로 인해 두 함수가 확장적으로 동일한지 결정하는 것은 일반적으로 가능하지 않다.변환은 함수를 적용하여 함수가 나타내는 값을 가져오거나 해당 값을 리터럴 람다 용어로 검색할 수 있습니다.람다 미적분은 보통 강약적 등식을 사용하는 것으로 해석됩니다.평등에 대한 집중적 정의와 확장적 정의 간의 차이 때문에 결과의 해석에 잠재적인 문제가 있다.

교회 숫자

교회 숫자는 교회 부호화에서 자연수를 표현한 것입니다.자연수 n을 나타내는 고차 함수는 임의의 f f n배 구성에 매핑하는 함수입니다.간단히 말하면, 숫자의 "값"은 함수가 인수를 캡슐화한 횟수와 동일합니다.

모든 교회 숫자는 두 가지 매개변수를 사용하는 함수입니다.교회 숫자 0, 1, 2, ...는 람다 미적분학에서 다음과 같이 정의된다.

함수를 전혀 적용하지 않는 0부터 시작하여 1회 적용, 2회 적용, 3회 적용 등으로 진행합니다.

교회 숫자 3은 주어진 함수를 한 값에 세 번 적용하는 동작을 나타냅니다.제공된 함수는 먼저 제공된 파라미터에 적용된 후 자체 결과에 순차적으로 적용됩니다.최종 결과는 숫자 3이 아닙니다(지정된 파라미터가 0이고 함수가 후계 함수인 경우를 제외).최종 결과가 아니라 함수 자체가 교회 숫자 3이다.Church number 3은 단순히 어떤 것이든 세 번 한다는 것을 의미한다.그것은 "세 번"이 의미하는 바를 과시하는 이다.

교회 숫자를 사용한 계산

숫자에 대한 산술 연산은 교회 숫자에 대한 함수로 나타낼 수 있다.이러한 함수는 람다 미적분으로 정의하거나 대부분의 함수 프로그래밍 언어로 구현할 수 있습니다(람다 식을 함수로 변환 참조).

( , ) + ( \ ( , n ) m + (x ) ( ){ f^ { \ display f + n} ( x ) = { f } { f + n } { f + { f } { f } { f } { f } { f } { f } n }

succ ( ) + { {( n ) = 은 ( +1){ ( \ { \ 1β등가 됩니다.

곱셈 mult ( , ) n{ {} ( , n ) * ( xn m( ) { \ f^{ n } (=f * n } \ n \ \ \ n ∘ \ \ \ \ \ \ \ \ \ ∘ ∘ ∘ ∘ \ \ \ \

exp( m, n ) n \{ ( m , n ) m{ n 은 교회 숫자의 에 의해 됩니다. 대체 m } \} . , n,

람다 표정을 짓는데

pred ( ){ {} ( ) 함수는 하기 어렵습니다.

교회 숫자는 함수를 n회 적용합니다.이전 함수는 매개 변수를 n - 1회 적용하는 함수를 반환해야 합니다.이것은 f와 x 주위에 컨테이너를 구축함으로써 달성되며, f와 x는 함수의 적용을 최초로 생략하는 방식으로 초기화됩니다.자세한 설명은 이전 문서를 참조하십시오.

감산 함수는 이전 함수를 기반으로 작성할 수 있습니다.

교회 숫자 함수표

기능. 대수학 신원 함수 정의 람다 식
후계자 ...
추가
곱셈
지수화 [4]
이전 버전*

감산* ...

* Church 인코딩에서는

이전 함수의 도출

Church 인코딩에 사용된 이전 함수는 다음과 같습니다.

{ - 、 { } ( n ) } 0 & { \ { n=0 , \ n - 1 & { { cases } }}

이전 버전을 구축하려면 기능을 1시간 단축하는 방법이 필요합니다.숫자 n은 함수xfn회 적용한다.이전 함수는 숫자 n을 사용하여 함수를 n-1번 적용해야 합니다.

이전 함수를 구현하기 전에 컨테이너 함수로 값을 정리하는 스킴을 다음에 나타냅니다.f와 x 대신 inc와 init이라고 하는 새로운 함수를 정의합니다.컨테이너 함수를 값이라고 합니다.표의 왼쪽에는 inc와 init에 적용되는 숫자n이 표시되어 있습니다.

일반적인 반복 규칙은 다음과 같습니다.

컨테이너에서 값을 검색하는 기능도 있는 경우(추출이라고 함),

그런 다음 추출물을 사용하여 다음과 같이 새넘 함수를 정의할 수 있습니다.

samenum 함수는 본질적으로 유용하지 않습니다.단, inc는 f의 호출을 container 인수에 위임하므로 첫 번째 어플리케이션에서 f의 번째 어플리케이션을 건너뛸 수 있는 인수를 무시하는 특별한 컨테이너를 받을 수 있습니다.이 새로운 초기 컨테이너를 const라고 부릅니다.위 표의 오른쪽은 n inc const의 확장을 나타냅니다.그런 다음 같은 함수의 식에서 init을 const대체하면 이전 함수를 얻을 수 있습니다.

아래에 설명된 와 같이 inc, init, const, value 및 extract 함수는 다음과 같이 정의할 수 있다.

그래서 람다 표현은 다음과 같이 나타납니다.

값 컨테이너

값 컨테이너는 해당 값에 함수를 적용합니다.이것은 다음과 같이 정의됩니다.

그렇게,

주식회사

inc 함수는 v를 포함하는 값을 가져와서 f v를 포함하는 새 값을 반환해야 합니다.

g를 값 컨테이너로 하면

그리고나서,

그렇게,

압축풀기

값은 항등함수를 적용하여 추출할 수 있다.

I를 사용하여

그렇게,

계속

사전구현하기 위해 init 함수는 f를 적용하지 않는 Const로 대체됩니다.만족시킬 수 있는 경찰이 필요해

만족스러운 것은 만족합니다.

람다 표현으로 말하면

pred를 정의하는 또 다른 방법

Pred는 쌍을 사용하여 정의할 수도 있습니다.

이는 보다 단순한 정의이지만 pread에 대한 보다 복잡한 표현으로 이어집니다. 이전 \ \ :

나누기

자연수의 나눗셈은 다음과 같이 [5]실시할 수 있다.

n- ( n -m )에는 많은 베타삭감이 필요합니다.손으로 줄이지 않는 한, 이것은 그다지 중요하지 않지만, 이 계산을 두 번 하지 않는 것이 좋습니다.숫자를 테스트하기 위한 가장 간단한 술어는 IsZero이므로 조건을 고려하십시오.

But this condition is equivalent to , not . If this expression is used then the mathematical definition of division given above is translated into function on Church numerals as,

필요에 따라 이 정의에는 m에 대한 단일 콜이 있습니다.단, 이 수식은 (-)/ {\의 값을 나타냅니다.

이 문제는 divide를 호출하기 전에1 ~ n을 추가하는 것으로 해결할 수 있습니다.나눗셈의 정의는 다음과 같습니다.

divide1은 재귀적 정의입니다.Y combinator는 재귀 구현에 사용할 수 있습니다.div by라는 새로운 함수를 만듭니다.

  • 왼쪽에서 divc \ { \ \ }
  • 오른쪽 1 { c

갖기 위해,

그리고나서,

어디에,

주다,

또는 텍스트로서 ,에 \를 사용하고,

나눗셈 = (\n.(\f.\x.x x)(\x.f(x x))(\c.\n.\m.\f).\x.(\n.n(\x.\b.b)(\a.\b.a) d(\f.\x.x) f x)(f(c d m f x))(\m.n(\n.\f).\x.n (\g)\h.h(g f)(\u.x)(\u.u) m) (\n.\f).\x. f (n f x) n)

예를 들어 9/3은 다음과 같이 표시됩니다.

분할(\f)\x.f (f (f (f (f (f (f (f (f (f x)))))))) (\f).\x.f(f(f x))

람다 미적분 계산기를 사용하면 위의 식은 정규 순서를 사용하여 3으로 감소합니다.

\f.\x.f(f(x))

서명된 번호

교회 숫자를 서명된 숫자로 확장하는 간단한 방법 중 하나는 교회 쌍을 사용하는 것입니다. 교회 숫자는 양의 값과 음의 [6]값을 나타냅니다.정수값은 두 교회 숫자의 차이입니다.

자연수는 부호 있는 숫자로 변환됩니다.

부정은 값을 교환함으로써 실행됩니다.

쌍 중 하나가 0일 경우 정수 값이 더 자연스럽게 표시됩니다.OneZero 함수는 이 조건을 충족합니다.

재귀는 Y combinator를 사용하여 구현할 수 있습니다.

플러스 마이너스

덧셈은 수학적으로 쌍으로 정의된다.

마지막 표현은 람다 미적분으로 번역된다.

마찬가지로 뺄셈도 정의되어 있다.

부여,

곱셈과 나눗셈

곱셈은 다음과 같이 정의할 수 있다.

마지막 표현은 람다 미적분으로 번역된다.

나눗셈에 대해서도 같은 정의가 여기에 제시되어 있습니다.단, 이 정의에서는 각 쌍에 1개의 값이 0이어야 합니다(위의 OneZero 참조).divZ 함수를 사용하면 성분이 0인 값을 무시할 수 있습니다.

후 divZ는 곱셈과 동일하지만 다중이 divZ대체되는 공식으로 사용됩니다.

유리수와 실수수

합리적이고 계산 가능한 실수는 람다 미적분에도 부호화될 수 있다.유리번호는 부호화된 번호의 쌍으로 부호화할 수 있습니다.계산 가능한 실수는 실제 값과의 차이가 [7]필요한 만큼 작게 만들어질 수 있는 수만큼 차이가 나는 것을 보장하는 제한 프로세스에 의해 부호화될 수 있습니다.[8] 주어진 참조는 이론적으로 람다 미적분으로 번역될 수 있는 소프트웨어를 기술한다.실수가 정의되면 복소수는 자연스럽게 실수의 쌍으로 부호화됩니다.

위에서 설명한 데이터 유형 및 함수는 모든 데이터 유형 또는 계산이 람다 미적분으로 인코딩될 수 있음을 보여줍니다.이것은 처치튜링 논문입니다.

다른 표현과의 번역

대부분의 현실 언어들은 기계 원어민 정수를 지원합니다; 교회비구치 함수는 음이 아닌 정수와 대응하는 교회 숫자 사이를 변환합니다.함수는 여기 해스켈에서 제공되고 있습니다.\람다 미적분의 of에 해당한다.다른 언어에서도 구현은 비슷합니다.

유형 교회 a = (a -> a) -> a -> a  교회 :: 정수 -> 교회 정수 교회 0 = \f -> \x -> x 교회 n = \f -> \x -> f (교회 (n-1) f x)  언어치 :: 교회 정수 -> 정수 언어치 cn = cn (+ 1) 0 

처치 부울런스

Church Boalans는 True False 부울 값의 Church 인코딩입니다.일부 프로그래밍 언어에서는 Smalltalk와 Pico와 같은 부울 산술의 구현 모델로 사용합니다.

부울 로직은 선택사항으로 간주할 수 있습니다.Church 인코딩(true 및 false)은 다음 두 가지 파라미터의 함수입니다.

  • true는 첫 번째 파라미터를 선택합니다.
  • false는 두 번째 파라미터를 선택합니다.

두 가지 정의는 Church Bohans로 알려져 있습니다.

이 정의를 통해 술어(, 논리값을 반환하는 함수)가 if-clauses로 직접 작용할 수 있다.부울을 반환하는 함수는 두 개의 파라미터에 적용되며 첫 번째 파라미터 또는 두 번째 파라미터 중 하나를 반환합니다.

fredicate-xtrue로 평가되면 then-fredicate로 평가되며, false평가되면 else-fredicate-x가 평가됩니다.

true와 false는 첫 번째 또는 두 번째 파라미터를 선택하기 때문에 논리연산자를 제공하기 위해 조합할 수 있습니다.의 구현에는 여러 가지가 있습니다.

몇 가지 예:

술어

술어는 부울 값을 반환하는 함수입니다.가장 기본적인 술어는 IsZero입니다.인수가 Church 0(\ 0인 경우displaystyle \ 다른 교회 숫자인 경우 false\operatorname {를 반환합니다.

다음 술어는 첫 번째 인수가 두 번째 인수보다 작거나 같은지 여부를 테스트합니다.

\ \ ),

정체성 때문에

동등성을 위한 테스트는 다음과 같이 구현될 수 있다.

교회 쌍

교회 쌍은 쌍(2 태플) 유형의 교회 인코딩입니다.쌍은 함수 인수를 사용하는 함수로 표시됩니다.인수를 지정하면 인수를 쌍의 두 구성 요소에 적용합니다.람다 미적분학의 정의는,

예를들면,

리스트 인코딩

(불변) 리스트는 리스트노드로 구성됩니다.목록의 기본 조작은 다음과 같습니다.

기능. 묘사
제로 빈 목록을 만듭니다.
하지 않다 목록이 비어 있는지 테스트합니다.
단점 지정된 값을 (공백일 가능성이 있음) 목록에 추가합니다.
머리 목록의 첫 번째 요소를 가져옵니다.
꼬리 나머지 명단은 가져오세요.

아래 4가지 목록을 나타냅니다.

  • (빈 목록을 허용하기 위해) 2개의 쌍에서 각 목록노드를 구축합니다.
  • 각 목록 노드를 1쌍에서 구축합니다.
  • 오른쪽 접기 기능을 사용하여 목록을 표시합니다.
  • Scott의 인코딩을 사용하여 목록 표시(match expression의 대소문자를 인수)

목록 노드로 두 쌍 사용

공백이 아닌 목록은 교회 쌍으로 구현할 수 있습니다.

  • 번째는 머리를 포함합니다.
  • 번째는 꼬리를 포함합니다.

그러나 "null" 포인터가 없기 때문에 빈 목록을 나타내는 것은 아닙니다.null을 나타내기 위해 쌍은 다른 쌍으로 래핑되어 빈 값을 제공할 수 있습니다.

  • 첫 번째 - Null 포인터(빈 목록)입니다.
  • 둘째, 첫째는 머리를 포함합니다.
  • 번째, 번째에는 꼬리가 포함됩니다.

이 아이디어를 사용하여 다음과 [9]같이 기본 목록 작업을 정의할 수 있습니다.

표현 묘사
쌍의 첫 번째 요소는 true입니다.이것은 리스트가 늘임을 의미합니다.
null(또는 빈 목록) 표시기를 가져옵니다.
늘이 아닌 리스트노드를 생성하여 헤드h테일t를 지정합니다.
번째. 번째는 머리입니다.
second. second는 꼬리입니다.

제로 노드에서는 헤드 테일이 비어 있지 않은 목록에만 적용되는 경우 second는 액세스되지 않습니다.

목록 노드로 한 쌍 사용

또는 정의한다[10].

여기서 마지막 정의는 일반의 특수한 경우이다.

오른쪽 접기를 사용하여 목록 표시

Church 쌍을 사용한 인코딩의 대안으로 목록을 오른쪽 폴드 함수로 식별하여 인코딩할 수 있습니다.예를 들면, 3개의 요소 x, y, z의 리스트를, 조합기 c에 적용하면, 값 n이 c x(c y(c z n))를 반환하는 상위 함수로 부호화할 수 있다.

이 목록 표현은 시스템 F에서 유형을 지정할 수 있습니다.

Scott 인코딩을 사용하여 목록 표시

대체 표현은 Scott 부호화입니다. Scott 부호화는 연속이라는 개념을 사용하며 더 단순한 [11]코드로 이어질 수 있습니다.('Mogensen-Scott 부호화'도 참조).

이 방법에서는 패턴 매칭 식을 사용하여 목록을 관찰할 수 있다는 사실을 사용합니다.예를 들어 Scala 표기법을 사용하는 경우,listtype 값을 나타냅니다.List리스트가 비어 있는Nil및 컨스트럭터Cons(h, t)우리는 목록을 조사하고 계산할 수 있다.nilCode리스트가 비어 있을 경우consCode(h, t)목록이 비어 있지 않은 경우:

목록. 경기 {   사례. 제로        => 제로 코드   사례. 단점(h, t) => 콘스코드(h,t) } 

'list'는 'nilCode' 및 'consCode'에 대해 어떻게 작용하는지 나타냅니다.따라서 목록을 인수로서 'nilCode' 및 'consCode'를 받아들이는 함수로 정의하므로 위의 패턴 일치 대신 다음과 같이 간단히 쓸 수 있습니다.

nilCode에 대응하는 파라미터를 'n'으로 나타내고 consCode에 대응하는 파라미터를 'c'로 나타냅니다.빈 리스트는 null 인수를 반환하는 리스트입니다.

머리 'h'와 꼬리 't'가 있는 비어 있지 않은 목록은 다음과 같습니다.

보다 일반적으로 m{\ m개의 대안으로 대수적 데이터 유형은 m{\ m개의 매개변수를 함수가 된다. i 컨스트럭터에 인수가 경우 대응하는 부호화 인수가

Scott 부호화는 타입이 없는 람다 미적분으로 할 수 있지만, 타입과 함께 사용하려면 재귀와 타입 다형성을 가진 타입 시스템이 필요합니다.이 표현에서 요소 유형이 E인 리스트는 유형 C의 값을 계산하는 데 사용됩니다. 여기서 '=>'은 함수 유형을 나타냅니다.

유형 목록. =    C =>                    // 인수 없음   (E => 목록. => C) =>     // cons 인수   C                       // 패턴 매칭 결과 

임의 유형을 계산하는 데 사용할 수 있는 목록의 유형은 다음과 같습니다.C. 일반 목록[clarification needed]E또,Etype 인수로 지정합니다.

「 」를 참조해 주세요.

메모들

  1. ^ a b c Trancón y Widemann, Baltasar; Parnas, David Lorge (2008). "Tabular Expressions and Total Functional Programming". Implementation and Application of Functional Languages. 5083: 228–229. doi:10.1007/978-3-540-85373-2_13.
  2. ^ Jansen, Jan Martin; Koopman, Pieter W. M.; Plasmeijer, Marinus J. (2006). "Efficient interpretation by transforming data types and patterns to functions". In Nilsson, Henrik (ed.). Trends in functional programming. Volume 7. Bristol: Intellect. pp. 73–90. CiteSeerX 10.1.1.73.9841. ISBN 978-1-84150-188-8.
  3. ^ "Predecessor and lists are not representable in simply typed lambda calculus". Lambda Calculus and Lambda Calculators. okmij.org.
  4. ^ 이 공식은 f -> m, x -> f를 가진 교회 숫자의 정의입니다.
  5. ^ Allison, Lloyd. "Lambda Calculus Integers".
  6. ^ Bauer, Andrej. "Andrej's answer to a question; "Representing negative and complex numbers using lambda calculus"".
  7. ^ "Exact real arithmetic". Haskell. Archived from the original on 2015-03-26.
  8. ^ Bauer, Andrej. "Real number computational software".
  9. ^ Pierce, Benjamin C. (2002). Types and Programming Languages. MIT Press. p. 500. ISBN 978-0-262-16209-8.
  10. ^ Tromp, John (2007). "14. Binary Lambda Calculus and Combinatory Logic". In Calude, Cristian S (ed.). Randomness And Complexity, From Leibniz To Chaitin. World Scientific. pp. 237–262. ISBN 978-981-4474-39-9.
    PDF 형식:
  11. ^ Jansen, Jan Martin (2013). "Programming in the λ-Calculus: From Church to Scott and Back". In Achten, Peter; Koopman, Pieter W. M. (eds.). The Beauty of Functional Code - Essays Dedicated to Rinus Plasmeijer on the Occasion of His 61st Birthday. Lecture Notes in Computer Science. Vol. 8106. Springer. pp. 168–180. doi:10.1007/978-3-642-40355-2_12.

레퍼런스