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:reprezentacja_wiedzy [2009/02/24 12:22]
holownia
pl:prolog:prolog_lab:reprezentacja_wiedzy [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
-{{header>​1}} +====== LAB: Reprezentacja wiedzy w Prologu, szukanie rozwiązań ======
-====== ​- #4 LAB: Reprezentacja wiedzy w Prologu, szukanie rozwiązań ======+
  
-FIXME Do odchudzenia. +===== -Reprezentacja wiedzy ===== 
- +==== Rodzina - reprezentacja bazy danych ====
-===== - Reprezentacja wiedzy ===== +
-==== Temat: ​Rodzina - reprezentacja bazy danych ====+
  
 Program prezentuje realizację prostej bazy danych. Program prezentuje realizację prostej bazy danych.
Linia 37: Linia 34:
  
  
-==== Ćwiczenie: Rodzina - reprezentacja bazy danych ====+**Ćwiczenie**
  
 Pobrać program {{repr-fam.pl}} Pobrać program {{repr-fam.pl}}
Linia 63: Linia 60:
  
  
-==== Temat: ​Planowanie lotów ====+==== Planowanie lotów ====
 Program {{flight_planner-1.pl}} pozwala na znalezienie trasy przelotu. Program {{flight_planner-1.pl}} pozwala na znalezienie trasy przelotu.
  
Linia 80: Linia 77:
 </​code>​ </​code>​
  
-==== Ćwiczenie: Planowanie lotów ====+**Ćwiczenie** 
 Pobrać program {{flight_planner-1.pl}} Pobrać program {{flight_planner-1.pl}}
  
Linia 117: Linia 115:
 W uproszczeniu:​ chcemy móc pisać ''​g:​m,''​ zamiast '':​(g,​m)''​. W uproszczeniu:​ chcemy móc pisać ''​g:​m,''​ zamiast '':​(g,​m)''​.
  
-===== - Wewnętrzna reprezentacja =====+===== -Wewnętrzna reprezentacja =====
  
 Predykaty ''​display'',​ ''​write_canonical''​ wypisują Prologową reprezentację termów. Predykaty ''​display'',​ ''​write_canonical''​ wypisują Prologową reprezentację termów.
Linia 144: Linia 142:
 </​code>​ </​code>​
  
-===== - Sterowanie wnioskowaniem =====+===== -Sterowanie wnioskowaniem =====
  
-==== Temat: Cut ==== +Operator cut, pisany przy pomocy ''​!''​ pozwala na zablokowanie procesu nawrotu w wybranym miejscu. Te zmienne logiczne, które zostały zunifikowane przed napotkaniem ''​!'',​ nie mogą ulec zmianie
- +
-Operator cut, pisany przy pomocy ''​!''​ pozwala na zablokowanie procesu nawrotu w wybranym miejscu. ​+
 W efekcie można uniknąć wyszukiwania niechcianych,​ zbędnych, a czasem wręcz niepoprawnych rozwiązań. W efekcie można uniknąć wyszukiwania niechcianych,​ zbędnych, a czasem wręcz niepoprawnych rozwiązań.
  
-Na przykład, proszę się zastanowić nad intencją autora kodu:+__Przykład 1__:\\ 
 +Baza wiedzy: 
 +<code prolog>​ 
 +c(1). 
 +c(2).
  
 +a(X) :- c(X), !.
 +</​code>​
 +
 +Proszę zadać cel:
 <code prolog> <code prolog>
-nazwa1(1) :write('​Jeden'​)+?a(X)write(X), fail.
-nazwa1(2) :- write('​Dwa'​). +
-nazwa1(3) :- write('​Trzy'​). +
-nazwa1(_) :- write(' Nie wiem!').+
 </​code>​ </​code>​
  
-a następnie działaniem Prologu:+X zostaje zunifikowany z 1 - c(1). Cut uniemożliwia dalsze nawroty.
  
 +__Przykład 2__:\\
 +Baza wiedzy:
 <code prolog> <code prolog>
-?- nazwa1(2). +c(1). 
-Dwa+c(2). 
 +d(2).
  
-Yes +a(X) :c(X), !, d(X)
-?nazwa1(2), fail+</​code>​
-Dwa Nie wiem!+
  
-No +Proszę zadać cel: 
-?- nazwa1(X), fail+<code prolog> 
-JedenDwaTrzy Nie wiem! +?- a(1). 
- +?- a(2). 
-No+?- a(X).
 </​code>​ </​code>​
  
-Przypomnieniefail/0 wymusza ​nawrót. +Dla celu a(X) X nie zostanie zunifikowany! (odp. interpreteraNo.) Reguła jest prawdziwa dla X=2, ale Prolog nie znajdzie takiego rozwiązania,​ bo uniemożliwiony został ​nawrót. ​d(1) przy takiej bazie wiedzy nie jest prawdziwe.
- +
-A teraz modyfikacja:​+
  
 +__Przykład 3__:\\
 +Baza wiedzy:
 <code prolog> <code prolog>
-nazwa2(1) :- !, write('​Jeden'​). +c(1)
-nazwa2(2:- !, write('​Dwa'​). +c(2). 
-nazwa2(3:- !, write('​Trzy'​). +c(3)
-nazwa2(_) :- write(' Nie wiem!').+d(1). 
 +d(2)
 +d(3). 
 + 
 +a(X,Y) :- c(X), !, d(Y).
 </​code>​ </​code>​
  
-i efekt: +Proszę zadać cel:
 <code prolog> <code prolog>
-?- nazwa2(2). +?- a(X,Y), write('​X = '), write(X), write(',​ Y = '), writeln(Y), fail
-Dwa+</​code>​
  
-Yes +Proszę zauważyćże dla zmiennej logicznej Y, której unifikacja przebiega po wykonaniu odcięcia, nawroty są możliwe.
-?- nazwa2(2)fail. +
-Dwa+
  
-No 
-?- nazwa2(X), fail. 
-Jeden 
  
-No+__Przykład 4__:\\ 
 +Baza wiedzy: 
 +<code prolog>​ 
 +b(1). 
 +b(2). 
 +c(2). 
 +c(3). 
 + 
 +a(X) :- b(X), !, c(X). 
 +a(X) :- c(X).
 </​code>​ </​code>​
  
-==== ĆwiczenieCut ==== +Proszę zadać cel
- +<code prolog> 
-Przepisać pokazane w opisie predykaty nazwa do pliku //odciecia.pl// i przetestować ich działanie w sposób analogiczny jak w opisie.+?- a(X). 
 +?- a(3). 
 +</code>
  
-Dodać opisy dla kolejnych cyfr, sprawdzić działanie dla różnych wartości.+Po napotkaniu cut odcinane są także pozostałe reguły predykatuDlaczego wobec tego a(3) jednak zwraca prawdę?
  
-Zmienić kolejność klauzul predykatu i sprawdzić działanie.+Przykłady inspirowane [[http://en.wikibooks.org/​wiki/​Prolog/​Cuts_and_Negation|Prolog Cuts and Negation]]
  
-Uwaga: aby zaobserwować działanie cut należy zawsze wymuszać nawrót na poziomie interpretera po tym, jak zostanie znalezione rozwiąznie,​ przez naciśnięcie znaku średnika!+**Ćwiczenie**
  
-Proszę dopisać znany już predykat należy:+Proszę dopisać ​do bazy wiedzy ​znany już predykat ​''​należy/​2''​:
  
 <code prolog> <code prolog>
Linia 284: Linia 296:
  
  
-===== - Powtarzanie i nie tylko ===== +===== -Użycie ​predykatu ​not =====
-==== Temat: ​Użycie ​repeat i not ==== +
-Predykat ''​repeat/​0''​ powoduje powtarzanie. Jeżeli dociera się do niego w czasie nawrotu, szukanie jest kontynuowane.+
  
-Definicja mogłaby wyglądać tak (ten predykat już jest zdefiniowany w Prologu!).+Poza predykatem fail/0 mamy do dyspozycji predykat true/0. 
 +Przy ich użyciu można skonstruować odpowiednik operatora \+ (negacja) - predykat not/0, który z logicznego punktu widzenia mógłby wyglądać tak:
  
 <code prolog> <code prolog>
-repeat. +not(P) ​:- P,​!,​fail;​true.
-repeat ​:- repeat.+
 </​code>​ </​code>​
  
-Uwaga: rekursja i nawroty to dwa podstawowe mechanizmy powtarzania/​kontynuowania szukania ​Prologu.+albo nieco mniej zwartej, ale bardziej czytelnej postaci:
  
-Oprócz ''​fail/​0'',​ ''​repeat/​0''​ innym przydatnym predykatem jest ''​true/​0''​+<code prolog>​ 
- +not(P) :- P,!,fail. 
-Poza tym należy pamiętać o predykacie not/0, równoważnym operatorowi +not(_). 
-\+, który z logicznego punktu widzenia mógłby wyglądać tak:+</code>
  
-  not(P) :- P,​!,​fail;​true. 
  
- +**Ćwiczenie**
-==== Ćwiczenie: Użycie repeat i not ==== +
-Sprawdzić działanie:​ +
- +
-  ?- write('​b'​),​ repeat, write('​u'​),​ fail. +
- +
-Sprawdzić działanie:+
  
 <code prolog> <code prolog>
Linia 326: Linia 329:
 </​code>​ </​code>​
  
-===== - Przechwytywanie wyników ===== 
  
 +===== -. Ciekawe problemy =====
 +Proszę przeanalizować poniższe problemy, w miarę czasu i możliwości.
  
-==== Temat: Użycie predykatów bagof, setof i findall ​====  +==== Minecraft ​==== 
-Z Prologiem dostarczonych ​jest kilka predykatów przydatnych ​przy obróbce wyników wyszukiwania.+Zastanówmy się nad próbą implementacji prostej gry typu [[http://​pl.wikipedia.org/​wiki/​Minecraft|Minecraft]]. Kluczowym elementem gry jest silnik wokselowy, który odpowiada za renderowania ogromnego świata ​przy użyciu prostych klocków zwanych [[http://​pl.wikipedia.org/​wiki/​Woksel|wokselami]]. Zaczniemy od rysowania przykładowego woksela. Proszę uruchomić program {{:​pl:​prolog:​prolog_lab:​cuboid.pl|}} (wymagane XPCE) i przeanalizować jego działanie.
  
-Predykat //​bagof/​3//,​ użyty jako ''​bagof(X,P,L)''​ buduje listę ''​L'',​ złożoną z takich ''​X'',​ że spełnione jest ''​P''​.+<code prolog>​ 
 +?- cuboid(2,2,2). 
 +</​code>​
  
-Podobnie działa //​setof/​3//,​ jednak powstała lista jest posortowana i nie zawiera ew. duplikatów.+Następnie proszę zapoznać się z kodem odpowiadającym za animację {{:​pl:​prolog:​prolog_lab:​animation.pl|}}:
  
-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'':​ +<code prolog> 
-  * ''​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)+?- sm
-  * ''​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).+</​code>​
  
 +Zadania:
 +  - Przerobić predykat ''​cuboid''​ tak, żeby można było sprecyzować jego pozycję w przestrzeni
 +  - Napisać predykat ''​cuboids'',​ który przyjmuje listę współrzędnych i rysuje w nich sześciany o zadanej długości boku
 +  - Przy pomocy predykatu ''​cuboids''​ należy zamodelować [[http://​i.ytimg.com/​vi/​u1bX8kEy0pg/​maxresdefault.jpg?​|złożony obiekt ze świata Minecraft]]
 +  - Bazując na kodzie z ''​animation.pl''​ należy wprawić krowę w ruch sinusoidalny,​ imitujący [[https://​www.youtube.com/​watch?​v=QH2-TGUlwu4|kota z filmu]]
 +  - [Dla odważnych] dodać do animacji [[https://​archive.org/​details/​nyannyannyan|dźwięk]] podobny do tego z [[https://​www.youtube.com/​watch?​v=QH2-TGUlwu4|filmu]]
  
-Predykat ​//findall/3// wymusza wyszukanie wszystkich ​możliwych wyników.+Pytania: 
 +  - Czy rozsądne jest rysowanie wszystkich klocków? Jak wykryć, które klocki są widoczne z perspektywy gracza? Pomocny może okazać się [[http://et1337.com/2015/02/18/​the-poor-mans-voxel-engine/#​|link]] 
 +  - Czy możliwe jest zrobienie w podobny sposób imitacji poniższego [[http://​goo.gl/​YroZm|filmu]]?​
  
 +==== Zaawansowana Mapa ====
  
- +Rozważmy problem [[programy#kolorowanie_mapy|kolorowania mapy]].
- +
-==== Ćwiczenie: Użycie predykatów bagof, setof i findall ==== +
-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). +
- +
-Mając [[prolog_lab_reprezentacja#​reprezentacja_wiedzy|powyższy program o rodzinie]], można teraz policzyć zarobki wszystkich osób: +
- +
-  ?- bagof(X,​istnieje(X),​L),​zarobki(L,​Z). +
- +
- +
- +
-===== - Ciekawe problemy ===== +
-Proszę przeanalizować poniższe problemy, w miarę czasu i możliwości. +
- +
- +
-==== Temat: Zaawansowana Mapa ==== +
- +
-Rozważmy problem [[prolog_lab_2#tematkolorowanie_mapy|kolorowania mapy]].+
  
 W jaki sposób policzyć ile jest rozwiązań problemu? ​ W jaki sposób policzyć ile jest rozwiązań problemu? ​
Linia 394: Linia 368:
 Powyższy problem można przedstawić w sposób ogólny definiując predykaty: ''​panstwo/​1'',​ ''​kolor/​1'',​ ''​sasiad/​2''​ określające odpowiednio:​ nazwy państw, kolory, oraz państwa sąsiadujące ze sobą. Powyższy problem można przedstawić w sposób ogólny definiując predykaty: ''​panstwo/​1'',​ ''​kolor/​1'',​ ''​sasiad/​2''​ określające odpowiednio:​ nazwy państw, kolory, oraz państwa sąsiadujące ze sobą.
  
-==== Ćwiczenie: Zaawansowana Mapa ====+**Ćwiczenie**
  
 Zaimplementuj powyższą bazę wiedzy korzystając z tematu Kolorowanie Mapy. Zaimplementuj powyższą bazę wiedzy korzystając z tematu Kolorowanie Mapy.
Linia 404: Linia 378:
   - sprawdź czy w wygenerowanym kandydacie na rozwiązanie sąsiadujące państwa nie mają tego samego koloru; uwaga: przydatne będzie użycie ''​forall/​2''​. ​   - sprawdź czy w wygenerowanym kandydacie na rozwiązanie sąsiadujące państwa nie mają tego samego koloru; uwaga: przydatne będzie użycie ''​forall/​2''​. ​
  
-==== Temat: ​Zagadka Einsteina ==== +==== Zagadka Einsteina ==== 
-Jedna z możliwych postaci zagadki Einstein'​a:​+Jedna z możliwych postaci zagadki Einstein'​a ​(patrz [[http://​en.wikipedia.org/​wiki/​Einstein_puzzle]],​ [[http://​pl.wikipedia.org/​wiki/​Zagadka_Einsteina]]).
  
 5 ludzi różnych narodowości zamieszkuje 5 domów w 5 różnych kolorach. Wszyscy palą papierosy 5 różnych marek i piją 5 różnych napojów. Hodują zwierzęta 5 różnych gatunków. Który z nich hoduje rybki? 5 ludzi różnych narodowości zamieszkuje 5 domów w 5 różnych kolorach. Wszyscy palą papierosy 5 różnych marek i piją 5 różnych napojów. Hodują zwierzęta 5 różnych gatunków. Który z nich hoduje rybki?
Linia 425: Linia 399:
   - W zielonym domu pija się kawę.   - W zielonym domu pija się kawę.
  
-==== Ćwiczenie: Zagadka Einsteina ==== + 
-Proszę pobrać kod {{einstein.pl}} i zastanowić się na jego działaniem.+**Ćwiczenie** 
 + 
 +Proszę pobrać kod {{einstein2.pl}} i zastanowić się na jego działaniem.
  
 Uzyskanie poprawnego rozwiązania:​ Uzyskanie poprawnego rozwiązania:​
Linia 461: Linia 437:
  
  
-==== Temat: ​Sortowanie ====+==== Sortowanie ====
 Pliki poniżej zawierają niektóre klasyczne algorytmy sortowania w Prologu. Patrz również: http://​en.wikipedia.org/​wiki/​Sorting_algorithm oraz po polsku: http://​pl.wikipedia.org/​wiki/​Sortowanie Pliki poniżej zawierają niektóre klasyczne algorytmy sortowania w Prologu. Patrz również: http://​en.wikipedia.org/​wiki/​Sorting_algorithm oraz po polsku: http://​pl.wikipedia.org/​wiki/​Sortowanie
  
-==== Ćwiczenie: Sortowanie ====+**Ćwiczenie** 
 Pobrać kod algorytmów i prześledzić ich działanie: Pobrać kod algorytmów i prześledzić ich działanie:
  
Linia 482: Linia 459:
 </​code>​ </​code>​
  
-===== Komentarze, propozycje, wątpliwości====+===== Komentarze ==== 
  
-  * ciężko zdażyć zrealizować całe laboratorium:​ rodzina + flight planner zajmuje 70 min  --- //​[[wojnicki@agh.edu.pl|Igor Wojnicki]] 2008/11/05 15:41// 
pl/prolog/prolog_lab/reprezentacja_wiedzy.1235474574.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