11

상호 재귀 함수의 튜플을 생성하기위한 고정 소수점 연결자가 있습니까? 나는. 나는 Y-Combinator와 같은 것을 찾고 있지만 여러 "재귀 적"* 함수를 사용하며 함수의 튜플을 반환 할 것입니까?상호 재귀 함수에 대한 고정 소수점 결합 자?

* : 보통의 Y-Combinator 방식으로 논증으로서 자신과 (형제 자매)를 취하도록 작성 되었기 때문에 실제로 재귀 적이 아닙니다.

답변

8

찾고있는 생물은 Y * 조합 자입니다. this page by oleg-at-okmij.org 근거로

나는 Clojure의에 Y *를 포팅 :

(defn Y* [& fs] 
    (map (fn [f] (f)) 
    ((fn [x] (x x)) 
     (fn [p] 
     (map 
      (fn [f] 
      (fn [] 
       (apply f 
       (map 
        (fn [ff] 
        (fn [& y] (apply (ff) y))) 
        (p p))))) 
      fs))))) 

상호 재귀 함수의 고전적인 예는 그래서 여기에 짝수/홀수 인 예입니다

(let 
    [[even? odd?] 
    (Y* 
    (fn [e o] 
     (fn [n] 
     (or (= 0 n) (o (dec n))))) 
    (fn [e o] 
     (fn [n] 
     (and (not= 0 n) (e (dec n))))) 
    ) 
    ] 
    (do 
    (assert (even? 14)) 
    (assert (odd? 333)) 
    )) 

당신이 할 수있는 충분히 큰 인수를 사용하면 쉽게이 함수를 사용하여 스택을 날려 버릴 수 있으므로 스택을 전혀 소비하지 않는 완전성과 같은 예를 들어 여기에 trampolined 버전이 있습니다 :

Lambder

-)

;

(let 
    [[even? odd?] 
    (Y* 
    (fn [e o] 
     (fn [n] 
     (or (= 0 n) #(o (dec n))))) 
    (fn [e o] 
     (fn [n] 
     (and (not= 0 n) #(e (dec n))))) 
    ) 
    ] 
    (do 
    (assert (trampoline even? 144444)) 
    (assert (trampoline odd? 333333)) 
    )) 

Y * 콤비 내가 지켜봐 주시기 바랍니다, lambder.com 곧 블로그거야있는 모나드 파서, 상호 재귀 정의를 정의하기위한 매우 유용합니다

0

나는 이것에 대해 완전히 확신하지 못합니다. 나는 여전히 공식적인 증명을 찾으려하고있다. 하지만 나에게는 당신이 필요 없다고 생각됩니다. 하스켈에서 , 당신은 같은 경우 :

수정 : (A -> A) - =

주요 {X가하자의 x>은
수정 f는 =하게 X = FX합니다. .. y ...; Y = ... X ...}

X

에서 당신은 FST $ $ \ (X, Y)를 수정 =

주에 주요 다시 작성할 수 있습니다 -> (... y를 .. ., ... x ...)

그러나 내가 말했듯이 나는 이것에 대해 100 % 확실하지 않습니다.

+0

haskell! = λ- 미적분 – eschulte

4

다음 웹 페이지에서는 상호 재귀를위한 고정 소수점 연결자 (다변 고정점 결합 자)에 대해 자세히 설명합니다. 지금까지 가장 간단한 조합을 도출합니다 . http://okmij.org/ftp/Computation/fixed-point-combinators.html#Poly-variadic

는 참조의 편의를 위해, 여기 하스켈 (한 줄)

fix_poly:: [[a]->a] -> [a] 
fix_poly fl = fix (\self -> map ($ self) fl) 
    where fix f = f (fix f) 

여기에 간단한 polyvariadic 콤비입니다 그 것이다 계획, 엄격한 언어

(define (Y* . l) 
    ((lambda (u) (u u)) 
    (lambda (p) 
     (map (lambda (li) (lambda x (apply (apply li (p p)) x))) l)))) 

에서하세요 예제와 더 많은 토론은 웹 페이지를 참조하십시오.

관련 문제