Dialóg so systémom Prolog


  1. Základné pojmy
  2. Reprezentácia faktov
  3. Operátorový zápis štruktúry
  4. Dialóg používateľa so systémom
  5. Použitie premenných pri kladení otázok
  6. Formulácia zložených otázok
  7. Používanie pravidiel
  8. Návrh jednoduchej databázy
  9. Objekty jazyka Prolog

Základné pojmy

A jelikož se vývoj žádného dialógu nedá předvídat pouze jednou z účastněných stran, musí se útočící uchýlit k jedinému zbývajícímu prostředku, totiž odříkat pokud možno celý dialóg sám. Programovanie v Prolog-u pozostáva z dvoch krokov: .

Reprezentácia faktov

Fakt je tvorený štruktúrou
    funktor(arg1, arg2, ... , argN).
kde funktor reprezentuje vlastnosť, resp. vzťah a kde argumenty predstavujú jednotlivé objekty, ktorých sa vlastnosť alebo vzťah týka. Každý fakt musí byť ukončený bodkou, za ktorou musí nasledovať aspoň jedna medzera, alebo znak nového riadku. Keď budeme v ďalšom uvádzať príklady štruktúr, budeme ich zapisovať ako fakty (aby pri pokusoch s nimi začiatočníci nezabudli na bodku) ale musíme si byť vedomí toho, že bodka nie je súčasťou štruktúry. Je to dôležité pri použití štruktúry ako zložky nadradenej štruktúry.

Príklad

Úlohou je zapísať v jazyku Prolog nasledujúce výroky: Dana je dievča a Jana ľúbi pivo. Prvý výrok obsahuje informáciu o jednej vlastnosti (je dievča) objektu (Dana). Druhý výrok vyjadruje vzťah (ľúbi) dvoch objektov (Jana a pivo ):
    dievca(dana).       lubi(jana,pivo).
Atómy (odpovedajúce približne textovým konštantám procedurálnych jazykov) začínajú v Prolog-u malými písmenami. Považujeme ich za štruktúry s nulovým počtom argumentov.

Argumentami štruktúry môžu byť ľubovoľné objekty jazyka, teda aj štruktúry. To umožňuje vytvárať v zásade ľubovoľne zložité, hierarchicky členené štruktúry.

Je ovšem potrebné si uvedomiť, že predikáty so zhodným menom ale s rozdielnym počtom argumentov sa pokladajú v Prolog-u za odlišné, teda nasledujúce fakty definujú dva rôzne predikáty:

   lubi(peter,kovac,pivo).    lubi(kovac,pivo).

Príklad

Úlohou je vyjadriť v Prolog-u výrok Peter ľúbi plzenské pivo. Základom výroku je binárny vzťah Peter ľúbi pivo, ktorý je doplnený vlastnosťou pivo je plzenské. Pôvodný výrok je potom možné reprezentovať pomocou hierarchickej štruktúry (pre ujasnenie hierarchie je výhodné štruktúru zobraziť pomocou stromu):
                                       lubi
                                     +--+---+
lubi(peter,pivo(plzenske)).        peter   pivo
                                            |
                                         plzenske

Operátorový zápis štruktúry

V prípade jedného alebo dvoch argumentov je možný aj čitateľnejší, tzv. operátorový zápis štruktúry, ale za predpokladu, že funktor je deklarovaný ako operátor.
Pri deklarácii sa zadávajú tri príznaky, charakterizujúce každý operátor:
1. precedencia ....
celé číslo, udávajúce,v akom poradí sa majú aplikovať operátory (keď toto poradie nie je explicitne vyjadrené zátvorkami); čím je toto číslo väčšie, tým slabšia je väzba operátora s operandami, napr. keď precedencie + a * 500 a 400, potom a*b+c*d = (a*b)+(c*d) ,
2. pozícia ......
atóm, udávajúci polohu operátora (f ) voči operandom (x,y);operátor teda môže byť:

fx - prefixný
xf - postfixný
xfx - infixný, ktorý nemá zmysel reťaziť
xfy - vpravo asociatívny infixný,


yfx - vľavo asociatívny infixný,

3. meno ..........
atóm, zhodný s funktorom štruktúry.


