Procedūros ir sąlygos sakiniai Spausdinti
( 2 Votes )
Parašė Aurimas Šimkus   

Prolog kalboje procedūra apibrėžiama kaip aibė struktūrų (faktų) arba taisyklių, turinčių vienodą pavadinimą (funktorių) bei tokias pačias kompomentes (argumentus). Taigi galime sakyti, kad su procedūromis susidūrėme ir anksčiau aprašynėdami vienodo pavadinimo faktus (tevas, temperatūrą ir t.t).

 

Standartinės procedūros pavyzdys

Didžiausią (jei lygūs, tai pirmojo iš jų) iš dviejų skaičių radimo procedūros pavyzdys:

max(X, Y, Max) :- X >= Y, Max = X.
max(X, Y, Max) :- Y > X, Max = Y.

Pateiktos procedūros užklausų pavyzdžiai:

max(7, 8, Didesnis).
   - Didesnis = 8
max(5, 7, Didesnis).
   - Didesnis = 7
max(9, 9, Didesnis).
   - DIdesnis = 9

Panagrinėkime pirmos užklausos - max(7, 8, Didesnis) - vykdymą.  Pirmiausia Prolog interpretatorius duomenų bazėje susiranda tokio paties pavadinimo (funktoriaus) ir struktūros kaip ir užklausa termą (faktą arba taisyklę). Tada jo argumentams priskiria šiunčiamoje užklausoje esančių argumentų reikšmes ir tikrina, ar su šiomis reikšmėmis šios struktūros visos sąlygos yra teisingos, pvz., egzistuoja tokie faktai. Nagrinėjamu atveju į pirmąją žinių bazės rastą taisyklę įstačius siunčiamas argumentų reikšmes 7 ir 8 turime: 7 >= 8, Max = 7. Jau pirmoji sąlyga yra netenkinama, dėl to ši taisyklė yra praleidžiama ir einama prie kitos: 8 > 7, Max = 8. Kadangdabar visos sąlygos tenkinamos, tai teisyklės struktūros argumento Max reikšmė 8 yra priskiriama užklausos kintamąjam Didesnis (jis yra sukonkretinamas).

 

Procedūros sutraukimo pavyzdys

Galime pastebėti, kad šiuo atveju buvo įmanoma apsieiti ir be procedūros, užrašant vos vieną taisyklę (panaudojant disjunkciją):

 max(X, Y, Max) :- X >= Y, Max = X; Y > X, Max = Y.

Tačiau yra tokių sąlygų, kai vienoje taisyklėje aprašyti sudetingą konstrukciją gali būti daug sudėtingiau, nei sukurti kelias lengviau skaitomas procedūras.

 

If-then-else konstrukcija

Iš esmės Prolog kalboje procedūros naudojamos norint realizuoti kelis galimus vykdymo variantus (jeigu koks nors parametras bus toks, tai bus vykdoma viena procedūros dalis, jei kitoks, tai kita ir t.t.) Tradiciškai imperatyviosiose programavimo kalbose tai yra realizuota per if-then-else konstrukciją. Ši konstrukcija yra realizuota ir Prolog kalboje, tačiau nėra dažnai naudojama.

If-then-else konstrukcijos sintaksė Prolog kalboje:

( Sąlyga ->
     ( then_blokas ) ;
     ( else_blokas )
)

Sąlyga - kintamasis su priskirta logine reikšme, predikatas (į faktą arba taisyklę), termų arba aritmetinis palyginimas. Už sąlygos rašoma ->. then_blokas dalyje rašomi kodas vykdomas, jei Sąlyga gražina true. Priešingu atveju vykdoma else_blokas dalis. Abu šie blokai skiriami kabliataškiu. Šie blokai gaubiami skliaustais tam, kad jū viduje būtų galima aprašyti kelis kreipinius (užklausas); jei aprašomas tik vienas, skliaustai nebūtini. Skliaustai aplink visą konstrukciją dažniausiai yra būtini, nes be jų else dalis būtų laikoma visas kodas iki procedūros pabaigos.

Nagrinėtoji procedūra max šia konstrukcija būtų realizuojama šitaip:

max(X, Y, Max) :- X >= Y ->
                                 Max = X ;  
                                 Max = Y.

Šiuo atveju skliaustai nebuvo dedami, nes tiek then, tiek else dalyse aprašomas tik vienas teiginys, o ir už else dalies nebera kito kodo.