Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_metaprog [2011/04/06 16:37] gjn link do ks covingtona + instr |
pl:prolog:prolog_lab:prolog_lab_metaprog [2019/06/27 15:50] (aktualna) |
| |
<code prolog> | <code prolog> |
var(X) | var(X). |
nonvar(X) | nonvar(X). |
</code> | </code> |
| |
?- number(3). | ?- number(3). |
| |
?- number(3). | |
?- integer(3). | ?- integer(3). |
?- integer(3.14). | ?- integer(3.14). |
| ?- float(3). |
?- float(3.14). | ?- float(3.14). |
?- float(3). | |
| |
?- compound(ala). | ?- compound(ala). |
Uwaga: ''compound'' nie nadaje się do "wykrywania" list, bo: | Uwaga: ''compound'' nie nadaje się do "wykrywania" list, bo: |
<code prolog> | <code prolog> |
?- compound([]). | ?- compound([]). |
</code> | </code> |
| |
| |
<code prolog> | <code prolog> |
?- A =.. [ala, ma, kota]. | ?- A =.. [ala, ma, asa]. |
?- ala(ma,kota,w(ciapki(rozowe))) =.. A. | ?- ala(ma,kota,w(ciapki(rozowe))) =.. A. |
</code> | </code> |
?- functor(ala(ma,kota),F,A). | ?- functor(ala(ma,kota),F,A). |
| |
?- CzyTo=ala,OLiczbie=2,functor(ala(ma,kota),CzyTo,OLiczbie). | ?- CzyTo = ala, OLiczbie = 2, functor(ala(ma,kota),CzyTo,OLiczbie). |
| |
?- CzyTo=kasia,OLiczbie=2,functor(ala(ma,kota),CzyTo,OLiczbie). | ?- CzyTo = kasia, OLiczbie = 2, functor(ala(ma,kota),CzyTo,OLiczbie). |
| |
?- functor(ala(ma,kota),F,_), write('To jest funktor \''), write(F), write('\'.'). | ?- functor(ala(ma,kota),F,_), write('To jest funktor \''), write(F), write('\'.'). |
a(1). a(2). b(4). b(3). | a(1). a(2). b(4). b(3). |
| |
wyp0(F,_):- | wyp0(F,_) :- |
call(F). | call(F). |
| |
wyp1(F,X):- | wyp1(F,X) :- |
F, | F, |
F =.. [_,X]. | F =.. [_,X]. |
| |
wyp2(F,X):- | wyp2(F,X) :- |
functor(Pred,F,1), | functor(Pred,F,1), |
Pred, | Pred, |
Pred =.. [_,X]. | Pred =.. [_,X]. |
| |
wyp3(F/A,X):- | wyp3(F/A,X) :- |
A = 1, | A = 1, |
functor(Pred,F,A), | functor(Pred,F,A), |
Wykonaj zapytania będące przykładami użycia powyższych predykatów: | Wykonaj zapytania będące przykładami użycia powyższych predykatów: |
<code prolog> | <code prolog> |
?-wyp0(a(X),X). | ?- wyp0(a(X),X). |
?-wyp0(b(X),X). | ?- wyp0(b(X),X). |
| |
?-wyp1(a(_),X). | ?- wyp1(a(_),X). |
?-wyp1(b(_),X). | ?- wyp1(b(_),X). |
| |
?-wyp2(a,X). | ?- wyp2(a,X). |
?-wyp2(b,X). | ?- wyp2(b,X). |
| |
?-wyp3(a/1,X). | ?- wyp3(a/1,X). |
?-wyp3(b/1,X). | ?- wyp3(b/1,X). |
</code> | </code> |
| |
| |
Realizowane jest to przez predykat :- op(P, T, N), który definiuje N, jako operator typu T, o priorytecie P. | Realizowane jest to przez predykat :- op(P, T, N), który definiuje N, jako operator typu T, o priorytecie P. |
| Zobacz: |
| * http://www.swi-prolog.org/pldoc/man?predicate=op/3 |
| * http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse40 |
| |
Zdefiniowane w standardzie ISO operatory to: | Zdefiniowane w standardzie ISO operatory to: |
<code prolog> | <code prolog> |
go :- write('Hello '), write('World\n'). | go :- write('Hello '), write('World\n'). |
| |
:- go. | :- go. |
</code> | </code> |
| |
<code prolog> | <code prolog> |
:-(go,','(write('Hello '),write('World\n'))). | :- (go,','(write('Hello '), write('World\n'))). |
:-(go). | |
| :- (go). |
</code> | </code> |
| |
| |
Patrz również: | Patrz również: |
* [[http://gollem.science.uva.nl/SWI-Prolog/Manual/operators.html|podręcznik SWI]] | |
* [[http://cs.union.edu/~striegnk/learn-prolog-now/html/node84.html#subsec.l9.operators.def|Lean Prolog Now]] | * [[http://cs.union.edu/~striegnk/learn-prolog-now/html/node84.html#subsec.l9.operators.def|Lean Prolog Now]] |
| |
:- op(300, xfx, ma). | :- op(300, xfx, ma). |
:- op(200, xfy, i). | :- op(200, xfy, i). |
| |
jas ma kota i psa. | jas ma kota i psa. |
ala ma jasia i angine i dosc_agh. | ala ma jasia i angine i dosc_agh. |
?- ma(A,i(B,i(C,D))). | ?- ma(A,i(B,i(C,D))). |
| |
?-Kto ma Co. | ?- Kto ma Co. |
| |
?-Kto ma Co i Cosinnego. | ?- Kto ma Co i Cosinnego. |
| |
?-Kto ma Cos i CosInnego i Jeszcze. | ?- Kto ma Cos i CosInnego i Jeszcze. |
| |
?- display(jas ma kota i psa). | ?- display(jas ma kota i psa). |
Co zwróci poniższe zapytanie? | Co zwróci poniższe zapytanie? |
<code prolog> | <code prolog> |
?- i(X,B). | ?- i(A,B). |
</code> | </code> |
Podpowiedź: zwróć uwagę na priorytety operatorów. | Podpowiedź: zwróć uwagę na priorytety operatorów. |
| |
?- listing(matka). | ?- listing(matka). |
?- Kto=kasia, call(matka(Kto,Kogo)), write(Kto), write(' jest matka '), write(Kogo). | ?- Kto = kasia, call(matka(Kto,Kogo)), write(Kto), write(' jest matka '), write(Kogo). |
?- Matka=kasia, Dziecko=robert, clause(matka(Matka,Dziecko),Kiedy), write(Matka), write(' jest matka '), write(Dziecko), write(' wtedy gdy: '), write(Kiedy). | ?- Matka = kasia, Dziecko = robert, clause(matka(Matka,Dziecko),Kiedy), write(Matka), write(' jest matka '), write(Dziecko), write(' wtedy gdy: '), write(Kiedy). |
</code> | </code> |
| |
display(Q), | display(Q), |
call(Q), | call(Q), |
write(Kto), | write(Kto), nl. |
nl. | |
</code> | </code> |
| |
| |
a następnie przetestować i przemyśleć: | a następnie przetestować i przemyśleć: |
| |
| |
<code prolog> | <code prolog> |
?- odpowiedz. | ?- odpowiedz. |
| |
'matka' czy 'ojciec'? ojciec | 'matka' czy 'ojciec'? ojciec |
kogo? robert | kogo? robert |
rozwiaz3(G2). | rozwiaz3(G2). |
rozwiaz3(G) :- | rozwiaz3(G) :- |
write('Wywoluje: '), write(G), nl, | write('Wywoluje: '), write(G), nl, |
clause(G,B), | clause(G,B), |
rozwiaz3(B), | rozwiaz3(B), |
write('Wyjscie: '), write(G), nl. | write('Wyjscie: '), write(G), nl. |
</code> | </code> |
| |
?- rozwiaz1(matka(kasia,X)). | ?- rozwiaz1(matka(kasia,X)). |
| |
?- rozwiaz1((matka(kasia,X),matka(Y,robert))). | ?- rozwiaz1((matka(kasia,X), matka(Y,robert))). |
| |
?- rozwiaz2((matka(kasia,X),matka(Y,robert))). | ?- rozwiaz2((matka(kasia,X), matka(Y,robert))). |
| |
?- rozwiaz3((matka(kasia,X),matka(Y,robert))). | ?- rozwiaz3((matka(kasia,X), matka(Y,robert))). |
</code> | </code> |
| |
| |
Plik pomocniczy: {{getyesno.pl}} | Plik pomocniczy: {{getyesno.pl}} |
| |
| ==== - System: BIRDS ==== |
| Źródło: Dennis Merritt, //[[http://www.amzi.com/ExpertSystemsInProlog/|Building Expert Systems in Prolog]]//, Springer-Verlag, 1989. |
| |
| Cechy: |
| * prologowa reprezentacja reguł |
| * własny mechanizm wnioskujący - metainterpreter |
| * wnioskowanie wprzód ((Forward chaining inference, data driven inference - stosowane w celu uniknięcia eksplozji kombinatorycznej, gdy możliwe jest (nieskończenie) wiele poprawnych odpowiedzi, system na podstawie danych "odpala" odpowiednie reguły)) |
| * wymienne bazy wiedzy |
| |
| Mechanizm wnioskujący: {{native.pl}} |
| |
| Bazy wiedzy: {{birds_kb.pl}} |
| |
| Uruchomienie: załadować //native.pl// i wywołać ''main.'' |
| |
| |
==== - System: OOPS ==== | ==== - System: OOPS ==== |
| |
Źródło: Dennis Merritt, //[[http://www.amzi.com/ExpertSystemsInProlog/|Building Expert Systems in Prolog]]//, Springer-Verlag, 1989. | Źródło: Dennis Merritt, //[[http://www.amzi.com/ExpertSystemsInProlog/|Building Expert Systems in Prolog]]//, Springer-Verlag, 1989. |
| |
* kodowanie reguł na termach Prologu | * kodowanie reguł na termach Prologu |
* własny mechanizm wnioskujący | * własny mechanizm wnioskujący |
* wnioskowanie wprzód ((Forward chaining inference, data driven inference - stosowane w celu uniknięcia eksplozji kombinatorycznej, gdy możliwe jest (nieskończenie) wiele poprawnych odpowiedzi, system na podstawie danych "odpala" odpowiednie reguły)) | * wnioskowanie wprzód |
* wymienne bazy wiedzy | * wymienne bazy wiedzy |
| |
Mechanizm wnioskujący: {{oops.pl}} | Mechanizm wnioskujący: {{oops.pl}} |
| |
Baza wiedzy: {{animal_kb.pl}} | Bazy wiedzy: {{room_kb.pl}} {{animal_kb.pl}} |
| |
| Uruchomienie: załadować //oops.pl// i wywołać ''main.'' |
| |
| |
* sposób reprezentacji reguł, jak są zapisywane reguły w bazie wiedzy systemu, z jakich operatorów korzystają, | * sposób reprezentacji reguł, jak są zapisywane reguły w bazie wiedzy systemu, z jakich operatorów korzystają, |
* sposób implementacji mechanizmy wnioskującego, na jakich rozwiązaniach się opiera. | * sposób implementacji mechanizmy wnioskującego, na jakich rozwiązaniach się opiera. |
| |
| ====== Temat: własne systemy ====== |
| Zbuduj bazę wiedzy dla własnego systemu regułowego (dla wybranej implementacji). |
| Propozycje dziedzin podane są poniżej. |
| |
| System rozpoznaje psy. |
| Należy opisać kilka/naście znanych ras psów na podstawie: [[http://pl.wikipedia.org/wiki/Grupy_FCI]], [[http://atlaspsow.w.interia.pl]], [[http://rasy-psow.com]], [[http://www.psy.elk.pl/rasypsow/]]. |
| Warto wybrać przedstawicieli z różnych grup FCI. |
| |
| W celu identyfikacji rasy trzeba wybrać kilka podstawowych cech, w tym płeć (powiązana z rozmiarem!), wagę, rozmiar, umaszczenie, kształt głowy, uszy, etc. |
| |
| Podobny do w.w. system rozpoznający ptaki występujące w Polsce. |
| Należy oprzeć się na: |
| [[http://ptaki.luzik.proste.pl]], [[http://ptaki.zwierzeta.ekologia.pl]]. |
| |
====== Uwagi, komentarze, propozycje ====== | ====== Uwagi, komentarze, propozycje ====== |
Tu studenci mogą wpisywać swoje uwagi. | Tu studenci mogą wpisywać swoje uwagi... |
| |
--- //[[gjn@agh.edu.pl|Grzegorz J. Nalepa]] 2009/05/06 09:13// | --- //[[gjn@agh.edu.pl|Grzegorz J. Nalepa]] 2009/05/06 09:13// |
| |