Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:listy2 [2009/02/24 14:12] holownia |
pl:prolog:prolog_lab:listy2 [2019/06/27 15:50] (aktualna) |
====== LAB: Praca z listami w Prologu (cz. 2) ====== | ====== LAB: Praca z listami w Prologu (cz. 2) ====== |
| |
===== Zadania z list do samodzielnego rozwiązania ===== | ===== -. Zadania z list do samodzielnego rozwiązania ===== |
| |
Korzystając z wiedzy zdobytej w [[listy1|pierwszej części laboratorium z listami]] proszę rozwiązać następujące problemy: | Korzystając z wiedzy zdobytej w [[listy1|pierwszej części laboratorium z listami]] proszę rozwiązać następujące problemy: |
| |
- zadać cel powodujący usunięcie 3 ostatnich elementów listy L, w wyniku powstaje lista L1, użyć ''sklej''. | - zdefiniować predykat, powodujący usunięcie 3 ostatnich elementów listy L, w wyniku powstaje lista L1, użyć ''sklej''. |
- zadać cel powodujący usunięcie 3 pierwszych elementów listy L, w wyniku powstaje lista L1, użyć ''sklej''. | - zdefiniować predykat, powodujący usunięcie 3 pierwszych elementów listy L, w wyniku powstaje lista L1, użyć ''sklej''. |
- zadać cel powodujący usunięcie 3 pierwszych i ostatnich elementów listy L, w wyniku powstaje lista L2, użyć ''sklej''. | - zdefiniować predykat, powodujący usunięcie 3 pierwszych i ostatnich elementów listy L, w wyniku powstaje lista L2, użyć ''sklej''. |
- zdefiniować predykat ''ostatni1(E,L)'', gdzie E to ostatni element listy L, użyć ''sklej'' (predykat nie jest rekurencyjny). | - zdefiniować parę komplementarnych predykatów ''nieparzysta(L)'' oraz ''parzysta(L)'' sprawdzajacych czy argument jest listą o odpowiednio nie/parzystej długości. |
- j.w., ''ostatni2(E,L)'', tylko bez ''sklej'' (predykat jest rekurencyjny). | * czy Twój predykat potrafi również **utworzyć** listę o zadanej parzystości? (jako argument podajemy niewiadomą, a nie stałą) |
- zdefiniować parę komplementarnych predykatów ''nieparzysta(L)'' oraz ''parzysta(L)'' wypisujących listy o odpowiednio nie/parzystej długości. | |
- zdefiniować predykat ''palindrom(L)'', L jest palindromem, jeżeli czyta się tak samo od przodu i tyłu, np. ''[a,l,a]'', ''[m,a,d,a,m]''. (podpowiedź: można nie/użyć ''odwroc''.) | - zdefiniować predykat ''palindrom(L)'', L jest palindromem, jeżeli czyta się tak samo od przodu i tyłu, np. ''[a,l,a]'', ''[m,a,d,a,m]''. (podpowiedź: można nie/użyć ''odwroc''.) |
- zdefiniować predykat ''przesun(L1,L2)'', gdzie L2, jest przesuniętą rotacyjnie o jeden element L1, np.: <code prolog> | - zdefiniować predykat ''przesun(L1,L2)'', gdzie L2, jest przesuniętą rotacyjnie o jeden element L1, np.: <code prolog> |
* Predykat rozmieniający powinien mieć dwa argumenty: ''rozmien/2'', gdzie pierwszy to kwota, a drugi lista nominałów monet na jakie można rozmienić kwotę; uwaga: predykat będzie niedeterministyczny. | * Predykat rozmieniający powinien mieć dwa argumenty: ''rozmien/2'', gdzie pierwszy to kwota, a drugi lista nominałów monet na jakie można rozmienić kwotę; uwaga: predykat będzie niedeterministyczny. |
| |
===== Przechwytywanie wyników ===== | ===== -. Przechwytywanie wyników ===== |
| |
| |
* ''bagof(X,a(X,Y),L)'' spowoduje znalezienie listy L na ktorej beda znajdować się wartości X dla konkretnej (znalezionej) wartości Y (wiele rozwiązań, lista dla każdej wartości Y). | * ''bagof(X,a(X,Y),L)'' spowoduje znalezienie listy L na ktorej beda znajdować się wartości X dla konkretnej (znalezionej) wartości Y (wiele rozwiązań, lista dla każdej wartości Y). |
| |
| FIXME: składnia z ^ nie działa (w zainst. wersji SWI), jeżeli jest użyta jako cel w powłoce SWI - należy zdefiniować odpowiedni predykat jej używający w pliku. |
| |
Predykat //findall/3// wymusza wyszukanie wszystkich możliwych wyników. | Predykat //findall/3// wymusza wyszukanie wszystkich możliwych wyników. |
| |
?- findall(X,ojciec(X,Y),L). | ?- findall(X,ojciec(X,Y),L). |
| |
| ===== -. Labirynt ===== |
| |
| Dany jest program poszukujacy drogi w labiryncie: {{:pl:prolog:prolog_lab:maze.pl|}}. |
| Proces poszukiwania uruchamiany jest za pomocą predykatu ''solve_maze/''. |
| |
| Głównym predykatem definiujacym algortym poszukiwania jest ''path/2''. |
| |
| Labirynt znajduje się na ponumerowanych polach. |
| Połączenia pomiędzy polami, którymi można przejść zdefiniowane są za pomocą predykatu ''connect/2''. |
| Wejście do labiryntu oznaczone jest ''start'', wyjście: ''finish''. |
| Poniższy przykład definoiuje bardzo prosty labirynt. |
| |
| <code prolog> |
| connect(start,1). |
| connect(1,2). |
| connect(2,3). |
| connect(2,4). |
| connect(3,finish). |
| </code> |
| |
| **Ćwiczenie:** |
| |
| 1. Przeanalizuj program {{maze.pl}}. Do czego służy predykat ''connected_to/2''? |
| |
| 2. Napisz odpowiednie klauzule predykatu ''connect/2'' dla labiryntu danego na rysunku poniżej oraz uruchom program poszukujący drogi. |
| {{:pl:prolog:prolog_lab:maze.jpg}} |
| |
| 3. Zmodyfikuj labirynt, tak aby do wyjścia prowadziła więcej niż jedna droga. Czy ''solve_maze/0'' znajdzie więcej niż jedną drogę? Czy ''path/2'' znajdzie więcej niż jedną drogę? |
| |
| ===== -. Zagadka ===== |
| Na blokach piramidek (patrz rysunki) należy umieścić cyfry od 1 do 9. W niebieskich rzędach cyfry muszą być różne, w żółtych - mogą się powtarzać, a w różowych - przynajmniej jedna powtórka jest obowiązkowa. Każda cyfra (poza umieszczonymi w podstawie) musi być sumą **lub** różnicą dwu cyfr znajdujących się bezpośrednio pod nią. Część liczb jest już na swoich miejscach. Napisz program w Prologu, który poda rozwiązania piramidek. |
| |
| Wskazówka: Przeczytaj //"helpa"// do predykatu //list_to_set/2//. Może się okazać przydatny... |
| |
| {{:pl:prolog:prolog_lab:zagadka-1.png|Zagadka 1}} |
| {{:pl:prolog:prolog_lab:zagadka-2.png|Zagadka 2}} |
| |
===== Komentarze ===== | ===== Komentarze ===== |