Комбинаторное 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