私は次のPrologコードに直面しています。式[X]>>Yは、ラムダ式lambda XYを表します。コードはラムダを削除し、S、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)).
仕組みの例を次に示します。
?- 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'))
HaskellやMLなどで同じ変換をコーディングしたいとします。これどうやってするの?関数型プログラミング言語で利用可能なラムダ式を直接使用できますか?または、いくつかのメタプログラミング機能に回帰する必要がありますか?
よろしくお願いします
PS:上記のコードは、非常に短いSKI式につながるSKI変換ではありません。ラムダ式本体でバインドされた変数の出現をチェックするより良いコードが可能です。