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 15:10]
holownia
pl:prolog:prolog_lab:reprezentacja_wiedzy [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== 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 =====
Linia 146: Linia 144:
 ===== -. 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>​
  
-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>​ 
 +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>
Linia 287: Linia 301:
 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>​
  
  
Linia 310: Linia 333:
 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? ​
Linia 333: Linia 379:
  
 ==== 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 356: Linia 402:
 **Ć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:​
Linia 415: Linia 461:
 ===== 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//+
pl/prolog/prolog_lab/reprezentacja_wiedzy.1235484643.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