11
JUI - 8. přednáška Operátorová notace, typové a meta-logické predikáty, vytváření a rozklad termů RNDr. Jiří Dvořák, CSc. [email protected]

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

  • Upload
    glora

  • View
    27

  • Download
    1

Embed Size (px)

DESCRIPTION

JUI - 8. přednáška Operátorová notace, typové a meta-logické predikáty, vytváření a rozklad termů. RNDr. Jiří Dvořák, CSc. [email protected]. Operátorová notace. - PowerPoint PPT Presentation

Citation preview

Page 1: 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, [email protected]

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

2

Operátorová notaceProlog 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.

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

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.

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

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.

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

5

Standardní operátoryNá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

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

6

Typové predikátyPromě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 not atomic(X).

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

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.

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

8

Meta-logické predikátyMeta-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

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

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.

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

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.

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

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.