Vlastná deklarácia sa robí pomocou štandardného predikátu op s vyššie uvedenými tromi argumentami. Deklaráciu operátorov možno vykonať dvojako:
- v programe sa uvedú príslušné predikáty op v rámci príkazu, začínajúceho :-
- v priebehu dialógu sa uvedú príslušné predikáty op po výzve ?- systému ale v každom prípade pred prvým použitím operátora.

Príklad

Úlohou je navrhnúť operátorový zápis výrokov z predchádzajÚcich príkladov . Deklarujme nasledujúce operátory:
:-  op(90,xf,pivo), op(100,xfx,lubi), op(100,xf,je_dievca).
Potom nasledujúce dvojice zápisov sú rovnocenné:
  je_dievca(dana).            dana je_dievca.
  lubi(jana,vino).            jana lubi vino.
  lubi(peter,pivo(plzenske)). peter lubi plzenske pivo.

Dialóg používateľa so systémom

Po zavedení systému Prolog sa objaví hlavička a nápovedný atóm ?-, ktorý vždy znamená, že systém očakáva používateľovu otázku, ktorá musí byť ukončená vždy bodkou a stlačením klávesu ENTER.

Príklad

Úlohou je zistiť odpoveď na dve otázky:
Je 3 väčšie ako 2 ?
Je 5 rovné 4 ? Dialóg so systémom bude nasledovný (odlišným písmom budú v dialógoch označené výpisy systému a obyčajným písmom text, zadávaný používateľom):
   ?- 3>2.
   yes

   ?- 5=4.
   no
Z predošlého dialógu je zrejmé, že systém "pozná" niektoré základné vzťahy z reálneho sveta vo forme zabudovaných predikátov, napr. =, > atď. Pritom komunikácia so systémom prebieha bez akýchkoľvek explicitných príkazov čítania a výpisu.

"Svet" zabudovaných predikátov je ale veľmi obmedzený. Keď používateľ chce riešiť úlohy v zložitejšom "svete", musí uložiť do databázy Prolog-u nové vzťahy, charakterizujúce tento "svet". Príslušné vzťahy sa zadávajú vo forme klauzúl. Do databázy ich môžeme načítať (v prologovskom slangu sa hovorí "nakonzultovať") z nejakého súboru. Predikáty pre čítanie programu zo súboru (medzi vstupno / výstupnými predikátmi).

Príklad

Predpokladajme, že databáza je tvorená faktami:
  lubi(peter,mara).    lubi(jana,pivo).
  lubi(dana,vino).     lubi(peter,pivo).
  dievca(dana).        dievca(jana).     dievca(mara).
Úlohou je zistiť, či Mara a Viera sú dievčatá. Odpoveď zistíme v priebehu dialógu (pre objasnenie uvádzame ešte naviac v apostrofoch prepisy otázok používateľa a v úvodzovkách význam odpovedí systému):
 ?- dievca(mara).    'je Mara dievča ?'
 yes                  "áno"

 ?- dievca(viera).   'je Viera dievča ?'
 no                   "nemám  informáciu o tom,
                       či Viera je dievča"

Použitie premenných pri kladení otázok

V dialógu je možné klásť aj otázky, v ktorých sa vyskytujú opytovacie zámená. Týmto zámenám odpovedajú pri formálnom prepise premenné (začínajú veľkým písmenom alebo podčiarnikom). Keď sa v otázke vyskytuje premenná, potom systém vo svojej odpovedi oznámi aj objekt, na ktorý sa táto premenná viazala.
    Po tomto ozname sa očakáva pokyn používateľa, ktorý môže byť:
  1. stlačenie klávesy ENTER (nepožaduje sa hľadanie prípadného ďalšieho riešenia)
  2. stlačenie bodkočiarky (požaduje sa hľadanie ďalšieho riešenia)
Konkrétna forma dialógu je v niektorých detailoch implementačne závislá. V celom texte bude použitý dialóg so systémom Arity/Prolog. Jeho súčasťou je napríklad aj -> po výpise viazania premenných ako výzva na pokyn používateľa. V LPA Prolog-u sa namiesto -> vypisuje text SPACE BAR = next solution.

Príklad

Úlohou je zistiť kto všetko je dievča, koho ľúbi Peter, kto ľúbi pivo a kto ľúbi koho:
?- dievca(D).            'ktoré dievčatá poznáš ?'
D = dana ->;    "Dana"    'a ešte ?'
D = jana ->;    "Jana"    'a ešte ?'
D = mara ->;    "Mara"    'a ešte ?'
no                        "ďalšie dievča nepoznám"

