To jest częściowa odpowiedź: nie mam pojęcia, do jakich błędów lub osób odnosi się SICP. Mogę jedynie podać kilka wskazówek na temat tego, dlaczego zmiana nazwy zmiennej może być bolesna w precyzyjnej obsłudze.
Po pierwsze, wydaje się to banalne. Na przykład możemy zmienić nazwę powiązanych zmiennych w indeksowanych sumach
∑xe=∑y(e{y/x})
gdzie jest dowolnym wyrażeniem, a oznacza składniowe zastąpienie każdego przez . Trywialne, prawda?ee{y/x}xy
Cóż, jeśli ślepo zastosujemy powyższą zasadę, otrzymamy
∑x(x+y)=∑y(y+y)
To nie jest dobrze. Musimy dodać wymaganie „ nie występuje we ”, inaczej otrzymamy konflikt nazw.ye
Teraz rozważ tę poprawną nazwę
∑x∑y(x+y)=∑x∑z(x+z)
jeśli chcemy zmienić nazwę na , zgodnie z powyższą regułą możemy to zrobić po prawej stronie, ale nie po lewej stronie. Jest to niewygodne, ponieważ oba różnią się jedynie zmianą nazwy, dlatego należy postępować w ten sam sposób.xy
Typowym podejściem tutaj jest uciekanie się do przedefiniowania jako „podstawienie unikające przechwytywania” i złagodzenie wymogu „ nie występuje we ” i zamiast tego należy użyć „ nie występuje za darmo we ”.e{y/x}yeye
Następnie definiujemy wystąpienia bezpłatne:
free(x)={x}free(e+t)=free(e)∪free(t)free(∑xe)=free(e)∖{x}
Wreszcie, przechwyć unikając zamiany:
- x{t/y} to jeśli , a przeciwnym razie.tx=yx
- (e+e′){t/y}=e{t/y}+e′{t/y} (łatwy przypadek)
- (∑xe){t/y}=??
Ostatni przypadek jest bolesny. Jeśli , podstawienie nie jest op, ponieważ chcemy, aby wpłynęło tylko na wolne zmienne, a jest powiązane. Zatem wynikiem jest po prostu .x=yx∑xe
Jeśli , chcielibyśmy powiedzieć, że . Zasadniczo jest to jednak błędne, ponieważ jeśli występuje za darmo , otrzymujemy przechwytywanie.y≠x(∑xe){t/y}=∑x(e{t/y})xt
Westchnienie. Zatem pozwalamy, by była „pierwszą” zmienną, która wynosi 1) nie , 2) nie jest wolna w , i 3) nie jest wolna w . Tutaj „pierwszy” oznacza, że musimy uporządkować zestaw nazw zmiennych (np. Wybierając bijection między nazwami a naturali). Następnie w końcu pozwalamy
.zyt∑xe(∑xe){t/y}=∑z(e{z/x}{t/y})
Mam nadzieję, że dobrze to zrozumiałem. (Nawiasem mówiąc, moja pierwsza próba była błędna)
Niektórzy autorzy rozważają więcej przypadków, ale wynik jest taki sam „do zmiany nazwy”. Wybór „pierwszego” nie ma tak naprawdę znaczenia powyżej: każde takie działałoby dobrze i prowadziło do tego samego rezultatu (ponownie, aż do zmiany nazwy).zz
Wreszcie mamy dźwiękową definicję zmiany nazwy ( -conversion) i unikania przechwytywania podstawienia wolnej zmiennej. Powyżej rozważałem sumy, ale odnoszą się one do wszystkich segregatorów (np. w rachunku lambda, definicje funkcji w wielu PL itp.).αλx
Teraz wyobraź sobie, że musisz sobie radzić z tą skomplikowaną definicją za każdym razem, gdy chcemy udowodnić coś w teorii PL. Moglibyśmy, ale nie chcemy. Jest nudny, żmudny, podatny na błędy, zaśmieca dowód i nie zapewnia czytelnikowi wglądu. Z tego powodu wielu autorów PL po prostu pomija szczegóły, mówiąc (lub nawet przyjmując za pewnik!), Że terminy należy przyjmować „aż do zmiany nazwy”, że wszystkie powiązane zmienne są przyjmowane odrębnie od wszystkiego, od czego muszą się różnić, że zakładamy „konwencję Barendregta” lub coś w tym samym kierunku.
Szczerze mówiąc, jest to oszustwo w dowodach. Możemy również dodać „mrugnięcie, mrugnięcie, szturchnięcie, nie mów nic więcej!” w tym samym duchu. Zasadniczo prosimy o litość i mówimy czytelnikowi: „słuchaj, to jest nudne, nie chcę tego robić, nie chcesz go czytać - oboje wiemy, że przy ogromnym wysiłku możemy przepisać ten dowód na uwzględnij wszystkie szczegóły ”.
Technicznie rzecz biorąc, to jest możliwe, aby wykorzystać ten skrót, aby udowodnić fałszywe oświadczenie. Doświadczony recenzent dowodu wie jednak, co jest „moralnie w porządku” i może udoskonalić (z wielkim wysiłkiem), a co podejrzane. Ta ostatnia może zawierać coś, co zależy od faktycznego wyboru powiązanych nazw (więc tak naprawdę nie pracujemy zgodnie z obietnicą!). W takich przypadkach recenzent poprosi o więcej szczegółów, aby przekonać go.