Это частичный ответ: я понятия не имею, о каких ошибках или людях ссылается SICP. Я могу лишь дать некоторые подсказки о том, «почему» переименование переменной может быть болезненным для точной обработки.
Прежде всего, это кажется тривиальным для определения. Например, мы можем переименовать связанные переменные в индексированных суммах
∑xe=∑y(e{y/x})
где e - любое выражение, а e{y/x} обозначает синтаксическую замену каждого x на y . Тривиально, правда?
Ну, если мы слепо применяем правило выше, мы получаем
∑x(x+y)=∑y(y+y)
Это не хорошо. Нам нужно добавить требование « y не встречается в e », или мы получим конфликт имен.
Теперь рассмотрим это правильное переименование
∑x∑y(x+y)=∑x∑z(x+z)
если мы хотим переименовать x в y , по вышеупомянутому правилу мы можем сделать это с правой стороны, но не с левой стороны. Это неудобно, поскольку они отличаются только переименованием, поэтому они должны обрабатываться одинаково.
Типичный подход здесь - прибегнуть к переопределению e{y/x} как «замены, избегающей захвата», и ослабить требование »y не встречается вe » и использовать вместо него «y не встречаетсясвободновe ».
Затем мы определяем бесплатные вхождения:
free(x)={x}free(e+t)=free(e)∪free(t)free(∑xe)=free(e)∖{x}
Наконец, захват, избегающий замены:
- x{t/y} являетсяt еслиx=y , иx противном случае.
- (e+e′){t/y}=e{t/y}+e′{t/y} (простой случай)
- (∑xe){t/y}=??
Последний случай болезненный. Если x=y , подстановка запрещена, так как мы хотим, чтобы она влияла только на свободные переменные, а x связан. Таким образом, результат просто ∑xe .
Если y≠x , мы хотели бы сказать, что (∑xe){t/y}=∑x(e{t/y}) . Это, однако, в общем случае неверно, так как если x появляется свободным в t мы получаем перехват.
Вздох. Итак, мы допустим, чтобы z была «первой» переменной, которая 1) не y , 2) не свободна в t и 3) не свободна в ∑xe . Здесь «первый» означает, что нам нужно упорядочить набор имен переменных (например, выбрав биекцию между именами и натуральными числами). Затем, наконец, пусть
(∑xe){t/y}=∑z(e{z/x}{t/y}) .
Надеюсь, я понял это правильно. (Кстати, моя первая попытка была ошибочной)
zz
αλx
Теперь представьте, что приходится иметь дело с этим сложным определением каждый раз, когда мы хотим доказать что-то в теории PL. Мы могли бы, но мы не хотим. Это скучно, утомительно, подвержено ошибкам, загромождает доказательства и не дает читателю понимания. По этой причине многие авторы PL просто пропускают детали, говоря (или даже принимая как должное!), Что термины должны приниматься «вплоть до переименования переменных», что все связанные переменные предполагаются отличными от того, от чего они должны отличаться, что мы принимаем «конвенцию Барендрегта», или что-то в том же духе.
Честно говоря, это обман в доказательствах. Мы могли бы также добавить «подмигнуть, подтолкнуть, сказать больше!» в том же духе. По сути, мы просим пощады и говорим читателю: «Смотри, это скучно, я не хочу это делать, ты не хочешь читать это - мы оба знаем, что, приложив огромные усилия, мы могли бы переписать это доказательство, чтобы включить все детали ".
Технически это это можно использовать этот ярлык , чтобы доказать ложное утверждение. Опытный рецензент, однако, знает, что "морально хорошо" и что можно сделать идеальным (с большими усилиями), а что подозрительно. Последнее может включать в себя что-то, что зависит от фактического выбора связанных имен (поэтому мы не работаем "до", как обещали!). В этих случаях рецензия запросит более подробную информацию, чтобы его можно было убедить.