1 / 11

JUI - 8. přednáška Operátorová notace, typové a meta-logické predikáty, vytváření a rozklad termů

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.

glora
Télécharger la présentation

JUI - 8. přednáška Operátorová notace, typové a meta-logické predikáty, vytváření a rozklad termů

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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.

  3. 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.

  4. 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.

  5. 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

  6. 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).

  7. 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.

  8. 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

  9. 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.

  10. 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.

  11. 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.

More Related