Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_metaprog [2016/04/04 23:29] msl [1 Temat: Sprawdzanie typów termów] |
pl:prolog:prolog_lab:prolog_lab_metaprog [2019/06/27 15:50] (aktualna) |
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> |
| |