A Prolog programozási nyelv

Objektum-orientált programozás

Létezik objektum orientált kiterjesztése a Prolog nyelvnek, és sikerült teljesen a standard Prolog szintaktikán belül megvalósítani, így könyvtárkiterjesztésként "tetszőleges" Prolog környezetbe beilleszthető. A Prolog objektumok prototípusokon alapulnak. Az OOP elveiből az öröklődés és az üzenetküldés elve került megvalósításra.

A Prolog objektumai predikátum definíciók gyűjteménye. Ilyen értelemben az Objektum nagyon közeli fogalom a Prolog Modulhoz. Valójában az objektum nem is más, mint a Prolog modul rendszerének kibővítése. Az objektumon belül találhatók:

Az objektumok akár fájlban is elhelyezkedhetnek, ezt a modul rendszerhez hasonlóan kell a rendszernek akkor beolvasnia a közös logikai univerzumba. Az alapértelmezett öröklődés a felülírás (override) módszer, azaz amikor az újradefiniált metódusok/attribútumok eltakarják az ős azonos jellemzőit. Az Objektum univerzumban van egy közös ős objektum, az "object", melyből direkt, vagy indirekt módon minden objektum kreálódik. Az objektumok miután könyvtárban lettek a nyelvhez kiterjesztésként megvalósítva, ezért az alábbi módon "élesíthetők":

?- use_module(library(objects)).

Ekkor az alábbi operátorok újradefiniálódnak, az alábbi precedenciával:

:- op(1299, xfy, [ & ]). :- op(1198, xfx, [ :- ]). :- op(1198, fx, [ :- ]). :- op(550, xfx, [ ::, <: ]). :- op(550, fx, [ ::, <: ]).

Az objektumok deklarációja az alábbi módon történik:

:: { & & . . }.

Ahol az objektumazonosító egy Prolog term, a mondatok pedig metódus direktívák. Példa:

apt :: { super(apartment) & street_name('York') & street_no(100) & wall_color(white) & floor_surface(wood) }.

Itt a super az ősosztályt jelöli. Ugyanez attribútumokkal:

apt :: { super(apartment) & attributes([ street_name('York'), street_no(100), wall_color(white), floor_surface(wood) ]) }.

A Prolog egy OO kiterjesztése: a Prolog++

Bevezető gondolatok a Prolog++ programozási nyelvről

A nyelvről szinte minden forrásban (külföldi sajtó) dicsérő szavakat lehet olvasni amióta megjelent. Kifejező és nagy erejű objektum orientált rendszerről van szó, amely kombinálja az AI (Mesterséges Inteligencia) és OOP (Objektum Orientált Programozás) hatóerejét. Az objektumok (vagy osztályok) a legmagasabb szinten vannak definiálva. Lehetséges definiálni objektumok rendszerét Prolog++ -szal, manipulálni azokat Prolog szabályok segítségével, ez egy erős eszköz ‘furfangos’ programozók számára. Párhuzamot fedezhetünk fel a C és C++, valamint Prolog és Prolog++ nyelvek között. De amíg a C++ egy procedurális nyelvet kombinál az OOPs-sel, addig a Prolog++ egy dekleratív nyelvet kombinál az OOPs-sel.

Általános tapasztalatok

Annak ellenére, hogy az interneten szinte mindenhol pozitív kritikákat lehet olvasni a rendszerről, nem mondható, hogy igazán elterjedt volna. Még Prologosok körében sem lett akkora átütő siker, mint például a C-ben dolgozók körében annak idején a C++ megjelenése. Google, Altavizsla, valamint az Index keresőjével próbáltam rábukkanni valamilyen magyar utalásra a programozási nyelvről, de nem jártam sikerrel. Külföldi oldalakon persze már annál inkább találhatunk anyagot, ha viszont nem csak olvasni szeretnénk a PROLOG++ -ról, hanem ki is szeretnénk próbálni a rendszert, akkor az már akadályba ütközik. Nem sikerült fellelnem szabadon letölthető verziót, ami használható lenne, csupán olyanokat, amelyekért komoly pénzeket kellene fizetni. Annak ellenére van ez így, hogy főleg oktatási célokra ajánlják a rendszert. Így sajnos csak a PROLOG++ Reference –re illetve egyéb internetes újságokban megjelent cikkekre tudok támaszkodni nyelvi leírásom során. A PROLOG++ Reference nem csupán a nyelvről szól, hanem általánosságban is sokat foglalkozik az ‘Objektum Orientált Világgal’.

A Prolog++ programozási nyelv története, szerzői, futtatási környezet

