Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:krr:lab_baza_wiedzy [2013/02/27 09:21] gjn utworzono |
pl:dydaktyka:krr:lab_baza_wiedzy [2019/06/27 15:50] (aktualna) |
</code> | </code> |
| |
| Proszę zdefiniować reguły opisujące: brata, siostrę, dziadka i babcię. Proszę dokładnie sprawdzić ich działanie. |
| |
| Jaki pojawia się problem przy bracie/siostrze? Uwaga na operator: ''\='' |
| |
| Proszę się zastanowić nad własnymi regułami opisującymi relacje w rodzinie. |
| |
pf2.pl | pf2.pl |
</code> | </code> |
| |
Zapamiętywanie nowych faktów | ===== Zapamiętywanie nowych faktów ===== |
| |
Dla zaawansowanych | Predykaty //assert/a/z /1//, //retract/a/z /1// pozwalają na dodawanie, usuwanie faktów do/z bazy wiedzy, na/do jej początku/końca. |
liczby-send | |
| Predykat //abolish/1// pozwala usunąć predykat z bazy wiedzy. (np. ''abolish(kobieta/1).'') |
| |
| Predykat //retractall/1// pozwala usunąć klauzule danego predykatu z bazy wiedzy. (np. ''retractall(kobieta(K)).'') |
| |
| **Ćwiczenie** |
| |
| Proszę napisać: |
| |
| ?- assert(kobieta(kopernik)). |
| |
| jak zmieniła sie wiedza na temat kobiet? |
| |
| ?- listing(kobieta). |
| |
| Proszę sprawdzić: |
| |
| kobieta(K),write(K),write(' to kobieta.'),nl,fail. |
| |
| Uwaga: niektóre kompilatory Prologu (np. SWI) wymagają wcześniejszego zadeklarowania predykatu jako takiego, który może być dynamicznie modyfikowany. Robi się to przez predykat //dynamic/1//, np. dla predykatu //kobieta/1// deklaracja w pliku //fam2.pl// ma postać '':- dynamic(kobieta/1).''. |
| |
| Proszę oglądnąć zastosowanie //assert/retract// na przykładzie programu {{:pl:prolog:prolog_lab:learner.pl}} |
| |
| Początkowa baza wiedzy jest w pliku {{:pl:prolog:prolog_lab:learner_kb.pl}} |
| |
| Należy uruchomić program przez ''start.'' |
| |
| Jakie 3 przypadki odpowiedzi są brane pod uwagę? Co dzieje się przy wyjściu z programu i jak to wpływa na jego kolejne uruchamianie? |
| |
| Uwaga: operator ''\+'' oznacza //negację//. |
| |
| ===== Dla zaawansowanych ===== |
| |
| liczby-send.pl |
| <code prolog> |
| % Fakty: definicja dostępnych cyfr. |
| cyfra(0). |
| cyfra(1). |
| cyfra(2). |
| cyfra(3). |
| cyfra(4). |
| cyfra(5). |
| cyfra(6). |
| cyfra(7). |
| cyfra(8). |
| cyfra(9). |
| |
| % Skrót nazwy predykatu cyfra/1. |
| c(X) :- cyfra(X). |
| |
| % Rozwiązanie dla problemu SEND + MORE = MONEY |
| solve(S,E,N,D,M,O,R,E,Y) :- |
| c(M),M > 0, c(S),c(E), c(N), c(D), c(M), c(O), c(R), c(Y), |
| S \= E, S \= N, S \= D, S \= M, S \= O, S \= R, S \= Y, |
| E \= N, E \= D, E \= M, E \= O, E \= R, E \= Y, |
| N \= D, N \= M, N \= O, N \= R, N \= Y, |
| D \= M, D \= O, D \= R, D \= Y, |
| M \= O, M \= R, M \= Y, |
| O \= R, O \= Y, |
| R \= Y, |
| L1 is S*1000 + E*100 + N*10 + D, |
| L2 is M*1000 + O*100 + R*10 + E, |
| L3 is M*10000 + O*1000 + N*100 + E*10 + Y, |
| Q is (L1 + L2) - L3, % write(Q),nl, |
| Q = 0. |
| |
| sm : - solve(S,E,N,D,M,O,R,E,Y), |
| write(' '),write(S),write(E),write(N),write(D),nl, |
| write('+'),write(M),write(O),write(R),write(E),nl, |
| write(M),write(O),write(N),write(E),write(Y). |
| |
| </code> |
| |
Dalsza rozbudowa bazy wiedzy PF, przepisz treść i zadaj pytania podane w | Dalsza rozbudowa bazy wiedzy PF, przepisz treść i zadaj pytania podane w |
| |
===== Źródła ===== | ===== Źródła ===== |
* Prolog Lab | * [[http://ai.ia.agh.edu.pl/wiki/pl:prolog:prolog_lab|Prolog Lab]] |
* Learn Prolog Now | * [[http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch1|Learn Prolog Now]] |
* Adventure in Prolog | * [[http://www.amzi.com/AdventureInProlog|Adventure in Prolog]] |
| * [[http://ai.ia.agh.edu.pl/wiki/pl:prolog:prolog_lab:constraint_satisfaction_problems|Opisywanie problemów za pomocą ograniczeń]] |