Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_system [2009/03/17 22:04] gjn Links to graphviz changed to misc:graphviz |
pl:prolog:prolog_lab:prolog_lab_system [2019/06/27 15:50] (aktualna) |
| |
Więcej można przeczytać na: | Więcej można przeczytać na: |
* [[http://gollem.science.uva.nl/SWI-Prolog/Manual/initgoal.html|Initialisation files and goals]] | * [[http://www.swi-prolog.org/pldoc/doc_for?object=section%282%2c%20%272.3%27%2c%20swi%28%27%2fdoc%2fManual%2finitgoal.html%27%29%29|Initialisation files and goals]] |
* [[http://gollem.science.uva.nl/SWI-Prolog/Manual/compilation.html|Compilation]] | * [[http://www.swi-prolog.org/pldoc/doc_for?object=section%282%2c%20%272.10%27%2c%20swi%28%27%2fdoc%2fManual%2fcompilation.html%27%29%29|Compilation]] |
* [[http://gollem.science.uva.nl/SWI-Prolog/Manual/runtime.html|Generating Runtime Applications]] | * [[http://www.swi-prolog.org/pldoc/doc_for?object=section%281%2c%20%2710%27%2c%20swi%28%27%2fdoc%2fManual%2fruntime.html%27%29%29|Generating Runtime Applications]] |
| |
==== - Temat: Potoki i przekierowanie we/wy ==== | ==== - Temat: Potoki i przekierowanie we/wy ==== |
=== Potoki w Prologu === | === Potoki w Prologu === |
| |
Do utworzenia potoku w Prologu można wykorzystać predykaty ''tell/1'', ''told/0'', [[http://gollem.science.uva.nl/SWI-Prolog/Manual/IO.html#sec:edinburghIO|oraz specjalny term pipe/1]]. | Do utworzenia potoku w Prologu można wykorzystać predykat ''open/3'', [[http://gollem.science.uva.nl/SWI-Prolog/Manual/IO.html#sec:edinburghIO|oraz specjalny term pipe/1]]. |
''pipe/1'' tworzy potok, przekierowuje standardowe wyjście do wskazanej aplikacji lub potoku. | W przykładzie poniżej ''open(pipe(sort)...)'' uruchamia aplikację systemową ''sort''. |
W przykładzie poniżej ''tell(pipe(sort))'' uruchamia aplikację systemową ''sort''. | |
| |
<code prolog> | <code prolog> |
| |
osoba(franek). | osoba(franek). |
osoba(jurek). | osoba(jurek). |
osoba(ania). | osoba(ania). |
| |
wypisz_osoby :- | wypisz_osoby(A) :- |
osoba(X), write(X), nl, fail. | osoba(B), |
wypisz_osoby. | write(A, B), |
| write(A, '\n'), |
| fail. |
| |
wypisz_posortowane :- | wypisz_posortowane :- |
tell(pipe(sort)), | open(pipe(sort), write, A), |
wypisz_osoby, | \+ wypisz_osoby(A), |
told. | close(A). |
</code> | </code> |
| |
==== - Temat: GraphViz i ImageMagick ==== | ==== - Temat: GraphViz i ImageMagick ==== |
| |
| |
[[misc:Graphviz]] jest aplikacją służącą do wizualizacji grafów. | [[misc:Graphviz]] jest aplikacją służącą do wizualizacji grafów. |
==== - Metaprogramowanie i Potoki ==== | ==== - Metaprogramowanie i Potoki ==== |
| |
Metaprogramowanie można połączyć z możliwościami jakie daje tworzenie potoków do napisania uniwersalnego programu wyświetlającego graf skierowany na podstawie faktów przechowywanych przez wskazany predykat (patrz {{:pl:prolog:prolog_lab:graph.pl}}) będący argumentem wywołania predykatu ''dotegen/1'', np.: | Metaprogramowanie można połączyć z możliwościami jakie daje tworzenie potoków do napisania uniwersalnego programu wyświetlającego graf skierowany na podstawie faktów przechowywanych przez wskazany predykat (patrz {{:pl:prolog:prolog_lab:graph2.pl}}) będący argumentem wywołania predykatu ''dotegen/1'', np.: |
| |
dotgen(mojUlubionyGraf/2). | dotgen(mojUlubionyGraf/2). |
Należy zwrócić uwagę, że ''dotgen/1'' generuje graf pod warunkiem, że wskazany predykat reprezentujący graf ma 2 lub więcej argumentów; założono, że pierwsze dwa argumenty są nazwami wierzchołków tworzących krawędź. | Należy zwrócić uwagę, że ''dotgen/1'' generuje graf pod warunkiem, że wskazany predykat reprezentujący graf ma 2 lub więcej argumentów; założono, że pierwsze dwa argumenty są nazwami wierzchołków tworzących krawędź. |
| |
Przykładowe wykorzystanie {{:pl:prolog:prolog_lab:rysuj.pl}}: | Przykładowe wykorzystanie //rysuj.pl//: |
| |
<code prolog> | <code prolog> |
graf(jeden,cztery). | graf(jeden,cztery). |
| |
:- [graph]. | :- [graph2]. |
| rysuj :- |
| open(pipe('dot -T png | display'), write, A), |
| dotgen(A, graf/2), |
| close(A). |
| |
rysuj :- | rysuj_w :- |
tell(pipe('dot -T png | display')), | open(pipe('dot -T png | display &'), write, A), |
dotgen(graf/2), | dotgen(A, graf/2), |
told. | close(A). |
| |
rysuj_w :- | |
tell(pipe('dot -T png | display &')), | |
dotgen(graf/2), | |
told. | |
</code> | </code> |
| |
==== - Ćwiczenie: Tworzenie potoków ==== | ==== - Ćwiczenie: Tworzenie potoków ==== |
| |
Przeanalizuj działanie {{graph.pl}}. | Przeanalizuj działanie {{graph2.pl}}. |
| |
Przetestuj i porównaj działanie predykatów ''rysuj'' oraz ''rysuj_w'' z {{rysuj.pl}}. | Przetestuj i porównaj działanie predykatów ''rysuj'' oraz ''rysuj_w'' z {{rysuj2.pl}}. |
Jaka jest różnica? dlaczego? | Jaka jest różnica? dlaczego? |
| |
==== - Ćwiczenie: Wizualizacja drzewa genealogicznego potomków ==== | ==== - Ćwiczenie: Wizualizacja drzewa genealogicznego potomków ==== |
| |
Korzystając z predykatów określających koligacje rodzinne z [[prolog_lab_1]] oraz na podstawie {{graph.pl}} napisz predykat generujący graf będący drzewem genealogicznym określającym potomków wskazanej osoby: | Korzystając z predykatów określających koligacje rodzinne z [[pl:prolog:prolog_lab:wprowadzenie]] oraz na podstawie {{graph2.pl}} napisz predykat generujący graf będący drzewem genealogicznym określającym potomków wskazanej osoby: |
| |
rysuj_potomek(+Kto) | rysuj_potomek(+Kto) |
==== - Ćwiczenie: Wizualizacja drzewa genealogicznego potomków, metaprogramowanie ==== | ==== - Ćwiczenie: Wizualizacja drzewa genealogicznego potomków, metaprogramowanie ==== |
| |
Korzystając z predykatów określających koligacje rodzinne z [[prolog_lab_1]] oraz na podstawie {{graph.pl}} napisz predykat generujący graf będący drzewem genealogicznym określającym potomków wskazanej osoby: | Korzystając z predykatów określających koligacje rodzinne z laboratorium [[wprowadzenie]] oraz na podstawie {{graph.pl}} napisz predykat generujący graf będący drzewem genealogicznym określającym potomków wskazanej osoby: |
| |
rysuj_potomek(+Kto,+Rodzic,+Kobieta,+Mezczyzna) | rysuj_potomek(+Kto,+Rodzic,+Kobieta,+Mezczyzna) |
{{:pl:prolog:prolog_lab:drzewo_gen_przyklad.png}} | {{:pl:prolog:prolog_lab:drzewo_gen_przyklad.png}} |
| |
====== Komentarze, propozycje, wątpliwości ====== | ====== Uwagi, komentarze, propozycje ====== |
| Tu studenci mogą wpisywać swoje uwagi. |
| |
| |
| |
| --- //[[gjn@agh.edu.pl|Grzegorz J. Nalepa]] 2009/05/06 09:13// |