У меня вопрос по поводу SKI-Combinators.
Можно ли выразить XOR (исключающее или) только с помощью комбинаторов S
и K
?
У меня есть
True = Cancel
False = (Swap Cancel)
куда
Cancel x y = K x y = x
Swap: ff x y = S ff x y = ff y x
У меня вопрос по поводу SKI-Combinators.
Можно ли выразить XOR (исключающее или) только с помощью комбинаторов S
и K
?
У меня есть
True = Cancel
False = (Swap Cancel)
куда
Cancel x y = K x y = x
Swap: ff x y = S ff x y = ff y x
Булевы значения
Ваш вопрос немного неясен в деталях, но кажется, что вы имеете в виду, что у вас есть следующее представление логических значений:
T := K
F := S K
Это работает, потому что это означает, что выполняются следующие сокращения:
T t e => t
F t e => e
другими словами, b t e
можно интерпретировать как IF b THEN t ELSE e
.
Исключающее ИЛИ с точки зрения IF _ THEN _ ELSE _
Итак, учитывая эту структуру, как мы реализуем XOR? Мы можем сформулировать XOR как выражение IF
:
xor x y := IF x THEN (not y) ELSE y = (IF x THEN not ELSE id) y
который может быть эта-сведен к
XOR x := IF x THEN not ELSE id = x not id
Некоторые комбинаторы функций
У нас стандартно id = SKK
, а not
может быть выражено как flip
, так как flip b t e = b e t = IF b THEN e ELSE t = IF (not b) THEN t ELSE e
. flip
само по себе довольно сложно, но выполнимо как
flip := S (S (K (S (KS) K)) S) (KK)
Теперь нам просто нужно найти способ написать функцию, которая берет x
и применяет его к двум терминам NOT
и ID
. Чтобы добраться туда, мы сначала заметим, что если мы установим
app := id
тогда
app f x = (id f) x = f x
так что,
(flip app) x f = f x
Мы почти у цели, так как пока все показывает, что
((flip app) id) ((flip app) not x) = ((flip app) not x) id = (x not) id = x not id
Последний шаг — сделать последнюю линию без точек на x
. Мы можем сделать это с помощью оператора композиции функций:
((flip app) id) ((flip app) not x) = compose ((flip app) id) ((flip app) not) x
где требование на compose
заключается в том, что
compose f g x = f (g x)
который мы можем получить, установив
compose f g := S (K f) g
Собираем все вместе
Подводя итог, мы получили
xor := compose ((flip app) id) ((flip app) not)
или, полностью расширенный:
xor = S (K ((flip app) id)) ((flip app) not)
= S (K ((flip app) (SKK))) ((flip app) flip)
= S (K ((flip SKK) (SKK))) ((flip SKK) flip)
= S (K (((S (S (K (S (KS) K)) S) (KK)) SKK) (SKK))) (((S (S (K (S (KS) K)) S) (KK)) SKK) (S (S (K (S (KS) K)) S) (KK)))
I
можно представить какS K K
. Итак, если вы можете выразитьNOR
с помощьюSKI
, вы можете сделать это и с помощьюSK
. - person Anton Trunov   schedule 09.05.2016NOR = (... some expression ...)
: (1)NOR
не может быть выражено как постфиксный оператор (какAND
) - чтобы увидеть это, обратите внимание, чтоT T NOR = T
, независимо от того, что такоеNOR
(но должно бытьF
); (2)NOR
не может быть выражен как инфиксный оператор --F NOR F = F
(но должен бытьT
) - person Anton Trunov   schedule 10.05.2016