Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:reprezentacja_wiedzy [2009/02/24 15:10] holownia |
pl:prolog:prolog_lab:reprezentacja_wiedzy [2015/03/31 17:30] msl - |
====== LAB: Reprezentacja wiedzy w Prologu, szukanie rozwiązań ====== | ====== LAB: Reprezentacja wiedzy w Prologu, szukanie rozwiązań ====== |
| |
FIXME Przemyśleć całość i poprawić cut. | |
| |
===== -. Reprezentacja wiedzy ===== | ===== -. Reprezentacja wiedzy ===== |
===== -. Sterowanie wnioskowaniem ===== | ===== -. Sterowanie wnioskowaniem ===== |
| |
Operator cut, pisany przy pomocy ''!'' pozwala na zablokowanie procesu nawrotu w wybranym miejscu. | 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. |
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> |
| |
Przypomnienie: fail/0 wymusza nawrót. | Dla celu a(X) X nie zostanie zunifikowany! (odp. interpretera: No.) 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> |
| c(1). |
| c(2). |
| c(3). |
| d(1). |
| d(2). |
| d(3). |
| |
| a(X,Y) :- c(X), !, d(Y). |
| </code> |
| |
| Proszę zadać cel: |
<code prolog> | <code prolog> |
nazwa2(1) :- !, write('Jeden'). | ?- a(X,Y), write('X = '), write(X), write(', Y = '), writeln(Y), fail. |
nazwa2(2) :- !, write('Dwa'). | |
nazwa2(3) :- !, write('Trzy'). | |
nazwa2(_) :- write(' Nie wiem!'). | |
</code> | </code> |
| |
i efekt: | Proszę zauważyć, że dla zmiennej logicznej Y, której unifikacja przebiega po wykonaniu odcięcia, nawroty są możliwe. |
| |
| |
| __Przykład 4__:\\ |
| Baza wiedzy: |
<code prolog> | <code prolog> |
?- nazwa2(2). | b(1). |
Dwa | b(2). |
| c(2). |
| c(3). |
| |
Yes | a(X) :- b(X), !, c(X). |
?- nazwa2(2), fail. | a(X) :- c(X). |
Dwa | </code> |
| |
No | |
?- nazwa2(X), fail. | |
Jeden | |
| |
No | Proszę zadać cel: |
| <code prolog> |
| ?- a(X). |
| ?- a(3). |
</code> | </code> |
| |
**Ćwiczenie** | Po napotkaniu cut odcinane są także pozostałe reguły predykatu. Dlaczego wobec tego a(3) jednak zwraca prawdę? |
| |
Przepisać pokazane w opisie predykaty nazwa do pliku //odciecia.pl// i przetestować ich działanie w sposób analogiczny jak w opisie. | Przykłady inspirowane [[http://en.wikibooks.org/wiki/Prolog/Cuts_and_Negation|Prolog Cuts and Negation]] |
| |
Dodać opisy dla kolejnych cyfr, sprawdzić działanie dla różnych wartości. | **Ćwiczenie** |
| |
Zmienić kolejność klauzul predykatu i sprawdzić działanie. | |
| |
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! | |
| |
Proszę dopisać znany już predykat należy: | Proszę dopisać do bazy wiedzy znany już predykat ''należy/2'': |
| |
<code prolog> | <code prolog> |
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: | 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: |
| |
not(P) :- P,!,fail;true. | <code prolog> |
| not(P) :- P,!,fail;true. |
| </code> |
| |
| albo w nieco mniej zwartej, ale bardziej czytelnej postaci: |
| |
| <code prolog> |
| not(P) :- P,!,fail. |
| not(_). |
| </code> |
| |
| |
Proszę przeanalizować poniższe problemy, w miarę czasu i możliwości. | Proszę przeanalizować poniższe problemy, w miarę czasu i możliwości. |
| |
| ==== Minecraft ==== |
| 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. |
| |
| <code prolog> |
| ?- cuboid(2,2,2). |
| </code> |
| |
| Następnie proszę zapoznać się z kodem odpowiadającym za animację {{:pl:prolog:prolog_lab:animation.pl|}}: |
| |
| <code prolog> |
| ?- sm. |
| </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]] |
| |
| 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 ==== | ==== Zaawansowana Mapa ==== |
| |
Rozważmy problem [[programy#tematkolorowanie_mapy|kolorowania mapy]]. | Rozważmy problem [[programy#kolorowanie_mapy|kolorowania mapy]]. |
| |
W jaki sposób policzyć ile jest rozwiązań problemu? | W jaki sposób policzyć ile jest rozwiązań problemu? |
| |
==== 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? |
**Ćwiczenie** | **Ćwiczenie** |
| |
Proszę pobrać kod {{einstein.pl}} i zastanowić się na jego działaniem. | Proszę pobrać kod {{einstein2.pl}} i zastanowić się na jego działaniem. |
| |
Uzyskanie poprawnego rozwiązania: | Uzyskanie poprawnego rozwiązania: |
===== Komentarze ==== | ===== 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// | |