?- lubi(peter,Koho).     'koho ľúbi Peter'
Koho =  mara ->;          "Maru"  'a ešte ?'
Koho =  pivo ->;          "pivo"  'a ešte ?'
no                        "o nikom ďalšom neviem"

?- lubi(Kto,pivo).       'Kto ľúbi pivo ?'
Kto = jana ->;      "Jana"      'a ešte?'
Kto = peter ->;     "Peter"     'a ešte ?'
no                        "nepoznám nikoho ďalšieho"

?- lubi(Kto,Koho).       'Kto ľúbi Koho ?'
Kto = peter ,             "Peter ľúbi
Koho = mara ->;            Maru "    'a ešte ?'
Kto = jana ,              "Jana ľúbi
Koho = pivo               pivo"    'to stačí'
yes                       "áno, zodpovedal som tvoju otázku"
Posledné tri otázky (spolu so štvrtou možnosťou - otázka bez premennej, napr.: lubi(peter, sparty) ) dobre ilustrujú možnosť "viacúčelového" použitia prologovských predikátov. Nie je teda potrebné vopred deklarovať, ktoré argumenty musia byť pri "volaní" predikátu viazané (a už vôbec nie na aký objekt jazyka - nevyžaduje sa teda deklarácia typu) a ktoré musia byť voľné (použijúc terminológiu procedurálnych jazykov: ktoré sú vstupné a ktoré výstupné). Uvedený dialóg je tiež názornou ukážkou generujúcej schopnosti Prolog-u.

Použitím operátorov je možné dosiahnuť ešte prirodzenejšiu formu dialógu.

Príklad

Nech sú v databáze uložené fakty
    lubi(peter,pivo(plzenske)).        lubi(peter,dievca).
a nech sú deklarované operátory (v zhode s príkladom ):
  :-  op(90,xf,pivo), op(100,xfx,lubi).
Úlohou je využiť operátory v dialógu so systémom:
 ?- peter lubi Co.
 Co = plzenske pivo -> ;
 Co = dievcata -> ;
 no

 ?- Kto lubi Dobre pivo.
 Kto = peter,
 Dobre = plzenske -> ;
 no
Prvá časť dialógu dobre ilustruje skutočnosť, že v štandardnom Prolog-u sú premenné netypované (nie je vopred deklarované na aké objekty sa môže viazať): plzenske pivo je štruktúra, ale dievcata je atóm. Pri zložitejších štruktúrach vyniknú uvedené skutočnosti ešte výraznejšie.

Príklad

Nech sú v databáze uložené fakty
    ma_rad(peter, zeny(blond, stihle)    ).
    ma_rad(jozo,  zeny(brunet,baculate)  ).
    ma_rad(fero,  karban(marias)         ).
    ma_rad(jozo,  karban(taroky)         ).
    ma_rad(peter, chlast(pivo(saris,12)) ).
    ma_rad(fero,  chlast(pivo(plzen,10)) ).
    ma_rad(fero,  chlast(rum(tuzemsky))  ).
Úlohou je formulovať rôzne otázky týkajúce sa vzťahu ma_rad:
  ?- ma_rad(Kto, chlast(Alky) ).
               'Kto má rád aký alkohol ?'
  ?- ma_rad(Kto, chlast(_) ).
               'Kto rád pije ?'
  ?- ma_rad(Kto, chlast(pivo(_,12))).
               'Kto rád pije dvanástku ?'
  ?- ma_rad( _ , chlast(pivo(Ake,12))).
               'Ake dvanástky poznáš ?'
  ?- ma_rad(Kto, zeny(_,stihle) ).
               'Kto má rád štíhle ženy ?'
  ?- ma_rad(fero, KohoCo).
               'Koho (čo) má Fero rád ?'
Použitím anonymnej premennej (podčiarnika) dávame najavo, že na viazaní daných premenných nám nezáleží. Kladenie otázok typu
?- ma_rad(Kto, Nerest(_) ).
               'Kto má akú neresť ?'
v očakávaní, že dostaneme odpovede Nerest = karban a Nerest = chlast v štandardnom Prolog-u nie je možné. Je však možné dostať sa aj na mená funktorov (príklad na vyhľadanie mien funktorov) a získať tak odpovede uvedeného typu.

