To jest stara wersja strony!
LAB: Integracja z narzędziami systemowymi
6 WPROWADZENIE
6.1 Temat: Uruchamianie programów
GJN
linia poleceń
skrypt sh
plscript
qsave
6.2 Temat: Potoki i przekierowanie we/wy
Wstęp
W systemie typu Unix (POSIX) standardowe wejście, wyjście jak i wyjście błędów 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
Więcej informacji w laboratorium z Unixa.
Potoki w Prologu
Do utworzenia potoku w Prologu można wykorzystać predykaty tell/1
, told/0
, oraz specjalny term pipe/1.
pipe/1
tworzy potok, przekierowuje standardowe wyjście do wskazanej aplikacji lub potoku.
W przykładzie poniżej tell(pipe(sort))
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.
6.3 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.
6.5 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 &
6 ĆWICZENIA
6.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?
6.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ą zdefiniowanymi 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ę.
6.3 Ćwiczenie: Wizualizacja drzewa genealogicznego
Napisz predykat:
rysuj_drzewo(+Kto,+Rodzic,+Kobieta,+Meżczyzna)
rysujący kompletne drzewo dla wskazanej osoby.
a jakie było pytanie w tym przykładzie?
Poza tym to raczej dla zainteresowanych?
Przykład drzewa genealogicznego:
drzewo_gen_przyklad.dot