Moduliai - daugiafailiai projektai Spausdinti
( 1 Vote )
Parašė Aurimas Šimkus   

Kuriant didelius Prolog projektus verta pagalvoti apie programos saugojimą keliuose failuose. Prolog kalboje yra numatyti bent trys būdai, kaip galima organizuoti daugiafailius projektus.

 

Pagrindiniai Prolog failų užkrovimo variantai:

  • Tradicinis. Naudojamas predikatas consult(Failas).
  • Importavimas. Naudojamas predikatas include(Failas). Tai panašus atvejis, kaip ir C++ naudojamo include. Įtraukiamo failo turinys yra įtraukiamas į failą, kuriame šis predikatas yra iškviečiamas.
  • Modulių naudojimas. Privalumas - paprastesnis programos struktūrinis skirstymas. 

 

 Pagrindinės taisyklės, kuriant modulius:

  • Kiekvienas modulis turėtų būti atskirame faile.
  • Failo pavadinimas turėtų sutapti su modulio pavadinimu.
  • Modulio failo viršuje rašoma: :- module( pavadinimas, [vieši_predikatai] ). pavadinimas turi būti atomas. vieši_predikatai išvardijami modulyje aprašyti predikatai, kuri turėtų būti pasiekiami viešai, t.y. nenurodant modulio pavadinimo.
  • Modulis užkraunamas faile, jo viršuje kreipiantis :- use_module( pavadinimas ). Jei modulis-  vykdomajame kataloge, užteks pavadinimo; jei ne - reikės nurodyti pilną kelią iki jo. SWI-Prolog sistema turi nemažai integruotų modulių (tinklo, grafikos ir tt). Į šiuos modulius kreipiamasi per globalų predikatą library, pvz., use_module(library('http/httpd')).
  • Kreipimosi į ne viešus modulio predikatus sintaksė: modulio_pavadinimas:predikatas.

 

Paskutinioji taisyklė išties yra labai naudinga. Laikantis jos programos kodą galima padaryti skaitomesnį ir struktūriškesnį. Pvz., užsikrauname du modulius (fizika ir automobiliai) ir į atitinkamo modulio predikatus kreipiamės su atitinkamo modulio priešdėliu.

 

Mopdulio kūrimo ir naudojimo pavyzdys.

Tarkime, savo programoje turime susikūrę didžiulį kiekį faktų - sostinė, kuriuose nurodome, kokia sostinė kokiai valstybei priklauso. Tačiau vėliau paaiškėja, kad mums reikia tiesiogiai sužinoti, kuriame kontinente yra nagrinėjama sostinė. Dėl to mums reikėtų kurti predikatų rinkinį kontinentas, nustatantį, kur yra mūsų sostinė arba dar kaip nors bandyti išsisukti iš padėties. Tačiau yra paprastesnis variantas. Tarkime susirandame sukurtą modulį (arba susikuriame patys), kuriame yra faktai apie valstybėms priklausančias sostines. Taigi pasinaudodami šiuo moduliu, galime nesudėtingai sužinoti, sostinės kontinentą.

Mūsų kuriama programa (minimalistinė):

:- use_module(geografija).
 
sostine(vilnius, lietuva).
sostine(tokijas, japonija).
sostine(egiptas, kairas).
 
kur_sostine(Sostine) :-
     sostine(Sostine, Salis),
     geografija:valstybe(Salis, Kur),
     format('~w yra ~w.', [Sostine, Kur]).

Modulis geografija (minimalistinis).

:-module(geografija,[]).

valstybe(lietuva, europa).
valstybe(japonija, azija).
valstybe(egiptas, afrika).

Vykdymo pavyzdys Prolog terminale (kai užkrautas (consult) mūsų failas su sostinėmis):

?- kur_sostine(vilnius).
 vilnius yra europa-oje.
 true.
 
?- kur_sostine(X).
 vilnius yra europa-oje.
 X = vilnius,   %spaudžiam <strong>;</strong> 
 tokijas yra azija-oje.
 X = tokijas,
 kairas yra afrika-oje.
 X = kairas.

 

Taigi moduliai išties yra gera alternatyva didelių daugiafailių projektų kūrime.