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:30]
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 =====
-==== Temat: ​Rodzina - reprezentacja bazy danych ====+==== Rodzina - reprezentacja bazy danych ====
  
 Program prezentuje realizację prostej bazy danych. Program prezentuje realizację prostej bazy danych.
Linia 36: Linia 34:
  
  
-==== Ćwiczenie: Rodzina - reprezentacja bazy danych ====+**Ćwiczenie**
  
 Pobrać program {{repr-fam.pl}} Pobrać program {{repr-fam.pl}}
Linia 62: 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 79: Linia 77:
 </​code>​ </​code>​
  
-==== Ćwiczenie: Planowanie lotów ====+**Ćwiczenie** 
 Pobrać program {{flight_planner-1.pl}} Pobrać program {{flight_planner-1.pl}}
  
Linia 145: Linia 144:
 ===== -. 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). 
-</​code>​+d(2)
 +d(3).
  
-i efekt:+a(X,​Y) ​:- c(X), !, d(Y). 
 +</​code>​
  
 +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 283: 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: Użycie repeat i not ==== +
-Sprawdzić działanie:+
  
-  ?- write('​b'​),​ repeat, write('​u'​),​ fail. 
  
-Sprawdzić działanie:+**Ćwiczenie**
  
 <code prolog> <code prolog>
Linia 329: 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.
  
-==== Temat: ​Zaawansowana Mapa ====+<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 ====
  
-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 341: 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 351: 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 372: 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 408: 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 429: 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.1235475026.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