Artur Kret | |
Nr albumu: 153308 | |
Promotor: dr Janina Mincer-Daszkiewicz |
Metoda tropów [7] jest formalizmem służącym do specyfikowania interfejsów modułów systemów komputerowych. Jej opisowi poświęcono rozdział 2, w którym są także zamieszczone obligacje dowodowe warunkujące poprawność każdej specyfikacji tropowej.
Do generowania i weryfikacji obligacji będziemy wykorzystywać Prototype Verification System (w skrócie PVS [10,11,14]) przedstawiony w rozdziale 3. W tym celu zanurzymy metodę tropów w języku specyfikacji tego narzędzia (rozdział 4). Opracowana metoda [4] pozwala automatycznie generować wszystkie zidentyfikowane wcześniej warunki poprawności, dzięki czemu można sprowadzić weryfikację specyfikacji tropowych do weryfikacji ich tłumaczeń przy użyciu standardowych metod PVS. Proces ten, opisany w rozdziale 5, polega na dowodzeniu twierdzeń wygenerowanych przez system, które są odpowiednikami obligacji dowodowych.
Najtrudniejszym elementem procesu jest przeprowadzenie dowodów, co początkowo wykonywaliśmy ręcznie przy użyciu standardowych komend systemu dowodzącego PVS. Szybko odkryliśmy brak strategii systemowych, które należycie wspomagałyby dowodzenie specyfikacji tropowych. Powodowało to m.in. konieczność żmudnego, i często nudnego, powtarzania tych samych kroków dowodowych oraz owocowało dużą wrażliwością dowodów nawet na niewielkie zmiany specyfikacji.
Realizacji zadania stworzenia odpowiednich strategii dedykowanych metodzie tropów jest poświęcony rozdział 6. Analizujemy w nim fragmenty dowodów, w których dostrzec można mankamenty działania strategii systemowych oraz prezentujemy wypracowane rozwiązania umożliwiające ich uniknięcia. Cieszy fakt, że powstałe kroki dowodowe okazują się dość ogólne.
Proces przejścia ze specyfikacji tropowej do języka PVS oraz jej weryfikacja są zaprezentowane w pracy na przykładzie specyfikacji modułu stosu (oryginalna specyfikacja znajduje się w Dodatku A, natomiast jej tłumaczenie w Dodatku D). Załączniki obejmują również: bibliotekę tropową dla PVS (Dodatek C) oraz opisy wybranych strategii systemowych PVS (Dodatek B).
Część wyników pracy w postaci kodu źródłowego wybranych kroków dowodowych jest zamieszczona w Dodatku E, całość natomiast znajduje się na załączonej dyskietce.
Pragnę gorąco podziękować dr Janinie Mincer-Daszkiewicz i mgrowi Marcinowi Engelowi za inspirację tematu pracy oraz poświęcenie i nieocenioną pomoc podczas jej realizacji i redakcji.
Dziękuję również mgr Mirosławie Miłkowskiej za cenne uwagi dotyczące realizacji algorytmu unifikacji, a także mgrowi Grzegorzowi Grudzińskiemu za pomoc w zgłębianiu tajników języka Lisp.
Praca jest częściowo sponsorowana przez Komitet Badań Naukowych w ramach projektu badawczego nr 8 T11C 015 15.
Typowy dowód prezentujemy na rys. 5.1
Mamy już do dyspozycji wszystkie elementy potrzebne do stworzenia ogólnej strategii dowodowej dla specyfikacji tropowych, którą nazwiemy tam-grind. Poniżej prezentujemy jej definicję:
(defstep tam-grind (&optional (lemmas "epsilon_ax") (steps nil)
(grind-exclude nil))
(let( (lemmas (if (listp lemmas)
lemmas
(list lemmas)))
(sts (cons 'then steps))
(lms (loop for l in lemmas
collect
`(else (try (introduce-lemma ,l)
(else (get-new-inst? -1 :noduplicates? t
:full-inst? t)
(fail))
(skip))
(skip))))
(lms (cons 'then lms)))
(then (prelude)
(new-repeat*
(then (eq-inst* :msgon t) sts lms
(new-try (grind :if-match nil :exclude grind-exclude)
(skip)
(fail)))))))
Parametrami strategii są: lista nazw lematów (:lemmas) i kroków (:steps), które będą używane w trakcie dowodu oraz lista symboli, które nie będą przepisywane przez strategię grind (:grind-exclude). Na podstawie ich wartości tworzone są napisy zawierające:
O skuteczności tam-grind decyduje właściwa parametryzacja twierdzeniami oraz dedykowanymi krokami dowodowymi. Ich odpowiedni dobór pozwala automatyzować dowody prostych twierdzeń.
Na rys. 5.1 przestawiliśmy
dowód faktu TOP(PUSH(*,1).PUSH(*,2).POP(*))=1
wykonany za pomocą standardowych strategii PVS. Dowód był dość długi, powtarzały się podobne kroki dowodowe, użyto kilku twierdzeń
pomocniczych, których instancjacje wykonał system przy niewielkiej ingerencji
użytkownika, natomiast instancjacje warunków TCC wygenerowanych w ich wyniku
wykonano całkowicie ręcznie. Zastosowanie nowych strategii opisywanych w poprzednich
sekcjach daje znaczne jego uproszczenie (rys.
6.1): dowód sprowadza
się do rozwijania definicji, przepisywania termów i wprowadzania właściwych
instancji lematu epsilon_ax. Stąd już tylko krok dzieli nas od pełnej
automatyzacji osiągniętej przez zastosowanie tam-grind z opcją :lemmas
"epsilon_ax" (rys. 6.2).
Lemat epsilon_ax jest na tyle często stosowany (każda definicja zawierająca konstrukcję WHERE wymaga jego użycia podczas dowodu), że wpisaliśmy go w definicji strategii jako wartość domyślną (ustawienie to można zmienić podając jako wartość :lemmas nil lub listę nazw lematów nie zawierających "epsilon_ax").
Strategię można też parametryzować krokami dowodowymi. Poniżej prezentujemy dwa przykłady takich kroków:
(else
(try (introduce-lemma "epsilon_ax")
(try (get-new-inst? -1 :noduplicates? t :full-inst? t)
(branch (then (beta -1) (prop))
((skip)
(then (hide-all-but * 1) (eq-inst*)
(grind :if-match nil))))
(fail))
(skip))
(skip)))
Krok jest używany do wprowadzenia właściwej instancji lematu dotyczącego i następnie wykonania w każdej z powstałych gałęzi dowodu specyficznych dla niej kroków, np. w gałęzi drugiej, powstałej jako TCC, ukrywa wszystkie formuły poza [1], wykonuje jej instancjację i uruchamia przepisywanie,
(new-try (expand "unique?")
(then (skosimp*)
(let( (num (car *new-fmla-nums*))
(step `(replace ,num :dir rl)) )
step)
(apply-extensionality))
(skip)))
Krok jest używany do dowodzenia twierdzeń zawierających predykat unique?, wyrażający jednoznaczność formuły będącej jego argumentem; wykonuje rozwijanie definicji, skolemizację, przepisywanie i stosuje regułę ekstensjonalnej równości.
Fakt ten udowodniony poprzednio przez (tam-grind :lemmas "epsilon_ax") jest również automatycznie dowodzony przez (tam-grind :lemmas nil :steps ((epsilon))),
(FORALL (n: name, T: ctraces | POP_leg(n, T)):
exists1! (x: [ctraces, int]):
PROJ_1(x) . typetolist[stack](PUSH_1(PROJ_2(x))) = T)
Twierdzenie to jest jednym z warunków TCC wygenerowanych dla specyfikacji stosu, który mówi, że dla każdego niepustego stosu istnieje jednoznacznie określony wynik wywołania programu dostępu POP. Oryginalny dowód (por. rys. 6.3) został znacznie uproszczony (rys. 6.4) dzięki zastosowaniu (tam-grind :lemmas "epsilon_ax" :steps ((unique)) :grind-exclude "unique?").
W poszukiwaniu właściwych parametrów strategii ogólnej przeanalizowaliśmy wykonane wcześniej dowody pod kątem używanych lematów i kroków dowodowych dedykowanych do wykonywania pewnych małych fragmentów dowodów. Następnie z otrzymanej listy twierdzeń usunęliśmy lematy, które będą zainstalowane jako reguły systemu przepisywania termów przez strategię prelude. Ostatnią fazą było testowanie.
Przeprowadzone testy doprowadziły do ustalenia właściwych parametrów strategii ogólnej:
(tam-grind :lemmas ("epsilon_ax" "SUBTYPE_TCC1") :steps ((unique)) :grind-exclude "unique?"),
gdzie SUBTYPE_TCC1 jest nazwą warunku TCC powstającego podczas weryfikacji teorii stack_TAM, który wyraża sensowność i redukowalność do siebie samego każdego tropu kanonicznego:
SUBTYPE_TCC1: OBLIGATION (FORALL (x: ctraces): Feasible(x) AND Reduce(x) = x).
Ten wariant strategii najlepiej wspomagał automatyczne dowodzenie twierdzeń. Zastosowanie go do specyfikacji stosu zaowocowało w poszczególnych teoriach uproszczeniem wielu dowodów:
Ważne jest także spostrzeżenie, że użycie strategii w dowodach, w których nie przynosiło uproszczeń, na ogół nie powodowało również ich komplikacji.
Powstały zestaw dedykowanych dla TAM kroków dowodowych i twierdzeń zachęca do zrealizowania postulowanego od dawna połączenia edytora specyfikacji z wybranym systemem dowodzenia twierdzeń.
Zdajemy sobie sprawę, że biblioteka narzędzi tropowych dla PVS nie jest jeszcze kompletna i będzie wymagała rozszerzenia. Potwierdzają to rozpoczęte badania nad automatyzacją weryfikacji fragmentów specyfikacji unixowego systemu plików [8], których dokończenie pozostawiamy kontynuatorom tej pracy.
Opracowane na potrzeby specyfikacji tropowych strategie okazały się dość ogólne i przyczyniają się one do zwiększenia możliwości automatyzacji dowodów przez PVS. Być może ich realizacja, ze względu na brak dokumentacji, nie jest najlepsza, natomiast idee wydają się celne i nowatorskie, dlatego zamierzamy poddać je dyskusji na szerszym forum użytkowników tego systemu [5].
Podczas pracy zauważyliśmy kilka poważniejszych błędów PVS, których część została już zgłoszona, natomiast resztę wraz z postulatami dotyczącymi np. użyteczniejszej postaci twierdzeń o różnowartościowości konstruktorów ADT czy specjalnego traktowania standardowych podtypów (np. subrange), zamierzamy przesłać autorom po zakończeniu prac.
[2] M. Archer, C. Heitmeyer, S. Sims. TAME: A PVS Interface to Simplify Proofs for Automata Models. Praca zaprezentowana na User Interfaces for Theorem Provers (UITP'98), Eindhoven University of Technology, 13-15 czerwca 1998.
[3] W. Bartussek, D.L. Parnas. Using Traces to Write Abstract Specifications for Software Modules, Proc. 2nd Conference of European Cooperation in Informatics, volume 65 of Lecture Notes in Computer Science, pages 211-236. Springer-Verlag, 1978.
[4] M. Engel, M. Iglewski, J. Mincer-Daszkiewicz. Generating PVS Proof Obligations for TAM Specifications, Proceedings of the CS&P'97 Workshop, pages 55-66. Warsaw University, 6-7 October 1997.
[5] M. Engel, A. Kret, J. Mincer-Daszkiewicz. Increasing Automation Capabilities of the PVS Theorem Prover, Proceedings of the CS&P'98 Workshop, pages 64-75. Humboldt-Universitat zu Berlin, 28-30 September 1998.
[6] M. Iglewski, M. Kubica, J. Madey. An Editor for the Trace Assertion Method, M. Zaremba (ed.), Proceedings of the 10th International Conference of CAD/CAM, Robotics and Factories of the Future: CARs&FOF'94, pages 876-881. OCRI, Ottawa, Ontario, Canada, 1994.
[7] M. Iglewski, M. Kubica, J. Madey, J. Mincer-Daszkiewicz, K. Stencel. TAM'97: the Trace Assertion Method of Module Interface Specification. Reference Manual. Technical Report TR 97-01 (238), Institute of Informatics, Warsaw University, January 1997.
[8] P. Kołodziejski, M. Majewska. Specyfikacja unixowego systemu plików w metodzie tropów. Praca magisterska, Instytut Informatyki, Uniwersytet Warszawski, 1996.
[9] S. Owre, J. Rushby, N. Shankar. PVS: A Prototype Verification System, Deepak Kapur (ed.), 11th International Conference on Automated Deduction (CADE), volume 607 of Lecture Notes in Artificial Intelligence, pages 748-752. Springer-Verlag, June 1992.
[10] S. Owre, N. Shankar, J. Rushby. The PVS Specification Language (Beta Release). Computer Science Laboratory, SRI International, Menlo Park, CA, April 1993.
[11] S. Owre, N. Shankar, J. Rushby. User Guide for the PVS Specification and Verification System (Beta Release). Computer Science Laboratory, SRI International, Menlo Park, CA, March 1993.
[12] T. Reps, T. Teitelbaum. The Synthesizer Generator. A System for Constructing Language-based Editors, D. Gries (ed.), Text and Monographs in Computer Science. Springer-Verlag, Berlin, 1989.
[13] Selecting Sequent Formulas in PVS Proof Strategies. Dokument jest dostępny w formacie HTML pod adresem http://www.csl.sri.com/pvs.html, 1998.
[14] N. Shankar, S. Owre, J. Rushby. The PVS Proof Checker: A Reference Manual (Beta Release). Computer Science Laboratory, SRI International, Menlo Park, CA, February 1993.
[15] G.L. Steele Jr. Common Lisp the Language. Digital Press, wydanie drugie, 1990. Książka jest dostępna w formacie HTML pod adresem AI.Repository@cs.cmu.edu.
[16] R. Wilensky. Common LISPcraft. W. W. Norton & Company, New York, London, 1986.