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

Podobne dokumenty