Dlaczego stan pozostaje niezmieniony w niewielkiej semantyce operacyjnej pętli while?

9

Zwykle widzę, że w strukturalnej reprezentacji operacyjnej semantyki dla pętli while stan programu nie zmienia się:

(whileBdoS,σ)(ifBthenS;(whileBdoS)elseSKIP,σ)

Dla mnie nie jest to intuicyjne, jeśli stan się nie zmieni (tzn. Stan pamięci pozostanie taki sam), wówczas pozostanie prawdą, a program nigdy się nie zakończy.B

Czy ktoś może wyjaśnić, dlaczego stan nie zmienia się w tej regule?

El Marce
źródło
Zauważ, że jest to poprawne tylko wtedy, gdy możemy założyć, że B nie ma skutków ubocznych. Nie dotyczy to większości języków programowania.
Raphael

Odpowiedzi:

10

W semantyce języka programowania pojęcie stanu programu nie jest niejasnym pojęciem filozoficznym, ale bardzo precyzyjnym pojęciem matematycznym. Stanu w tym małym kroku semantyki operacyjnych jest częściowo funkcjąs

s:VarZ

która rejestruje wartości zmiennych. Więc jeśli , to zmienna ma wartość . Stan jest koniecznie funkcją częściową, ponieważ sensowne jest jedynie rejestrowanie wartości zmiennych, które faktycznie występują.sx=vxv

Rozwijający się aksjomat

whilebdoS,sifbthenS;whilebdoSelse skip,s

po prostu mówi nam, że rozwijamy pętlę while w instrukcji warunkowej, której jedna gałąź zawiera pętlę. Z tego powodu żadne zmienne nie zmienią swojej wartości iz tego powodu stan się nie zmienia.

Hans Hüttel
źródło
10

Stan może się zmieniać w kolejnych krokach redukcji, ponieważ po prawej stronie

while B do S,σif B then (S; while B do S) else skip,σ

-loop jest chroniony (poprzedza) przez . Obliczenie może zmienić stan, aby warunek mógł zostać oceniony na .whileSSBfalse

Martin Berger
źródło
Oznacza to zatem, że zmianę stanu należy wyrazić w innych regułach, do których S można potencjalnie ograniczyć w konkretnym programie?
El Marce
@ElMarce Tak. Sugeruję przejść przez prosty przykład, np. i zobaczyć, jak to działa. x:=2; while x>0 do x:=x1
Martin Berger
9

Stan nie zmienia się, gdy weźmiemy pod uwagę, , aby zdecydować, czy do wykonywania jednej iteracji pętli, ale można to zmienić później , kiedy uruchomić ciała . Tak więc następnym razem, gdy rozważymy , może nastąpić zmiana .σBSBσ

Andrej Bauer
źródło
Wyjaśnienie to, choć zasadniczo poprawne, nie odnosi się do tego, jakie stany są (mianowicie funkcja, która mówi nam o wartościach zmiennych) i co oznacza zmiana stanu (mianowicie, że zmienia się wartość co najmniej jednej zmiennej).
Hans Hüttel
Rzeczywiście, nie ma znaczenia, jakie są stany i jak są one wdrażane na potrzeby mojej odpowiedzi. Wyjaśnienie to obowiązuje. Co więcej, błędem jest twierdzenie, że „stany są naprawdę funkcjami”, ponieważ jest to tylko jeden sposób na ich matematyczne modelowanie. Istnieją inne możliwe modele. I nie pomylmy modeli matematycznych z działaniem sprzętu.
Andrej Bauer,
Pytanie dotyczy jednak konkretnej semantyki operacyjnej na małą skalę, dla której pojęcie stanu jest dobrze zdefiniowane.
Hans Hüttel
Nigdy nie powiedziałem, że nie. Mówię tylko, że twoja uwaga jest niepotrzebna, ponieważ moje wyjaśnienie nie zawiera wyraźnej wzmianki o tym, jak modelowany jest stan. Być może wykryłeś, że OP nie wiedział, że stan jest mapą od zmiennych do wartości. Dobrze dla ciebie, odpowiedź została zaakceptowana, a ja nie. Gratulacje. Dlaczego teraz narzucasz mi swój sposób odpowiedzi, nie rozumiem. Dlaczego dokładnie czujesz potrzebę, by moja odpowiedź była taka jak Twoja? Moja odpowiedź ma sens bez uwag, które uważasz za konieczne. Być może pewnego dnia ktoś przyjdzie, szukając mojej odpowiedzi.
Andrej Bauer,