GNU MathProg Language

Alapok

Nyelvi Elemek

A GMPL-ben előforduló nevek az ASCII táblában szereplő kis- és nagybetűkből, számokból és _ karakterből épül fel. A legtöbb nyelvhez hasonlóan a név nem kezdődhet számmal.

A GMPL szám literáljai a megszokottak: egészek, tizedestörtek, normál alakú számok. A string literálok ' vagy " karakterek közé írandók, szükség esetén dupla karakterrel escape-elhetők.

56 .752 1.2E+8 1.2e-8 'string' "masik string" "strin ""escape""-pel"

A GMPL-ben foglalt minden olyan kulcsszó, ami egy kifejezésben értelmes (pl.: and, mod, symdiff, if, else, ...), az egyéb kulcsszavak használhatók névként (solve, for, ...). A GMPL-ben fix jelentésűek az operátorok és különböző zárójelfajták. Ezek a következők:

+ ^ == ! : ( ) - & >= && ; [ ] * < > || | { } / <= <> , . .. ** = != :=

A GMPL-ben egyaránt használható = és == operátor is egyenlőség-vizsgálatra, != és <> pedig egyenlőtlenség-vizsgálatra. Az értékadás operátor a :=. Hatványozás esetén a ** és ^ operátor működése is megegyezik. A kerek zárójel csak a kifejezések csoportosítására használható, a szögletes zárójel a tömbök indexelésére szolgál, minden egyéb esetben a kapcsos zárójel használandó! A többi operátor a közismert nyelvekben megszokott módon használható.

Egysoros kommenteket # után, többsorosakat /* és */ közé írhatunk.

Kifejezések

Numeric

A numerikus kifejezés a legalapvetőbb kifejezése minden nyelvnek. A GMPL-ben minden esetben lebegőpontos számokkal van dolgunk, így a konverzió nem jelenthet problémát. A numerikus kifejezésekben használható függvények a következők:

max(-5^2.3-card(I), 0)

Numerikus kifejezésekre hívható aggregátor függvények a sum, prod, min, max

sum{j in J} (x[3])

Logical

A logikai kifejezések egyetlen igaz/hamis értéket képviselhetnek. Numerikus kifejezések automatikusan konvertálódnak logikaivá: a 0 értéke hamis, minden egyébé igaz.

A GMPL-ben lehetőségünk van elsőrendű logikai kifejezések írására is a forall és exists kifejezések használatával. Például:

forall{i in I, j in J} a[i,j] < b

Logikai operátorok és kifejezések:

not x, !x x and y, x && y x or y, x || y x < y x <= y x = y, x == y x >= y x <> y, x != y x in Y (x,y,z) in Y x not in Y, x !in Y (x,y,z) not in Y , (x,y,z) !in Y X within Y X not within Y, X !within Y

Symbolic

A string-kezelés meglehetősen korlátozott a GMPL-ben, hiszen nem játszik központi szerepet. A string-műveletek a substr és a time2str, valamint az összefűzés operátor (&). A numerikus kifejezések automatikusan stringgé konvertálódnak.

Indexing

Az indexelő kifejezésekkel lokális futóindexeket vezethetünk be. A kifejezésben az entry-k felsorolása után megadható egy feltétel. Az entry-k lehetnek futóindex-definíciók (i in MySet) vagy alaphalmazt meghatározó halmaz-kifejezések.

Az alábbi index-kifejezés megegyezik az alatta lévő pszeudo-kóddal.

{i in A, (j,k) in B, l in C : i <= 5 and k <> 'Mar'} for all i ∈ A do for all (j, k) ∈ B do for all l ∈ C do if i <= 5 and k != 'Mar' then action;

Set

Halmazokkal fejezhetünk ki gyűjteményeket. A halmazok legalapvetőbb formája a literál.

Halmaz literálok esetében egyszerűen felsoroljukn az elemeket:

{1,2,3,4,5,6,7,8,9,10}

Az aritmetikai halmazokkal számtani sorozatokat készíthetünk:

1..10 1..20 by 2

Készíthetünk halmazokat iteráltak segítségével. Ehhez a setof kulcsszót használhatjuk:

setof {i in 1..10| i mod 2 == 0} (i, i^2) == {(2,4), (4,16), (6,36), (8,64), (10,100)} setof {i in 1..10, j in 10..20} (i, j) == I cross J

Két halmaz között értelmezett műveletek:

X union Y # unió X diff Y # különbség X symdiff Y # szimmetrikus differencia X inter Y # metszet X cross Y # keresztszorzat

Linear

A lineáris kifejezések szabad változójú numerikus kifejezések, így tulajdonképpen lineáris függvények.

2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z # Rengeteg szabad változó van.

Conditional

Kifejezésen belüli elágazásokhoz használhatók. Működésül a C típusú nyelvekből ismert ?: operátorhoz hasonlítható. A feltételes kifejezés használható számra, stringre, halmazra, stb.

if x > 5 then x - 5 if y > 10 then "y nagy" else ""