Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:prolog_lab_6 [2008/01/15 19:38]
gjn
— (aktualna)
Linia 1: Linia 1:
-====== 6 LAB: Metaprogramowanie w Prologu ====== 
  
- 
-===== WPROWADZENIE ===== 
- 
- 
-==== Temat: Sprawdzanie typów termów ==== 
- 
- 
-Prolog dostarcza szeregu predykatów,​ pozwalających na analizowanie typów termów. 
- 
-Po pierwsze można stwierdzić,​ czy term jest niewiadomą (zmienną logiczną) o nieustalonej wartości, czy też ma określoną wartość, czyli jest stałą, lub zmienną o wcześniej ustalonej wartości (po pomyślnej unifikacji). 
- 
-Służą do tego predykaty: 
- 
-<code prolog> 
-var(X) 
-nonvar(X) 
-</​code>​ 
- 
-Poza tym, jest szereg predykatów sprawdzających,​ czy term jest: 
- 
-  atom 
-atomem logicznym (stałą, napisem) ​ 
-  atomic 
-liczbą lub atomem ​ 
-  number 
-liczbą ​ 
-  compound 
-złożoną strukturą ​ 
-  integer 
-liczbą całkowitą ​ 
-  float 
-liczbą zmiennoprzecinkową ​ 
- 
-==== Temat: Konstruowanie i dekompzycja termów ==== 
- 
- 
-Z racji tego, iż termy sa podstawową metodą strukturalizacji danych w Prolog, istnieje kilka mechanizmów wspomagających ich przetwarzanie:​ 
- 
-  =.. 
-operator pozwala na dynamiczną zamianę termu na listę i vice versa  
-  functor(T,​N,​A) 
-predykat jest prawdziwy, jeżeli N pokrywa się z nazwą termu T o arności A  
-  arg(N,T,A) 
-predykat jest prawdziwy, jeżeli A jest Ntym argumentem termu T  
- 
-==== Temat: Definiowanie operatorów ==== 
- 
- 
-W prologu bardzo łatwo można definiować własne operatory, co ułatwia przetwarzanie danych. 
- 
-Realizowane jest to przez predykat :- op(P, T, N), który definiuje N, jako operator typu T, o priorytecie P. 
- 
-Zdefiniowane w standardzie ISO operatory to: 
- 
-<​code>​ 
-1200 xfx -->,​ :- 
-1200 fx :-, ?- 
-1150 fx dynamic,​ discontiguous,​ initialization,​ module_transparent,​ multifile, thread_local,​ volatile 
-1100 xfy ;, | 
-1050 xfy ->,​ op*-> 
-1000 xfy , 
-954 xfy \ 
-900 fy \+ 
-900 fx ~ 
-700 xfx <,​ =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<, @>, @>=, \=, \==, is 
-600 xfy : 
-500 yfx +, -, /\, \/, xor 
-500 fx +, -, ?, \ 
-400 yfx *, /, //, rdiv, <<, >>, mod, rem 
-200 xfx ** 
-200 xfy ^ 
-</​code>​ 
- 
-Wszystkie mogą być zredefiniowane!. 
- 
-==== Temat: Konstruowanie klauzul i Metainterpretery ==== 
- 
- 
-W Prologu występują dwa silne mechnizmy wspomagające metainterpretację kodu: 
- 
-  call(X) 
-wywołuje X, jako cel Prologu, ​ 
-  clause(Head,​Body) 
-odszukuje klauzulę o nagłówku Head, gdzie Body jest unifikowane z ciałem klauzuli; w przypadku faktów Body=true. ​ 
- 
-Meta programowanie to tworzenie programów, które przetwarzają kod innych programów. Przykłady metaprogramowania znaleźć można w np.: kompilatorach,​ analizatorach kodu, generatorach kodu. W Prologu metaprogramowanie jest naturalną techniką, dzięki czemu pisanie programów działających w diametralnie różnych paradygmatach jest proste. 
- 
-==== Temat: Przykłady systemów regułowych ==== 
- 
- 
-  * System: CAR 
-Źródło: Michael A. Covington, Donald Nute and André Vellino, Prolog programming in depth, Prentice-Hall,​ 1996. 
- 
-Cechy: 
-    * klauzule Prologu jako reprezentacja wiedzy 
-    * wbudowany mechanizm Prologu 
-    * wnioskowanie wstecz 
-    * trywialny :) 
-System: {{car.pl}} 
- 
-  * System: OOPS 
-Źródło: Dennis Merritt, Building Expert Systems in Prolog Springer-Verlag,​ 1989. 
- 
-Cechy: 
-    * własna reprezentacja reguł 
-    * kodowanie reguł na termach Prologu 
-    * własny mechanizm wnioskujący 
-    * wnioskowanie wprzód 
-    * wymienne bazy wiedzy 
- 
-Mechanizm wnioskujący:​ {{oops.pl}} 
- 
-Baza wiedzy: {{animal_kb.pl}} 
- 
-  * System: XSHELL 
-Źródło: Michael A. Covington, Donald Nute and André Vellino, Prolog programming in depth, Prentice-Hall,​ 1996. 
- 
-Cechy: 
-    * klauzule Prologu jako reprezentacja wiedzy 
-    * rozbudowana reprezentacja reguł 
-    * wbudowany mechanizm Prologu 
-    * wnioskowanie wstecz 
-    * wymienne bazy wiedzy 
-    * rozbudowane przetwarzanie 
-Mechanizm wnioskujący:​ {{xshell.pl}} 
- 
-Baza wiedzy: {{cichlid.pl}} 
- 
-===== ĆWICZENIA ===== 
- 
- 
-==== 6.1 Ćwiczenie: Sprawdzanie typów termów ==== 
- 
- 
-Proszę przetestować poniższe: 
- 
-<code prolog> 
-?- var(X). 
-?- var(X),X=2. 
-?- X=2,var(X). 
- 
-?- atom(X). 
-?- atom(3). 
-?- atom(a). 
-?- atom(+). 
-?- atom(:=). 
-?- atom('​ala'​). 
- 
-?- atomic(a). 
-?- atomic(3). 
-?- atomic(+). 
-?- atomic(X). 
- 
-?- number(ala). 
-?- number(3). 
- 
-?- number(3). 
-?- integer(3). 
-?- integer(3.14). 
-?- float(3.14). 
-?- float(3). 
- 
-?- compound(ala). 
-?- compound(ala(ma,​kota)). 
-?- compound(3). 
-</​code>​ 
- 
-==== 6.2 Ćwiczenie: Konstruowanie i dekompzycja termów ==== 
- 
- 
-Proszę przećwiczyć przetwarzanie termów: 
- 
-<code prolog> 
-?- A =.. [ala, ma, kota]. 
-?- ala(ma,​kota,​w(ciapki(rozowe))) =.. A. 
-</​code>​ 
- 
-Przeanalizować:​ 
- 
-<code prolog> 
-?- functor(ala(ma,​kota),​F,​A). 
- 
-?- CzyTo=ala,​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('​\'​.'​). 
- 
-?- arg(X,​ala_ma(kota,​psa,​schiza),​A). 
-?- arg(2,​ala_ma(kota,​psa,​schiza),​A). 
- 
-?- functor(A,​riverside,​3). 
-?- functor(A,​riverside,​4),​ arg(1,​A,​voices),​ arg(4,​A,​head). 
-</​code>​ 
- 
-==== 6.3 Ćwiczenie: Definiowanie operatorów ==== 
- 
- 
-Proszę wpisać do pliku oper1.pl 
- 
-  :- op(100,xfy, matka). 
-  julia matka marcin. 
- 
-a nastepnie przetestować:​ 
- 
-  ?- X matka Y. 
- 
-Dopisać do pliku: 
- 
-<code prolog> 
-:- op(300, xfx, ma). 
-:- op(200, xfy, i). 
-jas ma kota i psa. 
-ala ma jasia i angine i dosc_agh. 
-</​code>​ 
- 
-Przetestować:​ 
- 
-<code prolog> 
-?- ma(X,Y). 
- 
-?- display(jas ma kota i psa). 
- 
-?- display(ala ma jasia i angine i dosc_agh). 
-</​code>​ 
- 
-==== 6.4 Ćwiczenie: Konstruowanie klauzul i Metainterpretery ==== 
- 
- 
-Proszę wczytać program {{rodzina1.pl}} 
- 
-Uruchomić: 
- 
-<code prolog> 
-?- listing(kobieta). 
- 
-?- call(kobieta(X)). 
-?- clause(kobieta(X),​B). 
- 
-?- listing(matka). 
-?- 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). 
-</​code>​ 
- 
-Proszę do pliku meta.pl wpisać predykat: 
- 
-<code prolog> 
-:- include(readstr). 
- 
-odpowiedz :- 
- write('​\'​matka\'​ czy \'​ojciec\'?​ '), 
- read_atom(X),​ 
- write('​kogo?​ '), 
- read_atom(Y),​ 
- Q =.. [X,Kto,Y], 
- display(Q),​ 
- call(Q), 
- write(Kto),​ 
- nl. 
-</​code>​ 
- 
-Uwaga: potrzebny jest dodatkowy plik: {{readstr.pl}} 
- 
-a następnie przetestować i przemyśleć:​ 
- 
- 
-<code prolog> 
-?- odpowiedz. 
-'​matka'​ czy '​ojciec'?​ ojciec 
-kogo? robert 
-</​code>​ 
- 
-Dopisać do pliku meta.pl następujące proste metainterpretery Prologu: 
- 
-<code prolog> 
-rozwiaz1(G) :- call(G). 
- 
-rozwiaz2(true) :- !. 
-rozwiaz2((G1,​G2)) :- !, 
- rozwiaz2(G1),​ 
- rozwiaz2(G2). 
-rozwiaz2(G) :- 
- clause(G,​B),​ 
- rozwiaz2(B). 
- 
-rozwiaz3(true) :-!. 
-rozwiaz3((G1,​G2)) :- !, 
- rozwiaz3(G1),​ 
- rozwiaz3(G2). 
-rozwiaz3(G) :- 
- write('​Wywoluje:​ '), write(G), nl, 
- clause(G,​B),​ 
- rozwiaz3(B),​ 
- write('​Wyjscie: ​ '), write(G), nl. 
-</​code>​ 
- 
-Pierwszy z nich po prostu wywołuje pojedynczy cel, tak jak powłoka SWI. 
- 
-Drugi pozwala na zadanie celu złożonego z 2 części. 
- 
-Trzeci działa podobnie, ale śledzi wykonywanie. 
- 
-Przetestować ich działanie: 
- 
-<code prolog> 
-?- rozwiaz1(matka(kasia,​X)). 
- 
-?- rozwiaz1(matka(kasia,​X),​matka(Y,​robert)). 
- 
-?- rozwiaz2((matka(kasia,​X),​matka(Y,​robert))). 
- 
-?- rozwiaz3((matka(kasia,​X),​matka(Y,​robert))). 
-</​code>​ 
- 
-Proszę pobrać kod {{tracerdepth.pl}} 
- 
-Przetestować:​ 
- 
-  ?- traced(matka(kasia,​Y)). 
- 
-==== 6.5 Ćwiczenie: Przykłady systemów regułowych ==== 
- 
- 
-Przetestować systemy: 
- 
-  * System: CAR 
-System: {{car.pl}} 
- 
-Plik pomocniczy: ​ {{getyesno.pl}} 
- 
-  * System: OOPS 
-Mechanizm wnioskujący:​ {{oops.pl}}, ​ 
- 
-Baza wiedzy: {{animal_kb.pl}} 
- 
-  * System: XSHELL 
-Mechanizm wnioskujący:​ {{xshell.pl}} 
- 
-Pliki pomocnicze: {{readstr.pl}} , {{readnum.pl}} , {{writeln.pl}} , {{getyesno.pl}} 
- 
-Baza wiedzy: {{cichlid.pl}} 
- 
-Analizując ich pracę i sposób implementacji,​ proszę zwrócić uwagę na: 
- 
-  * 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. 
- 
- 
-====== FIXME ====== 
- 
-<code prolog> 
-a(1). 
-a(2). 
-b(4). 
-b(3). 
- 
-wyp1(F,X):- 
-  F, 
-  F =.. [_,X]. 
- 
-%wyp1(a(_),​X). 
-%wyp1(b(_),​X). 
- 
-wyp(F,X):- 
-  functor(Pred,​F,​1),​ 
-  Pred, 
-  Pred =.. [_,X]. 
- 
-%wyp(a,X). 
-%wyp(b,X). 
-</​code>​ 
pl/prolog/prolog_lab/prolog_lab_6.1200422286.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0