Formulácia zložených otázok

Uvedené jednoduché otázky možno spájať pomocou dvoch spojok (a, alebo) do otázok zložených, pričom spojke a (konjunkcii) v Prolog-u odpovedá čiarka a spojke alebo (disjunkcii) bodkočiarka. O použití negácie je pojednané v kapitole Negácia podcieľov.

Príklad

Úlohou je zistiť, či sú pravdivé výroky Peter ľúbi pivo a víno a Peter ľúbi pivo alebo víno:
?- lubi(peter,pivo), lubi(peter,vino).
           'ľúbi Peter aj pivo aj víno ?'
no         "nie"

?- lubi(peter,pivo); lubi(peter,vino).
           'ľúbi Peter pivo alebo víno ?'
yes        "áno"

Používanie pravidiel

Ako už bolo v úvode spomenuté, všeobecné konštatovania o objektoch a o vzťahoch medzi nimi sa v Prolog-u reprezentujú pomocou pravidiel. Jedná sa o výroky typu keď T potom H, reprezentované štruktúrami (s infixným operátorom :- ) tvaru:
       hlava :- telo.
Hlavu tvorí štruktúra, reprezentujúca nadradený cieľ H (funktor udáva meno predikátu, definovaného týmto pravidlom). Telo je štruktúra, reprezentujúca podmienku T pre splnenie nadradeného cieľa. Telo pravidla niekedy obsahuje iba jeden podcieľ, ale môže ho tvoriť aj zložená podmienka. Čiastkové štruktúry (reprezentujúce príslušné podciele) spojené operátormi konjunkcie (čiarkami - reprezentujú spojku a) a disjunkcie (bodkočiarkami - reprezentujú spojku alebo), pričom je možné použiť aj negáciu (not - pozri kapitolu Negácia podcieľov ). Pravidlo musí byť ukončené bodkou, za ktorou nasleduje znak nového riadku, alebo aspoň jedna medzera.

Príklad

Úlohou je zapísať v Prolog-u: Peter ľúbi dievčatá, ktoré ľúbia pivo. Vyjadríme zadaný výrok trochu formálnejšie: keď D je dievča a D ľúbi pivo, potom Peter ľúbi D čo sa už dá prepísať do Prolog-u nasledovne:
  lubi(peter,D) :- dievca(D), lubi(D,pivo).
Premenná D slúži k odovzdávaniu informácií medzi jednotlivými podcieľmi tela pravidla, ako aj medzi telom a hlavou pravidla. Premenná je však lokálna v rámci pravidla - medzi pravidlami nemožno pomocou nej prenášať žiadne informácie.

Nech databáza obsahuje pred uvedeným pravidlom aj nasledujúce fakty:

lubi(peter,pivo).   dievca(jana).    lubi(jana,pivo).
Potom v dialógu
   ?- lubi(peter,KohoCo).
   KohoCo = pivo -> ;
   KohoCo = jana -> ;
   no
získal systém prvú odpoveď priamo z databázy, ale druhú si musel odvodiť, nakoľko databáza neobsahuje explicitnú informáciu o vzťahu Petra k Jane.

Príklad

Predpokladajme databázu z predchádzajÚceho príkladu - Úlohou je navrhnúť predikát, ktorým získame záľuby jednotlivých osôb ale bez ich podrobnejšej špecifikácie. Hľadáme teda iba mená funktorov bez ohľadu koľko majú argumentov a chceme sa naviac vyhnúť výpisu argumentov príslušných štruktúr. Na mená funktorov je možné sa dostať pomocou zabudovaného predikátu functor(Štruktúra,Meno,Arita):
 neresti(Kto,Ake) :- ma_rad(Kto,Co),
 functor(Co,Ake,_).
Použitie novonavrhnutého predikátu ilustruje dialóg:
   ?- neresti(peter,Ake).
   Ake = zeny -> ;
   Ake = chlast -> ;
   no

Návrh jednoduchej databázy

Príklad

Úlohou je navrhnúť prologovskú databázu, reprezentujúcu rodinné vzťahy, naznačené stromom na obrázku.
                     zuza--+--karol
                           |
                     +-----+-----+
                     |     |     |
          jano--+--jana  dana  milan-----eva
                |
            +---+---+
            |       |
          peter    anna--+--jozo
                         |
                       viera
