Oto pytanie „ścieżka B”, czy kiedykolwiek było. Podsumowanie: pierwsza rzecz, o której myślę, kiedy próbuję nadać semantykę programom niedeterministycznym, skutkuje semantyką, w której nie mogę udowodnić rzeczy o pętlach, które kończą tylko niedeterministyczność. Z pewnością ktoś wymyślił, co zrobić w tej sytuacji, lub przynajmniej wskazał, że jest to trudne, ale nie wiem, jak się go szukać (stąd tag „żądanie referencyjne”).
tło
Chcę modelować język while z niedeterminizmem. Myślę, że jest to oczywisty (lub przynajmniej naiwny) sposób modelowania takiego języka za pomocą domeny mocy Smyth, ale popraw mnie, jeśli się mylę. Zmodyfikujemy znaczenie polecenia w tym języku jako funkcji, której domeną jest zbiór stanów, a której domeną kodową jest zbiór , gdzie jest najmniejszym elementem reprezentującym nieterminację, a jest zbiorem stanów.P ( S ) ⊥ = { ⊥ } ∪ P ( S ) ⊥ P ( S )
Interpretujemy polecenia jako mapy od stanów do zdarzenia zakończenia lub do zestawów stanów które reprezentują możliwe wyniki. jest wyborem niedeterministycznym.
- jeśli , w przeciwnym razie
- jeśli lub , w przeciwnym razie
- jeśli lub dla niektórych , w przeciwnym razie
Istnieje ukierunkowane pełne zamówienie częściowe , gdzie dla dowolnego i jeśli oba i są poprawnymi zestawami, a , i możemy rozszerzyć to na funkcje od do punktowo: if dla każdego i to funkcja odwzorowująca każdy stan na .
Znaczenie pętli to to najmniejsza górna granica łańcucha , gdzie if , w przeciwnym razie jeśli lub dla niektórych , w przeciwnym razie . (Ta definicja zakłada, że właśnie zdefiniowane mnie jest ciągłe Scott, ale myślę, że można to bezpiecznie pominąć.)
Pytanie
Rozważ ten program:
Intuicyjnie jest to pętla, która może zwrócić dowolną dodatnią liczbę parzystą lub jej nie zakończyć, i która odpowiada temu, co możemy udowodnić w tej pętli przy użyciu najsłabszego wstępnego warunku liberalnego (można pokazać, że jest pętlą niezmienny). Ponieważ jednak pętla może nie zostać zakończona (możemy doprecyzować niedeterministyczny wybór programu, który zawsze przyjmuje prawą gałąź), znaczenie tego programu dla dowolnego stanu początkowego to . (Mniej nieformalnie: funkcja odwzorowująca każdy stan, w którym jest fałszywy, i każdy stan, w którym jest prawdziwe dla jest stałym punktem używanym do definiowania pętli.)
Oznacza to, że naiwna semantyka, którą zaproponowałem, nie odpowiada temu, w jaki sposób mogę rozumować programy. Obwiniam swoją semantykę, ale nie wiem, jak to naprawić.