Это удивительно тонкий пример. В первом примере:
(letrec ((f (lambda () (if (eqv? f g) 'both 'f)))
(g (lambda () (if (eqv? f g) 'both 'g))))
(eqv? f g))
Ну, f
и g
отличаются друг от друга по тексту, верно? Так что это должно быть ложным. За исключением того, что, если мы предполагаем , что (eqv? f g)
истинно - мы предполагаем, что f
и g
на самом деле - тогда мы могли бы оптимизировать условные выражения и переписать каждый из f
и g
в:
(letrec ((f (lambda () 'both))
(g (lambda () 'both)))
(eqv? f g))
И теперь мы можем оптимизировать их в одну и ту же функцию, как указано в eqv?
. Таким образом, предположение о том, что функции такие же, как рассмотренные eqv?
, приводит нас к состоянию, в котором они могут быть оптимизированы, чтобы фактически быть эквивалентными при eqv?
.
Во втором примере :
(letrec ((f (lambda () (if (eqv? f g) 'f 'both)))
(g (lambda () (if (eqv? f g) 'g 'both))))
(eqv? f g))
Ну, если мы снова предположим, что f
и g
одинаковы, то мы можем попытаться снова оптимизировать условия:
(letrec ((f (lambda () 'f))
(g (lambda () 'g)))
(eqv? f g))
И это очевидно, ложно. Таким образом, мы не можем предположить, что f
и g
одинаковы. И теперь у нас возникли проблемы, потому что если мы предположим, что они отличаются , то мы могли бы, возможно, оптимизировать их снова ... и теперь они имеют ту же функцию и, возможно, могут быть оптимизированы, чтобы быть такими же под eqv?
... кроме того, что сейчас мы находимся в oop. Таким образом, они должны считаться различными в eqv?
, даже если они могут возвращать одно и то же значение.
Второй пример очень близок к парадоксу лжеца: он ускользает, потому что eqv?
разрешено не знать что две вещи - это одно и то же (для определения «одного и того же», о котором я бы подумал сложнее), даже если они на самом деле таковы.
Личное замечание: хотя я думаю, что эти примеры чрезвычайно умный и тонкий, я бы не стал помещать их в спецификацию c, или, по крайней мере, без очень подробного объяснения того, что системе разрешено или запрещено делать и почему.