110 likes | 219 Views
JUI - 8. přednáška Operátorová notace, typové a meta-logické predikáty, vytváření a rozklad termů. RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz. Operátorová notace.
E N D
JUI - 8. přednáškaOperátorová notace, typové a meta-logické predikáty, vytváření a rozklad termů RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
Operátorová notace • Prolog dovoluje při zápisu aritmetických výrazů používat namísto důsledné funkcionální prefixové notace také obvyklou notaci infixovou. Tato možnost se však neomezuje pouze na standardní aritmetické a číselné relační operátory, neboť Prolog poskytuje i prostředky, pomocí nichž může uživatel zavést své vlastní binární nebo unární operátory a používat je při zápisu struktur. • Je třeba zdůraznit, že zavedení operátoru rozšiřuje výhradně možnosti vstupní syntaxe termů Prologu. S definovaným operátorem není spojena žádná operace, která by se měla provádět s příslušnými argumenty. Operátorová notace dává uživateli pouze možnost učinit program nebo data v Prologu přehlednější. Definované operátory se chápou jako jiné funktory s tím, že při jejich použití se vyjadřuje složený term jinou notací, než která platí pro běžné funktory.
Definice operátoru • Definice nových operátorů se provádí pomocí speciálních klauzulí nazývaných direktivy. Direktiva definující operátor se musí systému Prolog zadat dříve, než se tento operátor použije v nějakém výrazu. • Direktiva má tento tvar: • :–op(precedence,typová_specifikace,operátor). • Jména operátorů musejí být atomy, jejich precedence se vyjadřuje číselně a přípustný rozsah je zpravidla implementačně závislý (typicky od 1 do 1200). V Prologu platí zásada, že čím je větší hodnota precedence, tím je slabší vazba mezi operátorem a jeho argumenty. Precedence operátorů a typová specifikace musejí být určeny proto, aby bylo možné rozpoznat strukturu výrazu s několika operátory.
Typové specifikace • Druhy typových specifikací: • pro infixové operátory: xfx, xfy, yfx • pro prefixové operátory: fx, fy • pro postfixové operátory: xf, yf • Kódy x a y označují argumenty, kód f definovaný operátor. • Kódy x a y určují asociativnost zaváděného operátoru podle následující konvence. Pro každý složený term se jeho precedencí rozumí precedence jeho hlavního funktoru. Jednoduchý objekt nebo výraz v závorkách má precedenci 0. Symbol x představuje argument s precedencí ostře menší než je precedence zaváděného operátoru f, symbol y představuje argument s precedencí menší nebo rovnou precedenci operátoru f.
Standardní operátory • Následující tabulka ukazuje precedence a typové specifikace standardních operátorů Prologu. • Precedence specifikace operátory • 1200 xfx :– • 1200 fx :–, ? – • 1100 xfy ; • 1000 xfy , • 700 xfx = , is , < , > , =< , >= , == , =\= , \== , =:= • 500 yfx +, – • 500 fx + , – , not • 400 yfx * , / , div • 300 xfx mod
Typové predikáty • Proměnné v Prologu nemají definovaný typ a tedy je v době výpočtu možné proměnnou vázat na datový objekt libovolné povahy. Standardní tzv. typové predikáty umožňují rozeznat typ navázaného datového objektu. • integer(X) … uspěje, když X je navázáno na celé číslo • atom(X)… uspěje, když X je navázáno na atom • constant(X) … uspěje, když X je navázáno na konstantu (číslo • nebo atom) • compound(X) … uspěje, když X je navázáno na složený term • Pokud má konkrétní dialekt Prologu zavedeny ještě další typy dat (např. reálná čísla), pak pro ně má také odpovídající typový predikát. Namísto constant se lze setkat také s predikátem atomic stejného významu a místo compound(X) lze použít notatomic(X).
Rozklad a vytváření termů • Standardní predikát (operátor) =. . umožňuje převést každý term do podoby, kterou má zápis funkce v Lispu – tedy do tvaru seznamu, jehož prvním prvkem je hlavní funktor termu a dalšími prvky jsou jeho argumenty. Operátor se používá podle schématu • Term =.. Seznam • Převod lze provádět v obou směrech. • Pomocí predikátů functor /3 a arg/3 lze odděleně získat buď samotný funktor termu, nebo libovolný z jeho argumentů. • functor(Term,F,Arita) uspěje, pokud je v termu Term hlavním funktorem F s četností Arita . • arg(N,Term,Arg) uspěje, pokud N-tým argumentem termu Term je Arg.
Meta-logické predikáty • Meta-logické predikáty jsou takové standardní prostředky Prologu, které přesahují rámec vymezený predikátovou logikou prvního řádu. Prostřednictvím těchto predikátů se můžeme dotazovat na okamžitý stav vyhodnocení cílů, pracovat s proměnnými (a ne jen s jejich hodnotami) jako objekty jazyka, a dokonce předávat k vyhodnocení jako cíle dynamicky vytvořené struktury. • Příklady meta-logických predikátů: • var, nonvar, • ==, \==, • call
Predikáty var a nonvar • Standardní prologovské predikáty var/l a nonvar/l provádějí rozlišení, zda proměnná je nastavena na konkrétní datový objekt či nikoliv. • var(X) • uspěje, právě když proměnná X není nastavena na žádný datový objekt, • nonvar(X) • uspěje, právě když proměnná X je nastavena na nějaký datový objekt.
Predikáty == a \== • Binární predikáty == a \== umožňují zjistit, zda jsou či nejsou dvě proměnné vázány na identický objekt. • X == Y • uspěje pokud X a Y jsou identické konstanty, identické proměnné, nebo struktury s identickým funktorem, četností a po řadě identickými argumenty. • X \== Y • selže právě tehdy, jsou-li X a Y identické termy.
Predikát call • V Prologu stejně jako v Lispu mají program i data stejnou syntaxi. • V Lispu je možné jakýkoliv dynamicky vytvořený symbolický výraz považovat za „program“ a vyhodnotit jej pomocí eval. • V Prologu se dociluje toho, aby se data vyhodnotila jako program (t.j. cíl) pomocí standardního predikátu call. • Při vyhodnocení cíle call (X) musí být hodnotou argumentu vyhodnotitelný cíl; systém pak vyhodnotí tento cíl a jeho výsledek je i výsledkem cíle call (X). • Hlavní použití predikátu call spočívá v možnosti interpretace dynamicky vytvářených termů, které se např. zadávají interaktivně v době výpočtu programu.