1

У меня возникли проблемы с преобразованием лямбды для переключения в комбинаторы SKI (надеюсь, это имеет смысл). Вот мое преобразование:конвертировать флип-лямбда в термины SKI

/fxy.fyx 
/f./x./y.fyx 
/f./x.S (/y.fy) (/y.x) 
/f./x.S f (/y.x) 
/f./x.S f (K x) 
/f.S (/x.S f) (/x.K x) 
/f.S (/x.S f) K 
/f.S (S (/x.S) (/x.f)) K 
/f.S (S (K S) (K f)) K 
S (/f.S (S (K S) (K f))) (/f.K) 
S (/f.S (S (K S) (K f))) (K K) 
S (S (/f.S) (/f.S (K S) (K f))) (K K) 
S (S (K S) (/f.S (K S) (K f))) (K K) 
S (S (K S) (S (/f.S (K S)) (/f.K f))) (K K) 
S (S (K S) (S (/f.S (K S)) K)) (K K) 
S (S (K S) (S (S (/f.S) (/f.K S)) K)) (K K) 
S (S (K S) (S (S (K S) (/f.K S)) K)) (K K) 
S (S (K S) (S (S (K S) (S (/f.K) (/f.S))) K)) (K K) 
S (S (K S) (S (S (K S) (S (K K) (K S))) K)) (K K) 

Если я правильно понимаю, в B, C, K, система W, C является флипом, и это определение в терминах лыжи S (S (K (S (K S) K)) S) (K K). Очевидно, что мой ответ не то же самое, как C комбинатора ... Вот правила, которые я использовал для преобразования:

K y = /x.y - K combinator 
(SKK) = /x.x - I combinator 
(S (/x.f) (/x.g)) = (/x.fg) - S combinator 
y = (/x.yx) - eta reduction 
/x./y.f = /xy.f - currying 
Note that the S rule can convert longer expressions - for example, λ x.abcdeg can be converted by setting f = abcde. 

Что мне не хватает?

ответ

3

Как только ответ был принят, я пересмотрел его, и я понял, что это на самом деле неправильно.

Ваш окончательный результат верен, хотя это не является «официальным» ответом в учебнике, но, возможно, разные термины SKI на самом деле эквивалентны одному и тому же выражению лямбда.

S [S (K S) (S (S (K S) (S (K K) (K S))) K)] [K K] f x y 
-> S (K S) (S (S (K S) (S (K K) (K S))) K) f (K K f) x y 
-> K S f (S (S (K S) (S (K K) (K S))) K f) (K K f) x y 
-> S [S (S (K S) (S (K K) (K S))) K f] (K K f) x y 
-> S [S (K S) (S (K K) (K S))] K f x (K K f x) y 
-> S [K S] [S (K K) (K S)] f (K f) x (K K f x) y 
-> K S f (S (K K) (K S) f) (K f) x (K K f x) y 
-> S [S (K K) (K S) f] [K f] x (K K f x) y 
-> S [K K] [K S] f x (K f x) (K K f x) y 
-> K K f (K S f) x (K f x) (K K f x) y 
-> K (K S f) x (K f x) (K K f x) y 
-> K S f (K f x) (K K f x) y 
-> S [K f x] [K K f x] y 
-> K f x y (K K f x y) 
-> f y (K K f x y) 
-> f y (K x y) 
-> f y x 

Вышеприведенный вывод, основанный на самом большем порядке восстановления, доказывает, что ваш окончательный термин эквивалентен комбинатору C.