====== 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: ?- X is 2 + 2. ?- Y is 2.5 + ( 4 / 2). ?- Z is 2 + 0.001. Uwaga: ?- A is 3. ?- B is A + 4. ?- A is 3, B is A + 4. Operacje arytmetyczne: ?- X is 2 + 2. ?- X is 2 * 3. ?- X is 4 / 2. ?- X is 4 / 3. ?- X is 4 // 3. Uwaga na //podstawianie//: ?- X is 2 + 5. ?- X = 2 + 5. ?- 2 + 5 =:= 1 + 4. ?- 2 + 5 =:= 3 + 4. ?- 2 + 5 =:= 4 + 4. Przećwiczyć użycie operatorów: ?- 2 < 3. ?- 2 > 3. ?- 3 > 3. ?- 3 >= 3. ?- 3 =< 3. 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ń: ?- 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)). Korzystając z programu o rodzinie z 1. zajęć: ?- 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!'). Wpisz poniższy program do pliku geoman.pl vertical(line(point(X,Y),point(X,Z))). horizontal(line(point(X,Y),point(Z,Y))). Jak pozbyć się ostrzeżeń (bez zmiany jego działania)? Zadaj poniższe pytania: ?- 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)). ===== 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]]