2011-01-21 3 views
3

다음 Prolog 코드를 직면하고 있습니다. [X] >> Y 표현식은 람다 식 λ X.Y에 대해 입니다. 이 코드는 람다 을 제거하고 S를 통해 조합 적 표현을 제공, K와 나는 :SKI 변환, 함수 언어로 프로그래밍하는 방법

?- convert([X]>>([Y]>>apply(Y,X)),R). 
R = apply(apply('S', apply(apply('S', apply('K', 'S')), 
    apply('K', 'I'))), apply(apply('S', apply('K', 'K')), 'I')) 

은 가정하자 나도 같은 변환 코드 싶습니다 : 여기

convert([X]>>Y,'I') :- X==Y, !. convert([X]>>Y,apply('K',Y)) :- var(Y), !. convert([X]>>([Y]>>Z),R) :- convert([Y]>>Z,H), convert([X]>>H,R). convert([X]>>apply(Y,Z),apply(apply('S',S),T)) :- convert([X]>>Y,S), convert([X]>>Z,T). convert([_]>>Y,apply('K',Y)). 

어떻게 작동하는지 예입니다 Haskell, ML 또는 에있는
등. 어떻게해야합니까? 함수 프로그래밍 언어에서 직접 사용할 수있는 λ 식을 으로 사용할 수 있습니까? 아니면 일부 메타 프로그래밍 시설에 회귀해야합니까?

안부

P.S : 위의 코드는 매우 짧은 스키 표현에 이르게 SKI 변환되지 않습니다. 의 발생을 람다 식 본문의 바운드 변수로 검사하는 더 나은 코드가 가능합니다.

+1

이 질문을 게시 한 후 다음과 같은 흥미로운 문서를 발견했습니다. http://www.stanford.edu/class/cs242/readings /backus.pdf. 나는 전환의 목적을 위해 FFP (정식 기능 언어)가 필요하다고 결론을 내린다. 그래서 진짜 FFP가 일어서기를 바랍니다! –

+1

지금까지의 답변과 의견에서, 하스켈은 ML이 완벽하게 FFP를 통합하지 않는다고 결론을 내립니다. 그리고 다른 한편으로는 Lisp, Scheme, etc.은 FFP를 완벽하게 통합합니다. 이음매없는 FFP가있을 때 Lisp와 비슷하다고 말할 수 있습니까? 아니면 세 번째 옵션이 있습니까? –

답변

4

귀하의 프롤로그 코드는 거의 그대로 ML 또는 하스켈의 패턴 일치로 변환 될 수 있습니다. 물론 람다 식에 대해 자체 ADT를 정의해야합니다. 그리고 가장 최적의 조합기 및 전환 세트에 대해서는 다음을 참조하십시오. http://www.amazon.com/Functional-Programming-International-Computer-Science/dp/0201192497

+2

호스트 언어의 표현식을 변환하려면 메타 프로그래밍 기능이 필요합니다. 예를 들어 템플릿 하스켈에서는 AST에 액세스 할 수 있지만 복잡한 변형을 구현할 것으로 기대합니다. 하스켈은 단순한 형식화되지 않은 람다 계산법보다 훨씬 복잡합니다. –

+0

@Jan Burse, 내가 언급 한 책은 기능적 언어를위한 컴파일 기술에 대해 구체적으로 말했고, 결합기 기반 구현에 대한 전체 장이 있습니다. –

+0

그런 변환을하는 적어도 하나의 리스프와 같은 언어가 있습니다 : http://sourceforge.net/projects/dslengine/ –

1

직접 lamdba 식을 사용할 수 있습니다. 하스켈에서 :;

i x = x 
k x = \y -> x 
s x y z = x z $ y z 

r = s (s (k s) (k i)) (s (k k) i) 

-- r 3 (+5) -> 8 

(작동하지만 바로 개념인지 확인합니까 내가 알고까지 스키 몰랐다 있습니다,이 조각은 하스켈에 위키 백과에 정의의 직접 변환입니다)

+1

@abesto : S, K 및 I의 정의를 게시하고 제공된 변환 예가 올바른지 확인해 주셔서 감사합니다. 하지만 다음과 같은 프로그램을보고 싶습니다 : Input \ x -> \ y -> y x, Output : s (s (k)) (s (k k) i) –

+0

Oh. 내가 그때 당신 질문의 요점을 놓친 것 같네요, 미안 해요. – abesto

+1

BTW : 연산자 $는 무엇을하고 있습니까? 이게 올빼미 야? 괄호를 저장하는 데 사용 했습니까? –