Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:listy2 [2009/02/22 23:44]
holownia utworzono
pl:prolog:prolog_lab:listy2 [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== LAB: Praca z listami w Prologu (cz. 2) ====== ====== LAB: Praca z listami w Prologu (cz. 2) ======
  
-===== Ćwiczenie ​=====+===== -. 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>
Linia 107: Linia 107:
     * 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.
  
-FIXME Coś więcej ​z reprezentacji wiedzy na dokładkę.+===== -. Przechwytywanie wyników ===== 
 + 
 + 
 +Z Prologiem dostarczonych jest kilka predykatów przydatnych przy obróbce wyników wyszukiwania. 
 + 
 +Predykat //​bagof/​3//,​ użyty jako ''​bagof(X,​P,​L)''​ buduje listę ''​L'',​ złożoną z takich ''​X'',​ że spełnione jest ''​P''​. 
 + 
 +Podobnie działa //​setof/​3//,​ jednak powstała lista jest posortowana i nie zawiera ew. duplikatów. 
 + 
 +Specjalny operator ''​^''​ pozwala na modyfikowanie zapytania i jest równoważny kwantyfikacji egzystencjalnej,​ np. zakładając istnienie bazy faktów zdefiniowanej za pomocą predykatu ''​a/​2'':​ 
 +  * ''​bagof(X,​Y^a(X,​Y),​L)''​ spowoduje znalezienie listy L na ktorej beda znajdować się wartości X niezależnie od tego jaką wartość przyjmuje Y (dokładnie jedno rozwiązanie). 
 +  * ''​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. 
 + 
 + 
 +**Ćwiczenie:​**  
 +Wczytać program z 1. zajęć {{rodzina1.pl}} 
 + 
 +Sprawdzić działanie:​ 
 + 
 +  ?- rodzic(X,​robert). 
 + 
 +  ?- bagof(X,​rodzic(X,​robert),​L). 
 + 
 +Sprawdzić działanie:​ 
 + 
 +  ?- bagof(X,​ojciec(tomek,​X),​L). 
 + 
 +  ?- setof(X,​ojciec(tomek,​X),​L). 
 + 
 +Następnie:​ 
 + 
 +  ?- bagof(X,​Y^ojciec(X,​Y),​L). 
 + 
 +  ?- setof(X,​Y^ojciec(X,​Y),​L). 
 + 
 +Oraz: 
 + 
 +  ?- bagof(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 =====
pl/prolog/prolog_lab/listy2.1235342642.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0