A Prolog++ nyelv egy érett, jól átgondolt termék, amelyet a Logic Programming Associates (LPA) fejlesztett ki 640K MS-DOS számítógépekre 1989-ben. Emiattt hatékony és kompakt run-time rendszer. Azóta az LPA továbbfejlesztette a rendszert Windows és Machintosh gépekre is az igényeknek megfelelően. Így ma már kapható MacOS, MS-DOS, MS-Windows, Windows 95, Windows NT rendszerekkel kompatibilis 2.0 verzió is, persze igen borsos áron. Ezt a rendszert a Studio 4 dobta piacra, amely egy londoni székhelyű vállalat. A Prolog történetének áttekintése:

  • 1972 – Marseille (PROgramming in LOGic)
  • 1975 – NIM IGU:SZI
  • 1978 – PROLOG fordító
  • 1982 – MPROLOG, TPROLOG
  • 1985 – TC PROLOG
  • 198x – Turbo PROLOG
  • 1984 – mikroPROLOG
  • 1989 – PROLOG++
  • 199x – PROLOG++ 2.0 (MacOS, Windows NT, ...)

A következő ábra segít abban, hogy el tudjuk helyezni a nyelvek között a PROLOG++ terméket.

Nyelvi elemek, szintaxis

Gyakorlatilag semmi újdonságot nem lehet elmondani az általános Prologhoz képest. Termekről, egyszerű állításoktól, lekérdezésekről valamint levezetési szabályokról beszélhetünk, melyeknek a szintaxisa definiált. A különböző nyelvi elemek teljesen hasonlóan használhatók, mint Prologban.

A Prolog elemei:

  • Tények: (pl. szuloje(a,b).)
  • Szabályok: (pl. nagyszuloje(X,Y) ha szuloje(X,Z) és szuloje(Z,Y))
  • Kérdések (pl. szuloje(a,X)?) - mintaillesztés mindenféle lehetséges kérdésre

Írásmód:

  • kulcsszavas – ha (if) és (and) vagy (or)
  • írásjeles – :- , ;

Osztály hierarchiák és öröklődés

Osztály hierarchiák vannak implementálva jelentésük szerint egy osztályon belül, minden osztályban szerepel a szülő osztály. A metódusok és attribútumok öröklődése ennek segítségével kerül megvalósításra. Így elmondható, hogy a Prolog++ a többszörös öröklődést segíti a szülői függőség segítségével. Minden osztály tulajdonképpen egy template, amely definiálja az általános karakterisztikáját a példánynak. Nézzünk egy egyszerű példát, amelyből látszik, hogy szintaktikailag hogy lehet osztályokat létrehozni, illetve az öröklődést megvalósítani:

class bicycle. parts frame, wheel * 2, seat, handle_bars. end bicycle. class unicycle. inherit bicycle. parts wheel, handle_bars * 0. end unicycle. class tandem. inherit bicycle. parts seat * 2, handle_bars * 2. end tandem. class cycle_component. public method when_created/0. when_created :- write('Created: '), write(self), nl. end cycle_component.

A következő kulcsszavak nagyon fontosak:

  • composite_part: összetett rész, a legfontosabb példány a hierarchia ezen részében
  • super_part: a szuper vagy szülő példány, egyes irodalomban ősosztályként is említik
  • sub_part: egy helyettesítő vagy gyerek része ennek a példánynak
  • #: egy speciálisan számozott helyettesítő rész

Prolog++ -ban az objektumokról tulajdonképpen elmondható, hogy nem mások, mint predikátum definíciók gyűjteményei. Ha így közelítjük meg a problémát, akkor kijelenthetjük, hogy az objektum nagyon közel áll a modulhoz. Tehát az objektum tulajdonképpen nem más, mint a modul rendszerének kibővítése.

Az objektumon belül található két ‘dolog’: attribútum és metódus. Fontos még megemlíteni, hogy az objektumok akár fájlban is elhelyezkedhetnek. Elmondható, hogy alapértelmezett öröklődés értelem szerűen a felülírás.

Ahol az objektumok találhatók, azt általában az irodalom objektumok univerzumának szokta nevezni. Ebben az univerzumban van egy közös ős, amelynek a neve ‘object’. Ebből a közös ősből fog minden objektum létrejönni direkt vagy indirekt.

Objektumok

Prolog++ támogatja egyaránt a statikus és a dinamikus objektumokat is. A dinamikus objektumok kreálhatók vagy argumentumok adhatók számukra futásidőben, míg a statikus objektumok fixnek mondhatók és fordítási időben optimalizálódnak.

Prolog++ és C++

A C++ nyelv, akárcsak a PROLOG++, egy objektum-orientált kiterjesztése az elődjének. A C++ erősen típusos nyelv, míg a Prolog++ -ról ugyanez nem mondható el. A Prolog++ támogatja a gyors fejlesztést és a prototípus készítést.

A Prolog++ -nak megvan az az előnye, hogy late-binding tulajdonsággal bír, amelynek előnyeit programfejlesztés során élvezhetjük ki. Ez abból adódik, hogy a Prolog egy run-time system. Minden üzenet csak a függvény hívásakor váltódik ki. A C++ -ban két fajtája van a metódusoknak: normál függvény és in-line függvény. Alapértelmezésben a metódusok válaszüzenetei a compiler által definiáltak.

Operator overloading (operátor túlterhelés) a C++ esetében nagyon fontos nyelvi fogásnak tekinthető. Prolog++-ban egy operátor pusztán szintaktikus elem, egy függvénye a relációnak.