|
|
pl:dydaktyka:krr:lab_termy [2017/07/17 10:08] |
pl:dydaktyka:krr:lab_termy [2019/06/27 15:50] (aktualna) |
| ====== Termy i reprezentacja wiedzy w Prologu ====== |
| |
| ===== Prosty program diagnostyczny ===== |
| |
| Program realizuje prosty system diagnostyczny (w praktyce wnioskujący wstecz system ekspertowy). |
| Jest to kompletny program wyposażony w: |
| * bazę wiedzy o problemie |
| * mechanizm wnioskowania - wyszukiwanie rozwiązań |
| * dynamiczną modyfikację/rozbudowę bazy wiedzy |
| * obsługę plików (i/o) |
| * interfejs (prosty) użytkownika |
| |
| System: {{pl:prolog:prolog_lab:car.pl}} |
| |
| Plik pomocniczy: {{pl:prolog:prolog_lab:getyesno.pl}} |
| |
| Przeanalizuj działanie programu, spróbuj dodać kolejną, własną przyczynę awarii, związane z nią reguły diagnostyczne i wyjaśnienie. |
| |
| ===== Arytmetyka w Prologu ===== |
| |
| W Prologu nie można w sposób //bezpośredni// wykonywać obliczeń arytmetycznych. Służy do tego predykat //is//. |
| |
| |
| **Ćwiczenie** |
| |
| 1. Sprawdzić działanie: |
| |
| <code prolog> |
| ?- X is 2 + 2. |
| ?- Y is 2.5 + ( 4 / 2). |
| ?- Z is 2 + 0.001. |
| </code> |
| |
| Uwaga: |
| |
| <code prolog> |
| ?- A is 3. |
| ?- B is A + 4. |
| ?- A is 3, B is A + 4. |
| </code> |
| |
| Operacje arytmetyczne: |
| |
| <code prolog> |
| ?- X is 2 + 2. |
| ?- X is 2 * 3. |
| ?- X is 4 / 2. |
| ?- X is 4 / 3. |
| ?- X is 4 // 3. |
| </code> |
| Uwaga na //podstawianie//: |
| |
| <code prolog> |
| ?- X is 2 + 5. |
| ?- X = 2 + 5. |
| ?- 2 + 5 =:= 1 + 4. |
| ?- 2 + 5 =:= 3 + 4. |
| ?- 2 + 5 =:= 4 + 4. |
| </code> |
| |
| Przećwiczyć użycie operatorów: |
| |
| <code prolog> |
| ?- 2 < 3. |
| ?- 2 > 3. |
| ?- 3 > 3. |
| ?- 3 >= 3. |
| ?- 3 =< 3. |
| </code> |
| |
| 2. Napisz program obliczający wynik [[http://pl.wikipedia.org/wiki/R%C3%B3wnanie_kwadratowe|równania kwadratowego]] ([[wp>Quadratic Equation]]) ''ax^2 + bx + c = 0'' w dziedzinie liczb rzeczywistych. |
| Zaimplementuj predykaty: |
| * ''delta/4'' -- obliczający deltę, argumenty kolejno: a, b, c, wynik, |
| * ''kwadrat/4'' -- obliczający wynik równania kwadratowego, argumenty kolejno: a, b, c, wynik. |
| Zwróć uwagę na niedeterminizm w predykacie ''kwadrat/4'', który znajduje zero, jedno, albo dwa rozwiązania; mogą się przydać [[http://www.swi-prolog.org/pldoc/man?section=funcsummary|funkcje arytmetyczne]]. |
| |
| ===== Termy ===== |
| |
| Termy to: |
| * stałe 'ala' |
| * szukane (zmienne logiczne) 'Ala' |
| * struktury (dowolnie) złożone 'mezczyzna(jas)', 'ksiazka(tytul(it), autor(king))' |
| |
| Prolog dopasowuje termy z użyciem mechanizmu unifikacji. |
| Wpisz, po kolei na konsoli i przemyśl dokładnie każde z poniższych zapytań: |
| |
| <code prolog> |
| ?- a=a. |
| ?- a=b. |
| ?- a(b)=a(b). |
| ?- a(b)=a(c). |
| ?- a(b)=a(C). |
| ?- a(C)=a(b). |
| ?- a(C)=a(C). |
| ?- C=a. |
| ?- C=C. |
| ?- C=a(c). |
| ?- k(s(g),Y) = k(X,t(k)). |
| </code> |
| |
| Korzystając z programu o rodzinie z 1. zajęć: |
| <code prolog> |
| ?- rodzic(kasia,robert). |
| ?- rodzic(kasia,X). |
| ?- rodzic(kasia,X),write(X). |
| ?- rodzic(kasia,X),X=robert,write('udalo sie!'). |
| ?- X=robert,rodzic(kasia,X),write('udalo sie!'). |
| </code> |
| |
| Wpisz poniższy program do pliku geoman.pl |
| <code prolog> |
| vertical(line(point(X,Y),point(X,Z))). |
| horizontal(line(point(X,Y),point(Z,Y))). |
| </code> |
| Jak pozbyć się ostrzeżeń (bez zmiany jego działania)? |
| |
| Zadaj poniższe pytania: |
| <code prolog> |
| ?- vertical(line(point(1,1),point(1,3))). |
| ?- vertical(line(point(1,1),point(3,2))). |
| ?- horizontal(line(point(1,1),point(2,Y))). |
| ?- horizontal(line(point(2,3),P)). |
| </code> |
| |
| ===== Przykład: Zamówienia ===== |
| |
| Wczytaj i przeanalizuj program {{:pl:prolog:prolog_lab:custord.pl|}} |
| |
| Zrealizuje odpowiadającą mu część ćwiczeń ze strony [[http://www.amzi.com/AdventureInProlog/a3simple.php]] |
| |
| ===== Przykład: System klasyfikujący ===== |
| Wczytaj program {{:pl:prolog:prolog_lab:birds.pl|}} |
| |
| Realizuje on regułową klasyfikację ptaków. |
| Program używa prawie tylko mechanizmów które znasz (pojawiają się listy przy menu, ale "niegroźnie"). |
| |
| Dodaj reguły pozwalające na identyfikację ptaka którego znasz. |
| |
| ===== Przykład: Gra przygodowa ===== |
| |
| Wczytaj program {{:pl:prolog:prolog_lab:nani.pl|}} |
| |
| Opis gry i sytuacji gracza [[http://www.amzi.com/AdventureInProlog/a2facts.php|znajdziesz tutaj]]. |
| |
| Opis struktur danych [[http://www.amzi.com/AdventureInProlog/a9struct.php|jest tu]] |
| |
| Program używa prawie tylko mechanizmów które znasz (pojawiają się listy, ale "niegroźnie"). |
| |
| Przeanalizuj przykłady [[http://www.amzi.com/AdventureInProlog/a10unif.php|unifikacji]]. |
| |
| ===== Materiały ===== |
| * [LPN] [[http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch2|Unifikacja]] |
| * [AIP] [[http://www.amzi.com/AdventureInProlog/a9struct.php|Struktury danych]] |
| |