====== 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]]