To jest stara wersja strony!
7 LAB: Integracja z narzędziami systemowymi
WPROWADZENIE
Temat: Potoki i przekierowanie we/wy
Standardowe wejście jak i wyjście aplikacji można przekierować do pliku.
Do przekierowania standardowego wyjścia należy posłużyć się >, dla standardowego wejścia: <.
Przykładowo:
Przekierowanie informacji o aktualnym czasie do pliku:
date > dzisiaj.txt
Posortowanie zawartości pliku lista-osob.txt
i umieszczenie rezultatu w pliku lista-osob-posortowana
:
sort < lista-osob.txt > lista-osob-posortowana.txt
Można również zlecić wykonanie aplikacji współbieżnie (w tle):
sort < lista-osob.txt > lista-osob-posortowana.txt &
Standardowe wyjścia aplikacji można również połączyć ze standardowym wejściem innej aplikacji za pomocą potoków (ang. pipe).
Typowe użyciem potoków jest np. wyświetlenie (ls) posortowanej (sort) listy plików w aktualnym katalogu z podziałem na strony (less).
Standardowe wyjście ls
jest przekierowane do standardowego wejścia sort
, następnie wyjście sort
jest przekierowane na wejście less
.
Aplikacje uruchamiane w potoku wykonywane są współbieżnie.
ls | sort | less
Temat: Potoki w Prologu
Do utworzenia potoku można wykorzystać predykaty tell/1, told/0, oraz pipe/1.
pipe/1 tworzy potok, przekierowuje standardowe wyjście do wskazanej aplikacji lub potoku.
W przykładzie poniżej pipe/1 uruchamia aplikację systemową sort
.
osoba(franek).
osoba(jurek).
osoba(ania).
wypisz_osoby :-
osoba(X), write(X), nl, fail.
wypisz_osoby.
wypisz_posortowane :-
tell(pipe(sort)),
wypisz_osoby,
told.
Temat: GraphViz i ImageMagick
graphviz jest aplikacją służącą do wizualizacji grafów.
Przetwarza plik wejściowy z symbolicznym tekstowym zapisem węzłów oraz krawędzi i generuje plik wyjściowy w jednym z wybranych formatów: JPG, PNG, EPS, SVG, PDF, PS…
Przykładowy plik wejściowy dla grafu skierowanegoprzyklad.dot:
digraph G {
"wezel o dlugiej nazwie" -> B
B -> inny
inny -> wezelek
wezelek -> B
wezelek -> "wezel o dlugiej nazwie"
}
Wywołanie generujące graf jako obrazek PNG (graphviz generuje graf na standardowym wyjściu):
dot -T png przyklad.dot > przyklad.png
Więcej informacji: man dot
Zamiast zachowywać graf jako obrazek, można go wyświetlić korzystając z aplikacji ImageMagick (display
) oraz potoków:
dot -T png przyklad.dot | display
Czego rezultatem będzie okno z grafem:
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: graph.pl.
Przykładowe wykorzystanie rysuj.pl:
graf(jeden,dwa).
graf(dwa,trzy).
graf(trzy,jeden).
graf(jeden,cztery).
:- [graph].
rysuj :-
tell(pipe('dot -T png | display')),
dotgen(graf/2),
told.
rysuj_w :-
tell(pipe('dot -T png | display &')),
dotgen(graf/2),
told.
Temat: Uruchamianie Prologu w potoku
Program w Prologu można również uruchomić z poziomu systemu operacyjnego w potoku.
Np. do wygenerowania grafu może służyć polecenie:
swipl -f rysuj.pl -q -t 'dotgen(graf/2).' | dot -Tpng | display
bądź też współbieżnie:
swipl -f rysuj.pl -q -t 'dotgen(graf/2).' | dot -Tpng | display &
ĆWICZENIA
7.1 Ćwiczenie: Tworzenie potoków
Przeanalizuj działanie graph.pl.
Przetestuj i porównaj działanie predykatów rysuj
oraz rysuj_w
z rysuj.pl.
Jaka jest różnica? dlaczego?
7.2 Ć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:
rysuj_potomek(+Kto,+Rodzic,+Kobieta,+Mezczyzna)
gdzie Kto to osoba, dla której zostanie wygenerowane drzewo potomków, pozostałe argumenty są nazwami predykatów określającymi odpowiednio kto jest czyim rodzicem, kto jest kobietą, kto jest mężczyzną.
Przykładowe wywołanie:
rysuj_potomek(franek,rodzic/2,kobieta/1,mezczyzna/1)
Wygeneruje drzewo genealogiczne potomków dla osoby franek, przy czym rodzic/2, kobieta/1, mezczyzna/1 są zdefinowanymi predykatami, których klauzule przechowują informacje o koligacjach rodzinnych.
Podpowiedź: najpierw napisz predykat znajdujący potomków, potem dodaj generację danych dla graphviz, następnie wizualizację.
7.3 Ćwiczenie: Wizualizacja drzewa genealogicznego
Napisz predykat:
rysuj_drzewo(+Kto,+Rodzic,+Kobieta,+Meżczyzna)
rysujący kompletne drzewo dla wskazanej osoby.
Przykład drzewa genealogicznego:
drzewo_gen_przyklad.dot