|
|
pl:dydaktyka:krr:lab_termy [2014/03/19 09:15] gjn [Arytmetyka w Prologu] doc do arthm |
pl:dydaktyka:krr:lab_termy [2019/06/27 15:50] |
====== 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 matematyczne]]. | |
| |
===== 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]] | |
| |