Я сталкиваюсь со следующим кодом Пролога. Выражение [X] >> Y стоит
для лямбда-выражения лямбда X.Y. Код устраняет лямбду
и дает комбинаторное выражение над 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 или
подобное, аналогичное, похожее. Как я могу это сделать? Могу ли я использовать доступные лямбда-выражения
в функциональном языке программирования напрямую? Или я должен
регресс к мета-программам?
С наилучшими пожеланиями
P.S .: Приведенный выше код не является преобразованием SKI, которое приводит к очень короткому
Лыжные выражения. Возможен лучший код, который проверяет наличие
связанная переменная в теле лямбда-выражения.