람다 미적분 생성기


10

이 질문을 할 다른 곳을 모르겠습니다. 이곳이 좋기를 바랍니다.

람다 미적분 생성기를 만드는 것이 가능한지 궁금합니다. 본질적으로 무한 시간이 주어진 루프는 가능한 모든 람다 미적분 함수를 생성합니다. (문자열 형태로).

람다 미적분학이 너무 단순하여 표기법에 몇 가지 요소 만 있으면 가장 간단한 조합으로 시작하여 해당 표기법 요소의 모든 가능한 조합을 생성하여 가능한 모든 람다를 생성하는 것이 가능할 수도 있다고 생각했습니다. 미적분 함수.

물론 람다 미적분학에 대해서는 거의 알지 못하므로 이것이 실제로 가능한지 전혀 모릅니다.

그렇습니까? 그렇다면, 내가 상상했던 것처럼 아주 간단합니까, 아니면 기술적으로 가능하지만 실제로 불가능하기 때문에 어렵습니까?

추신. 나는 베타 감소 기능에 대해 말하는 것이 아니라 모든 람다 미적분학 함수의 모든 유효한 표기법에 대해서만 이야기하고 있습니다.

답변:


19

물론 이것은 표준 인코딩 연습입니다.

우선, 쌍을 이룬 계산 함수 (pairing function)라고합니다. 표준 선택은p:N2N

p(n,m)=(n+m)(n+m+1)2+n

우리 는 이것이 bijection임을 증명할 수 있으므로 자연 주어지면 되도록 계산할 수 있습니다 .n , m p ( n , m ) = kkn,mp(n,m)=k

람다 용어를 열거하려면 변수 이름의 열거를 수정하십시오 .x0,x1,x2,

그런 다음 각 자연수 에 대해 다음과 같이 재귀 적으로 정의 된 인쇄하십시오 .L m의 B의 d 개의 ( I )ilambda(i)

  • 만약 짝수,하자 가변 반환j = i / 2 x jij=i/2xj
  • 만약 홀수,하자j = ( i 1 ) / 2ij=(i1)/2
    • 만약 짝수,하자 찾아 되도록 ; 컴퓨팅 ; 반품 신청서k = j / 2 n , m p ( n , m ) = k N = l a m b d a ( n ) , M = l a m b d a ( m ) ( N M )jk=j/2n,mp(n,m)=kN=lambda(n),M=lambda(m)(NM)
    • 만약 홀수이다하자 찾아 이되도록 ; 계산 ; 추상화 반환k = ( j 1 ) / 2 n , m p ( n , m ) = k M = l a m b d a ( m ) ( λ x n . M )jk=(j1)/2n,mp(n,m)=kM=lambda(m)(λxn. M)

이 프로그램은 모든 람다 용어 집합을 포함하는 다음 "대수"궤적에 의해 정당화됩니다 .Λ

ΛN+(Λ2+N×Λ)

"구문 적으로 람다 용어"는 1) 변수 (자연으로 표시됨), 2) 응용 프로그램 (2 개의 람다 용어로 작성) 및 3) 추상화 (쌍 변수 / 자연 + 람다 용어의 결합 된 결합입니다. ) "

이를 감안할 때, 우리 는 위의 알고리즘을 얻기 위해 계산 가능한 bijections ( ) 및 (표준 짝수 / 홀수)을 재귀 적으로 적용 합니다.N2NpN+NN

이 절차는 일반적이며 문맥이없는 문법을 통해 생성 된 거의 모든 언어에서 작동하며 위와 비슷한 동 형사상을 제공합니다.


와, 고마워, 이것이 의사 코드임을 나타낼 수 있습니까? cs 학위가 없어서 더 잘 이해할 것입니다.
합법적 스택

3
@LegitStack 글쎄, 위의 의사 코드는 다음과 같습니다 . 재귀 함수 정의한 다음을 사용할 수 있습니다 . 사소한 유일한 단계는 와 같은 찾는 것입니다 . 이것은 모든 쌍 을 시도하여 수행 할 수 있습니다 (더 빠른 알고리즘도 존재)lambda(n)if n%2==0 ...n,mp(n,m)=kn,mn,mk
chi

1
실제로 Wikipedia에 따르면이 특정 페어링 기능의 역은 . a=12(8k+11),b=12a(a+1),n=bk,m=an
LegionMammal978

12