Zaveďme predikát rodicia s tromi argumentami: Matka, Otec, Dieťa. Tento predikát je možné definovať v súlade so zadaným stromom pomocou nasledujúcich faktov:
 rodicia(zuza,karol,jana    ).  rodicia(zuza,karol,dana ).
 rodicia(zuza,karol,milan   ).  rodicia(jana,jano ,peter).
 rodicia(jana,jano ,anna    ).  rodicia(anna,jozo ,viera).
 rodicia(eva ,milan,bezdetni).
Bolo potrebné zaviesť špeciálne označenie bezdetni, aby sme mohli pomocou predikátu rodicia reprezentovať aj bezdetné manželské páry.Príklad Pomocou databázy z predošlého príkladu je potrebné zistiť, kto je Petrov dedo. Úlohou je zovšeobecniť vzťah "dedo - vnúča". Petrovho deda zistíme v priebehu dialógu (naša otázka odpovedá výroku dedo je rodičom Petrovej matky, alebo Petrovho otca):
?- rodicia(_,Dedo,Rodic), (rodicia(Rodic,_,peter);
rodicia(_,Rodic,peter)).
Rodic = jana,
Dedo = karol -> ;
no
Prvá časť otázky znamená Dedo je otec Rodic-a. A súčasne (konjunkcia) s touto prvou požiadavkou má platiť, že Rodic je matka alebo otec "argumentu" peter (druhá časť otázky). Disjunkciu je potrebné uzavrieť do zátvoriek, nakoľko bodkočiarka slabšie viaže operandy ako čiarka predchádzajúcej konjunkcie. Vo svojej odpovedi systém oznámil riešenie, ktoré našiel. Bodkočiarka vyjadruje používateľov pokyn, aby sa systém pokúsil nájsť ďalšie riešenie. Tento pokus bol neúspešný, čo systém oznámil lakonickým no. Podčiarnikmi sme označili v otázke anonymné premenné (premenné, na ktorých "nezáleží", ktoré sa vyskytujú v otázke iba raz).

Vypisovanie podobných dlhých otázok je nepohodlné. Naviac je možné zložitejšie otázky s výhodou hierarchicky členiť na podotázky, ktorým odpovedajú pomocné predikáty. V našom príklade naznačený rozklad vedie na tieto štyri pomocné predikáty:

dedo(Dedo, Vnuca)  :- otec(Dedo,R), rodic(R,Vnuca).
rodic(Rodic,Dieta) :- otec(Rodic,Dieta) ; matka(Rodic,Dieta).
otec(Otec, Dieta)  :- rodicia(_,Otec, Dieta), Dieta\= bezdetni.
matka(Matka,Dieta) :- rodicia(Matka,_,Dieta), Dieta\=bezdetni.
Uvedené pravidlá sú "čitateľnejšie" ako pôvodná otázka a naviac tri prvé - pomocné - pravidlá sa budú hodiť aj pri definovaní ďalších predikátov, charakterizujúcich iné rodinné vzťahy. Aj tu sme použili anonymné premenné všade tam, kde neprenášajú informáciu medzi jednotlivými časťami pravidla. Prvý argument podcieľa rodicia v tele prvého pravidla sme síce mohli označiť premennou Matka, ale táto premenná nikde inde v uvažovanom pravidle nevystupuje a použím anonymnej premennej zdôrazníme, že sme ju úmyselne inde nepoužili, že nám na nej skutočne nezáleží.

Bez testov na konci posledných dvoch pravidiel by systém dával nezmyselné odpovede, napr.:

 ?- otec(milan,Dieta).
 Dieta = bezdetni ->    'nechceme hľadať ďalšie riešenia'
 yes
Odpoveď na pôvodnú otázku teraz získame jednoduchšie:
 ?- dedo(Dedo,peter).
 Dedo = karol ->        'nechceme hľadať ďalšie riešenia'
 yes

Príklad

Úlohou je definovať predikát stryko pre rodinu z predchádzajÚceho príkladu . Podobne ako v predošlom príklade definujeme strýka deklaratívne ako brata jedného z rodičov, teda:
stryko(Stryko,SynovecNeter) :- brat(Stryko,Rodic),
                               rodic(Rodic,SynovecNeter).

brat(Brat,Surodenec)        :- surodenci(Brat,Surodenec),
                               muz(Brat).

