A Mercury programozási nyelv

Célok

Célnak nevezzük a következő formájú kifejezéseket:

some Vars Goal
Egzisztenciálisan kvantált kifejezés. Vars-nak egy változókból álló listának kell lennie. Goal-nak egy érvényes célnak kell lennie.

Minden egzisztenciális kvantálás egy új érvényességi kört vezet be. Vars-ban szereplő változók lokálisak a Goal célban: minden Vars-ban szereplő változó, és ennek minden ugyanilyen nevű előfordulása a Goal-ban különböző változót jelöl minden olyan változótól, melynek ugyanez a neve, de az egzisztenciális kvantáláson kívül helyezkednek el.

A működést tekintve az egzisztenciális kvantálásnak nincs hatása, vagyis a változó érvényességi körére vonatkozó hatásától eltekintve a some Vars Goal kifejezés megegyezik a Goal kifejezéssel.

A Mercury implicit kvantálásra vonatkozó szabályai szerint a változók gyakran implicit egzisztenciálisan kvantálttá válnak. Általában az egzisztenciális kvantorok explicit kiírására nincs szükség.

all Vars Goal
Univerzálisan kvantált kifejezés. Vars-nak egy változókból álló listának kell lennie. Goal-nak egy érvényes célnak kell lennie. Ez egy rövidítése a not (some Vars not Goal) kifejezésnek.
Goal1, Goal2
Konjugáció. Goal1-nek és Goal2-nek érvényes célnak kell lennie.
Goal1 ; Goal2
ahol Goal1 nem Goal1a -> Goal1b alakú: diszjunkció. Goal1-nek és Goal2-nek érvényes célnak kell lennie.
true
üres konjugáció. Mindig sikeres.
fail
üres diszjunkció. Mindig sikertelen.
not Goal
\+ Goal
Negáció. A két különböző szintaxis ugyanazt a szemantikát takarja. Goal-nak érvényes célnak kell lennie. Mindkét alak ekvivalens az if Goal then fail else true kifejezéssel.
Goal1 => Goal2
Implikáció. Ez egy rövidítése a not (Goal1, not Goal2) kifejezésnek.
Goal1 <= Goal2
Fordított implikáció. Ez egy rövidítése a not (Goal2, not Goal1) kifejezésnek.
Goal1 <=> Goal2
Logikai ekvivalencia. Ez egy rövidítése a (Goal1 => Goal2), (Goal1 <= Goal2) kifejezésnek.
if CondGoal then ThenGoal else ElseGoal
CondGoal -> ThenGoal ; ElseGoal
Egy if-then-else kifejezés. A két különböző szintaxis ugyanazt a szemantikát takarja. CondGoal, ThenGoal, és ElseGoal egy érvényes cél. Vegyük észre, hogy az "else" ág nem opcionális.

A deklaratív szemantikában egy if-then-else ( CondGoal, ThenGoal ; not(CondGoal), ElseGoal ) formájú, műveleti szemantikában azonban más a helyzet, és a feldolgozása is különbözik a determinizmus céljainak következményei miatt. A működését tekintve először végrehajtódik a CondGoal, és ha ez sikeres, akkor vegrehajtás a ThenGoal-lal folytatódik; egyébként, vagyis ha a CondGoal sikertelen, az ElseGoal hajtódik végre. Vegyük észre, hogy a CondGoal lehet nemdeterminisztikus -- ellentétben a Prolog-gal, a Mercury az if-then-else kifejezéseiben nem szorítkozik csupán a feltétel első megoldására, ha a feltétel sikeres.

Term1 = Term2
Egy egyesítés. Term1-nek és Term2-nek egy érvényes adat-termnek kell lennie.
Term1 \= Term2
Egy egyenlőtlenség. Term1-nek és Term2-nek egy érvényes adat-termnek kell lennie. Ez egy rövidítése a not (Term1 = Term2) kifejezésnek.
call(Closure)
call(Closure1, Arg1)
call(Closure2, Arg1, Arg2)
call(Closure3, Arg1, Arg2, Arg3)
...
Egy magasabbrendű predikátum hívása. A Closure és az Arg argumentumoknak érvényes adat-termeknek kell lennie. call(Closure)csupán meghívja a megadott függvényt. A többi kifejezésforma esetén a megadott argumentumokat a függvény argumentumlistájához fűzzük a függvény meghívása előtt. Lásd Magasabb rendű programozás.
Var
Var(Arg1)
Var(Arg2)
Var(Arg2, Arg3)
...
Egy magasabbrendű predikátum hívása. Var-nak változónak kell lennie. A szemantikájuk pontosan megegyezik a megfelelő, a call/N szintaxist használó magasabbrendű hivás szemantikájávall, vagyis a call(Var), call(Var, Arg1), stb. szemantikájával.
Call
Minden olyan célnak, ami nem illeszkedik egyetlen fenti formájú célra sem, predikátumhívásnak kell lennie. A term legfelsőbb szintű funktora határozza meg a meghívott predikátumot; ennek a predikátumnak az adott modulban vagy egy importált modul interfészében deklarálva kell lennie egy pred deklarációban. Az argumentumoknak érvényes adat-termeknek kell lennie.