JUI 10 pednka Vstup a vstup cykly RNDr

  • Slides: 9
Download presentation
JUI - 10. přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc. dvorak@uai. fme.

JUI - 10. přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc. dvorak@uai. fme. vutbr. cz

Vstup a výstup Systém předpokládá existenci aktuálního vstupního souboru (standardně klávesnice) a aktuálního výstupního

Vstup a výstup Systém předpokládá existenci aktuálního vstupního souboru (standardně klávesnice) a aktuálního výstupního souboru (standardně obrazovka terminálu). Při provádění základních operací vstupu a výstupu není třeba explicitně specifikovat, o jaké zařízení (soubor) se jedná. Základní operace vstupu a výstupu předpokládají sekvenční způsob přístupu k datům souborů. Soubory mají standardní textový charakter. Pokud mají zpracovávaná data tvar vyhovující syntaxi termů, používají se pro jejich vstup a výstup standardní predikáty read a write. Jestliže je třeba vycházet z obecněji strukturovaných dat, pak jsou k dispozici standardní predikáty get, get 0 a put pro vstup a výstup znaků. 2

Přesměrování vstupu see(Jméno_souboru) Tento predikát se splní, je-li daným jménem určen existující soubor. V

Přesměrování vstupu see(Jméno_souboru) Tento predikát se splní, je-li daným jménem určen existující soubor. V tom případě je vedlejším efektem otevření příslušného souboru a přesměrování vstupu na tento soubor. Klávesnice má pro účely této identifikace stanoveno dohodnuté jméno user. seeing(F) Vyhodnocením tohoto cíle se proměnná F nastaví na jméno aktuálního vstupního souboru. seen Tento predikát způsobí zavření aktuálního vstupního souboru a přepnutí vstupu na standardní vstupní soubor. 3

Přesměrování výstupu tell(Jméno_souboru) Tento predikát přesměruje výstup na určený výstupní soubor. Obrazovka má pro

Přesměrování výstupu tell(Jméno_souboru) Tento predikát přesměruje výstup na určený výstupní soubor. Obrazovka má pro účely této identifikace stanoveno dohodnuté jméno user. telling(F) Vyhodnocením tohoto cíle se proměnná F nastaví na jméno aktuálního výstupního souboru. told Tento predikát způsobí uzavření aktuálního výstupního souboru a přepnutí výstupu na standardní výstupní soubor. 4

Vstup termů read(X) Tento predikát způsobí načtení dalšího termu z aktuálního vstupního souboru (každý

Vstup termů read(X) Tento predikát způsobí načtení dalšího termu z aktuálního vstupního souboru (každý term zde musí být zakončen tečkou a mezerou nebo přechodem na nový řádek). Přečtený term se pak unifikuje s argumentem X a pokud je jím nenastavená proměnná, provede se nastavení X na právě přečtený term. Pokud unifikace nebyla úspěšná, cíl read(X) selže a to způsobí zpětný návrat a požadavek na splnění předchozího cíle, neboť read samotný je deterministický predikát a pro každé vyhodnocení poskytuje jen jedno řešení nebo selhání. Speciální situace nastane, pokud se při pokusu o vstup termu dosáhlo konce vstupního souboru – v takovém případě se proměnná X nastaví na hodnotu end_of_file. 5

Výstup termů write(X) Tento predikát způsobí výstup termu X na aktuální výstupní soubor. Term

Výstup termů write(X) Tento predikát způsobí výstup termu X na aktuální výstupní soubor. Term se zobrazí ve standardní podobě odpovídající syntaktické definici termů. Pro ovládání tvaru výstupu jsou k dispozici následující predikáty: tab(N) provede zápis N mezer nl způsobí přechod na nový řádek 6

Vstup a výstup znaků get 0(C) Provede se vstup jednoho znaku z aktuálního vstupního

Vstup a výstup znaků get 0(C) Provede se vstup jednoho znaku z aktuálního vstupního souboru přičemž proměnná C se nastaví na číselnou hodnotu ASCII kódu přečteného znaku. get(C) Vyhodnocením tohoto predikátu se čtecí pozice ve vstupním souboru posune až za první tisknutelný znak a číselná hodnota ASCII kódu tohoto znaku se stane hodnotou proměnné C. put(C) Do aktuálního výstupního souboru se provede záznam znaku, jehož ASCII kód má číselnou hodnotu C. 7

Cykly řízené selháním Iterativní operace je možné v Prologu provádět prostřednictvím koncové rekurze. Prolog

Cykly řízené selháním Iterativní operace je možné v Prologu provádět prostřednictvím koncové rekurze. Prolog má ale pro vyjádření iterace ještě další možnost, která se podobá repeat-until cyklu v imperativním programování. Opakování se v těchto cyklech vyvolává selháním a jsou užitečné pouze ve spojení s predikáty, které mají nějaký vedlejší účinek. Příklad: Nalezení všech možných řešení zadaného cíle. vsechna_reseni(C, X): call(C), write(X), nl, fail. vsechna_reseni(C, X). Proměnná X se musí vyskytovat v cíli C. 8

Predikát repeat je při volání okamžitě splněn a je také vždy splněn při navracení.

Predikát repeat je při volání okamžitě splněn a je také vždy splněn při navracení. Tento predikát se chová tak, jako by byl definován programem repeat: -repeat. Cyklus s podmínkou: repeat, C 1, C 2, … , Cn, Podm, !. kde C 1, C 2, … , Cn jsou cíle, které se mají splnit a Podm je podmínka ukončení cyklu. 9