예. 가능한 모든 ASCII 문자열을 열거하는 것을 취하십시오. 각 출력에 대해 함수를 정의하는 유효한 람다 미적분 구문인지 확인하십시오. 그렇지 않으면 건너 뛰십시오. (이 검사를 수행 할 수 있습니다.) 모든 람다 미적분 함수를 열거합니다.


5
본질적으로, 이와 같은 모든 문제는 타이핑 원숭이를 불러서 해결됩니다 ...
xuq01

5
또는 람다 미적분학 용어를 직접 열거 할 수 있습니다. 모든 출력이 올바른 형식의 용어이므로 임의의 문자열보다 훨씬 빠릅니다. 타이핑 원숭이를 셰익스피어 플레이 제너레이터로 바꾸는 것과 같습니다.
Dan D.

11

언급했듯이, 이것은 문맥 자유 언어의 용어를 열거하기 때문에 가능합니다. 그러나 그 뒤에는 재미있는 조합론 분야로 들어가는 더 흥미로운 수학이 있습니다.

용지 바이너리 람다 계산법에서 계수 및 생성 조건은 훨씬 더 열거 문제의 치료를 포함합니다. 일을 더 간단하게하기 위해, De Bruijn 인덱스를 사용하는 람다 용어를 인코딩하는 바이너리 람다 calulus 라는 것을 사용 하므로 변수의 이름을 지정할 필요가 없습니다.

이 문서에는 생성 알고리즘을 구현하는 구체적인 Haskell 코드도 포함되어 있습니다. 확실히 가능합니다.

Julia에서 그들의 접근 방식을 구현 한 적이 있습니다 .


7

확실한. 람다 용어의 정의에 따라 직접 생성 할 수 있습니다.

Haskell에서는 먼저 데이터 유형을 정의합니다.

data LC a  =  Var  a                -- Constructor <type> <type> ...
           |  App (LC a) (LC a)     --
           |  Lam  a     (LC a)     --  ... alternatives ...

instance Show a => Show (LC a)      -- `LC a` is in Show if `a` is in Show, and
  where
    show (Var i)    =  [c | c <- show i, c /= '\'']
    show (App m n)  =  "("  ++ show m       ++ " " ++ show n ++ ")"
    show (Lam v b)  =  "(^" ++ show (Var v) ++ "." ++ show b ++ ")"

그리고 fair (er) join를 사용하여

lambda :: [a] -> [LC a]
lambda vars  =  terms 
  where
  terms  =  fjoin [ map Var vars ,
                    fjoin [ [App t s | t <- terms] | s <- terms ] ,
                    fjoin [ [Lam v s | v <- vars ] | s <- terms ] ]

  fjoin :: [[a]] -> [a]
  fjoin xs  =  go [] xs             -- fairer join
      where 
      go [] []  =  []
      go a  b   =  reverse (concatMap (take 1) a) ++ go 
                       (take 1 b ++ [t | (_:t) <- a]) (drop 1 b)

우리는 예를 들어 그것들을 열거합니다.

> take 20 $ lambda "xyz"
[x,y,(x x),z,(y x),(^x.x),(x y),(^y.x),((x x) x),(^x.y),(y y),(^z.x),(x (x x)),
 (^y.y),(z x),(^x.(x x)),((x x) y),(^z.y),(y (x x)),(^y.(x x))]

> take 5 $ drop 960 $ lambda "xyz"
[(((x x) y) (z x)),(^y.(^x.((x x) (x x)))),((^x.(x x)) (^x.(x x))),(^x.((^z.x) 
 y)),((z x) ((x x) y))]

보세요, 유명한 용어는 위에서 아래로 멀지 않습니다!Ω=(λx.xx)(λx.xx)

fjoin에 해당 모나드 오메가diagonal.


0

https://www.browserling.com/tools/text-from-regex 정규식에서 샘플 문자열을 생성 할 수있는 하나의 도구를 온라인으로 보았습니다 . 다음과 같이 입력하면 많은 샘플 람다 항을 생성 할 수 있습니다.

(\( (lambda \w\. )* \w+ \))* 

물론 임의의 중첩 수준을 가진 용어를 얻으려면 정규식보다 언어를 정의하기위한보다 설명적인 도구 인 문맥없는 문법을 사용해야합니다. 문맥없는 문법 정의를 기반으로 샘플 언어 문장을 생성하는 기존 도구를 찾지 못했지만 작성할 수 없었습니다.


2
(당신이주의로) -terms 정규 표현식 없습니다. 초보자의 질문에 이런 식으로 대답하는 것은 중요하지 않습니다 (즉, 문맥이없는 문법과 정규식 사이에). λ
Andrej Bauer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.