Slajdy
Transkrypt
Slajdy
Aleksandar Milicevic, Derek Rayside, Kuat Yessenov, Daniel Jackso Computer Science and Artificial Intelligence Laboratory Massachusetts Institute of Technology {aleks, drayside, kuat, dnj}@csail.mit.edu http://people.csail.mit.edu/aleks/squander/doc/mil icevic-icse11-squander.pdf Framework dający ujednolicone środowisko wykonywalne dla kodu imperatywnego oraz deklaratywnego w kontekście jednego programu. http://people.csail.mit.edu/aleks/squander/ KodKod to wydajny system rozwiązywania zależności w logice pierwszego rzędu. Używany do sprawdzania kodu, generowania test case’ów oraz np. w UML Silnik SAT (http://www.sat4j.org/ ) http://alloy.mit.edu/kodkod/ Autorka: Emina Torlak Sat4J - Biblioteka do rozwiązywania oraz optymalizacji problemów opartych o logikę bool http://www.sat4j.org/ Język formalny podobny do Alloy (http://alloy.mit.edu/alloy/) Wspiera logikę pierwszego rzędu z standardowymi dla javy wyrażeniami Wykorzystywany do opisywania złożonych relacji pomiędzy obiektami w programie Z obiektów do relacji Cześć KodKod Przywrócenie sterty Przykłady implementacji algorytmów Przykład praktycznego systemu Bierze formułę relacyjną do rozwiązania, wraz z zbiorem relacji „z granicami” oraz skończony zbiór atomów. Tłumaczy formułę na problem rozwiązywalny w logice Bool’a, przekazuje do SAT. Kiedy rozwiązanie zostanie znalezione tłumaczy je z powrotem na relacje Relacje nie są typowane Dla każdej relacji potrzebne jest zdefiniowanie dwóch granic „dolnej” oraz „górnej” Dolna granica określa krotki jakie relacja musi mieć Górna granica krotki które relacja może mieć Rozmiar granic wpływa na czas rozwiązywania zadania mniej krotek=> mniej przeszukiwania => szubciej wynik Specyfikacje JFSL zamieszczane są w adnotacjach @Invariant, @Requires, @Ensures, @Modifies, @specField @SpecField("x: one int | x = this.y this.z") Specyfikacje pól są dziedziczone, mogą być nadpisywane @Modifies("f [s][u]") f (obowiązkowe) nazwa pola które Squander może modyfikować s „selektor” wybiera instancje obiektów które mogą modyfikować pole f, domyślnie wszystkie u – górna granica – określa jakie części pola f mogą być modyfikowane. Ważna adnotacja, ogranicza przestrzeń przeszukiwana 1. 2. 3. 4. Parsowanie relacji zapisanych w adnotacjach, wraz z definicjami metod, klas Konstruowanie relacji na podstawie wartości pól w stanie przed i stanie po Przekształcanie relacji do formuły dla KodKod Jeśli rozwiązanie zostanie zwrócone, przywrócenie sterty programy Szukanie osiągalnej części sterty Następnie przechodzi obiekty metoda Breadth-first – najpierw korzenie potem dzieci pierwszego rzędu, potem drugiego.. Serializacja obiektów Squander posiada zestaw serializatorów Domyślny zwraca wartości pól obiektu Serializowanie obiektów abstrakcyjnych Generyków nie było od początku Typ parametru typów generycznych jest znany tylko podczas kompilacji Po co znać typ podczas runtime’u Nie trzeba bezpośrednio rzutować Optymalizacja System refleksji Javy, dostarcza statyczne metody sprawdzania typów pod wykonywania programu. Podczas przeszukiwania sterty kiedy natrafimy na nowa klasę Sprawdzane są adnotacje @Invariant, oraz @SpecField poprzez refleksje. Adnotacje mogą znaleźć się w osobnym pliku Musi być w classpath Nazwa taka sama jak klasy Następnie sprawdzane są dostępność oraz typy pól Przykład transformacji BST Transformacji podlegają tylko obiekty „ważne” oraz osiągalne poprzez pola obiektów „ważnych” – Literały Najpierw konstruowany jest wszechświat zawierający każdy literał oraz każdy int Dla każdego literału generowana jest jedno argumentowa relacja z niego samego do niego samego Dla każdego pola tworzona jest tworzona relacja z typu fld.declType->fld.type by trzymać przypisania wartości pól do obiektu Dla pol z adnotacja @modifies Generowanie relacji pre Generowanie relacji post Dla reszty pól generowana jest relacja odzwierciadlająca jej stan na stercie Definiowanie Relacji oraz granic Schemat W zależności od wyników szukania rozwiązania przed KodKod Brak wyniku – generowany jest wyjątek który łatwo można przechwycić Znaleziono kilka wyników zwracane jest jedno wybierane niedetermistycznie Podczas transformacji Squander zapisuje mapowania z Obiektów na KodKod atomy, oraz z pól na relacje. KodKod zwraca wartości relacji oraz w postaci zbiorów kartezjańskich atomów. Przywrócenie sterty jest zatem zwykłym modyfikowaniem obiektów oraz ich pól wykorzystującym wcześniej utworzone mapowanie Kodkod dla relacji r, kargumentowej alokuje pamięć rozmiaru n^k gdzie n to liczba atomów we wszechświecie Relacja trzymana jest w jednowymiarowej tablicy int’ów, więc ograniczenie jest do Integer.MAX_VALUE Trójargumentowa relacja, wraz z wszechświatem zawierającym 1291 atomów, przekracza ogranicznie 1291^3 > Integer.MAX_VALUE Sposób zapisu relacji stanowi problem. Wszechświat z 1290 atomami nie trudno wygenerować. W ostatnim przykładzie będzie on miał 1900 obiektów. Musiała powstać metoda optymalizacji, aby system miał jakiekolwiek zastosowanie. Funkcja mapująca literały na atomy nie musi być różnowartościowa. Kilka literałów przechodzi na jeden atom Plik .jfspec Własny serializer, implementacja interface’u IObjSer Generyki Jeśli problem można rozwiązac w czasie wielomianowym, squander jest sporowolniejszy Dla problemów trudnych squander dzięki wydajności SAT może okazać się szybszy, bądź porównywalny Problem łatwiej wyrazić w sposób deklaratywny -> Squander wygrywa. Ścieżka Hamiltona Problem rozmieszczenia n hetmanów Przykład Praktyczny