Programowanie logiczne Pracownia 4

Transkrypt

Programowanie logiczne Pracownia 4
Programowanie logiczne
Pracownia 4
Zajęcia 8 i 9
Zadanie 1.(5=(3+1+1)pkt) Zastosuj metodę przeszukiwania przestrzeni stanów i napisz program rozwiązujący następujące zadanie:
Mamy n garnków o pojemności V1 , . . . , Vn litrów, bez żadnej podziałki. Należy, korzystając z wielkiej wanny wypełnionej wodą, odmierzyć T litrów.
Predykat jars([V1,...,Vn],T,K) powinien zwrócić w parametrze K minimalną liczbę kroków potrzebną do osiągnięcia stanu docelowego. W jednym
kroku możemy
a) Nalać do pełna do wybranego garnka wody z wanny,
b) Wylać wodę z wybranego garnka
c) Przelać do garnka i dokładnie tyle wody z garnka j, że i stanie się pełny (a
j niekoniecznie pusty)
d) Przelać całą wodę z garnka j do garnka i (jeżeli w i jest więcej wody niż
może się zmieścić w j, krok ten jest równoważny zastosowaniu a) dla j, oraz
b) dla i).
Zadanie 2.(7 = (4+2+1)pkt) Napisz program, który dla danego zbioru klauzul (w logice zdaniowej) sprawdza metodą rezolucji, czy są one sprzeczne. Program powinien zawierać predykat
resolution(Clauses,Proof),
który albo zawodzi (jeżeli klauzule są spełnialne), albo unifikuje zmienną Proof
z dowodem sprzeczności klauzul.
Dowodem jest drzewo, którego węzły mają postać:
• axiom(C), jeżeli C należy do początkowego zbioru klauzul.
• resolvent(C,proof(A),proof(B)), gdzie C jest rezolwentem A i B, a
proof(X) jest dowodem klauzuli X.
• Zakładamy ponadto, że axiom(C) oraz resolvent(C,...) są dowodami
klauzuli C.
Dowód sprzeczności to oczywiście dowód klauzuli pustej (równej []).
Do zapisywania zbiorów klauzul stosujemy następujące konwencje:
• Klauzula to lista literałów, zbiór klauzul zapamiętujemy jako listę klauzul.
• Literał pozytywny to liczba, literał negatywny ma postać - n, gdzie n jest
liczbą.
Zadanie 3.(11=4+6+1pkt) Łamigłówka wieżowce zdefiniowana jest w sposób
następujący: na planszy o wymiarach N ×N , należy wpisywać liczby o numerach
od 1 do N (odpowiadają one liczbom sześciennych klocków ustawionych na
danym polu) w ten sposób, aby
a) w każdym wierszu każda liczba występowała dokładnie raz,
b) w każdej kolumnie każda liczba występowała dokładnie raz,
c) w wierszach i kolumnach było widać właściwą liczbę wieżowców.
Dla każdego wiersza i każdej kolumny podane jest, ile wieżowców widać z
każdego końca: przykładowo dla ciągu liczb [1,3,2,5,6,4] z lewej strony widać
3 słupki (1,3,5,6), a z prawej tylko 2 (4,6), pozostałe słupki są zasłonięte.
Znaczenie parametrów predykatu wiezowce(N,W,K,R) jest następujące:
• N jest wielkością planszy
• W to lista opisów wierszy, każdy opis to para (L,P), oznaczająca ile widać
z lewej, a ile z prawej strony.
• K to lista opisów kolumn, każdy opis to para (G,D), oznaczająca ile widać
z góry, a ile z dołu.
• R powinno się zunifikować z poprawnym rozwiązaniem, będącym listą wierszy, rozpoczynającą się zawartością najwyższego wiersza.
Program po nawrotach powinien znajdować wszystkie rozwiązania. Program
powinien być napisany w SWI-Prologu.
Zadanie 4.(10pkt)4+3+3 W zadaniu tym powinieneś zaimplementować grę
w ósemkę. Przypominam zasady: mamy planszę o wymiarach 3 × 3, na której
znajduje się 8 pionków o numerach od 1 do 8, jedno pole jest wolne.
Ruch polega na przesunięciu wybranego piona na sąsiednie1 wolne pole. Celem jest znalezienie drogi między dwiema podanymi konfiguracjami.
Konfigurację zapisujemy jako listę zawartości pól, poczynając od lewego górnego i posuwając się wierszami. Pole puste to stała o. Przykładowo konfiguracja
[1,2,3,o,4,5,6,7,8] odpowiada stanowi
1 2 3
4 5
6 7 8
Napisz predykat osemka(K1,K2,N), który dla zadanych dwóch konfiguracji
K1 i K2 unifikuje N z najmniejszą liczbą ruchów przeprowadzających z K1 do K2
lub zawodzi, jeżeli między tymi konfiguracjami nie ma przejścia.
1W
wierszu lub w kolumnie.
2

Podobne dokumenty