surodenci(Sur1,Sur2)        :- rodicia(Matka,Otec,Sur1),
                               rodicia(Matka,Otec,Sur2),
                               Sur1\=Sur2.

muz(Otec)                   :- rodicia(_,Otec,_),  Otec  \= slob.
Aby sme deklarovali, že niekto nemôže byť sám sebe súrodencom, použili sme symbol nerovnosti \=. Predikát muz dáva v niektorých prípadoch chybné výsledky, napr.:
 ?- muz(peter).
 no
Pre odstránenie uvedeného nedostatku je potrebné pôvodnú databázu doplniť o ďalšie fakty, vďaka ktorým aj slobodní chlapci budú považovaní za mužov a slobodné dievčatá za ženy:
   rodicia(viera, slob,  bezdetni).
   rodicia(slob,  peter, bezdetni).
   rodicia(dana,  slob,  bezdetni).
Chovanie predikátu muz ostáva však nekorektné pri generovaní alternatív. Napríklad na otázku muz(X) dostaneme trikrát po sebe odpoveď X = karol. Súvisí to s neefektívnou formou reprezentácie rodičovských vzťahov. V príklade na reprezentáciu stromu rodiny v kapitole Rekurzívne údajové štruktúry - zoznamy bude tento nedostatok odstránený.

Objekty jazyka Prolog

V predošlých kapitolách sme postupne a neformálne zaviedli definície jednotlivých objektov jazyka Prolog. Teraz uvedieme ich ucelenejší prehľad. Jedinými objektmi jazyka Prolog sú termy.
Čísla
sa v štandardnom Prolog-u chápu ako celé nezáporné čísla (rozsah je implementačne závislý).
Atóm
pripomína textovú konštantu iných jazykov, ale atómami môžu byť viaceré typy objektov:
Džžka atómu je ohraničená iba implementačne (napr. v Arity/Prolog-u ho môže tvoriť nanajvýš 255 znakov).
Premenná
je špeciálny objekt, ktorý sa v procese unifikácie (pozri kapitolu Unifikácia a viazanie premenných ) naviaže na akýkoľvek iný term (viazanie nie je priradením hodnoty). Nie je potrebné deklarovať typ premennej (typ objektov na ktoré sa môže naviazať). Premenné sú lokálne v rámci jednej klauzuly (resp. otázky). Slúžia iba na prenos informácie v rámci tejto klauzuly a nemožno ich použiť na prenos informácií medzi klauzulami. Meno premennej je tvorené postupnosťou alfanumerických znakov, ktorá musí začínať veľkým písmenom alebo podčiarnikom. Keď je premenná použitá v klauzule iba raz, je možné na tomto mieste použiť samotný podčiarnik - anonymnú premennú. V otázke sa anonymná premenná používa na vyjadrenie skutočnosti, že používateľa nezaujíma objekt, na ktorý sa táto premenná naviaže pri nájdení odpovede. V niektorých odpovediach systému a najmä v ladiacich výpisoch sa vyskytujú vnútorné mená premenných - celé čísla, pred ktorými je podčiarnik.
Štruktúra
je jediný zložený objekt jazyka Prolog. Jej všeobecný tvar je f(z1, .. zN), kde zi sú argumenty a f je N-árny funktor. Funktor je atóm. Zložkami štruktúry môžu byť akékoľvek termy, teda aj štruktúry - to umožňuje vytvárať hierarchicky členené štruktúry. Počet zložiek a hĺbka vnorenia zložených štuktúr majú iba implementačné obmedzenia (napr. počet argumentov v Arity/Prolog-u nesmie presiahnuť hodnotu 255). Dve štruktúry s rovnakým funktorom ale s rozdielnym počtom zložiek chápe Prolog ako zásadne odlišné objekty. Okrem všeobecných štruktúr je k dispozícii jedna špeciálna rekurzívna štruktúra - zoznam - s používateľsky príjemnejším formalizmom zápisu (pozri kapitolu Rekurzívne údajové štruktúry - zoznamy ). Je možný aj operátorový zápis unárnych a binárnych štruktúr - v prvom prípade je operátor pred alebo za operandom, v druhom prípade je operátor medzi operandami. Operátory a operandy sú navzájom oddelené medzerami (podrobnosti boli uvedené v kapitole Operátorový zápis štruktúry ; operátory Arity/Prolog-u ).
˙