@ melpomene указывает на то, что этот вопрос не может быть решен без конкретной реализации (например, для кортежей). Я собираюсь предположить , что ваш кортеж реализован как:
T = λabcf.f a b c
Или, если вы предпочитаете не-стенографию:
T = (λa.(λb.(λc.(λf.f a b c))))
То есть функция, которая закрывает a
, b
и c
и ожидает, пока функция f
не передаст эти переменные.
Если это имеет в виду реализацию и предполагается, что используются обычные церковные цифры, то указанная вами функция:
P(g, h, i) ->* (h, i, i+1)
Необходимо:
- взять тройку (с уже примененными
a
, b
и c
)
- построить новую тройку, с
- второе значение старой тройки
- третье значение старой тройки
-
succ
третьего значения старой тройки
Вот такая функция P
:
P = λt.t (λghi.T h i (succ i))
Или еще раз, если вы предпочитаете не сокращенную запись:
P = (λt.t(λg.(λh.(λi.T h i (succ i)))))
Это можно частично очистить с помощью некоторых вспомогательных функций:
SND = λt.t (λabc.b)
TRD = λt.t (λabc.c)
В этом случае мы можем написать P
как:
P = λt.T (SND t) (TRD t) (succ (TRD t))