Różnice

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

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:listy2 [2009/02/24 12:15]
holownia dodanie przechwytywania wyników
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.
  
-===== Przechwytywanie wyników =====+===== -. Przechwytywanie wyników ===== 
  
-==== Temat: Użycie predykatów bagof, setof i findall ====  
 Z Prologiem dostarczonych jest kilka predykatów przydatnych przy obróbce wyników wyszukiwania. Z Prologiem dostarczonych jest kilka predykatów przydatnych przy obróbce wyników wyszukiwania.
  
Linia 120: Linia 120:
   * ''​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.
  
  
-==== Ćwiczenie: ​Użycie predykatów bagof, setof i findall ====+**Ćwiczenie:** 
 Wczytać program z 1. zajęć {{rodzina1.pl}} Wczytać program z 1. zajęć {{rodzina1.pl}}
  
Linia 150: Linia 151:
  
   ?- 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 =====
pl/prolog/prolog_lab/listy2.1235474127.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