Комбинаторное SKI-исчисление (М.Э. Шейнфинкель, начало 1920х) – простая, но очень ёмкая математическая модель вычислительного устройства. Относится к системам правил переписывания, рассмотренным ранее.
Как и любая система правил переписывания, SKI-исчисление постулирует некоторую структуру формул, а также правила преобразования этих формул. Кроме того, поскольку SKI-исчисление не гарантирует, что выражение когда-либо окажется в нормальной форме, существует несколько способов задать порядок преобразований. При этом иногда оказывается интересен не сам результат преобразований, а промежуточные шаги.
Отметим напоследок, что в SKI-исчислении у каждого выражения существует не более одной нормальной формы, поэтому, если целью является её нахождение, иногда удобно бывает изменить порядок вычислений на более удобный.
В SKI-исчислении одна бинарная операции (её будем обозначать * или вообще опускать) и три буквы: S, K, I.
Пример формулы:
S (K S) K I
Её следует читать как
((S*(K*S))*K)*I
Как и в элементарной арифметике, непоставленные скобки прижимаются к левому краю: выражение A B C интерпретируется как (A B) C.
В SKI-исчислении три правила преобразования:
I x → x
K x y → x
S x y z → (x z) (y z)
Покажем, как работает нормализация согласно этим правилам:
S (K S) K I → (K S I) (K I) → S (K I)
Есть два широких класса порядков вычислений (с большим количество разных вариаций): энергичный и ленивый. Основное различие – работа с выражением вида A*B.
Энергичный порядок (или, как ещё говорят, аппликативный) регламентирует следующую процедуру преобразования A*B:
B, получив b.A, получив a.Ленивый порядок отличается от аппликативного отсутствием пункта 1. При дальнейшем рассмотрении SKI-исчисления мы будем использовать т.н. “нормализующий ленивый порядок”. Он очень прост: нужно на каждом шаге применять преобразование к самой левой букве среди тех, к которым можно его применить.
Есть важный (но нетривиально доказываемый) факт: “нормализующий ленивый порядок” приводит выражение к нормальной форме, если она есть.
Рассмотрим две формулы: I и S K K. Они разные! Тем не менее, если “скормить” каждой из них что-нибудь (обозначим это “что-нибудь” x), то в результате нормализации получится одно и то же:
I x → x
S K K x → (K x) (K x) = K x (K x) → x
Такие формулы называются экстенсионально эквивалентными. Почти всегда интересна именно экстенсиональная эквивалентность формул, а не их равенство.
Допустим, что мы хотим найти формулу F, для которой выполнено
F x → ... → G
то есть, F x преобразуется (за некоторое количество преобразований к G).
Алгоритм довольно прост: если G = x, то в качестве F можно взять I. Если G вообще не содержит x, то в качестве F можно взять K G. В противном случае G = A*B и в качестве F можно взять S a b так, чтобы
a x → ... → A
b x → ... → B
Эти две задачи “меньше” исходной. Решив их, мы решаем исходную.
Алгоритм реализации произвольных зависимостей мы проиллюстрируем на примере важнейших формул, которые ещё неоднократно нам встретятся.
Дупликатор D – формула, для которой D x → ... → x x. Согласно алгоритму, в качестве D можно взять S a b, где
a x → ... → x
b x → ... → x
Согласно тому же алгоритму, можно взять a = I и b = I. Итог: D = S I I.
Транспозиция T – формула, для которой T x y → ... → y x. Получение формулы для этой зависимости состоит из двух частей: сначала получим формулу, в которую можно преобразовать T x, а затем уже получим T.
Применяя алгоритм, получаем T x → ... → S a b, где
a y → ... → y
b y → ... → x
Берём a = I и b = K x. Осталось реализовать зависимость T x → ... → S I (K x).
Нужно взять T = S a b, где
a x → ... → S I
b x → ... → K x
В качестве a можно взять K (S I), а в качестве b – просто K (хотя алгоритм предписывает брать S (K K) I). Итог: T = S (K (S I)) K.
Композиция B – формула, для которой B f g x → ... → f (g x). Согласно алгоритму, B f g → ... → S (K f) g. Далее можно заметить, что достаточно релаизовать зависимость B f → ... → S (K f). Соответственно, B = S (K S) K.
Появится позже…
@ 2016 arbrk1, all rights reversed