Faktai ir užklausos Spausdinti
( 0 Votes )
Parašė Aurimas Šimkus   

Prolog kalboje pagrindinis dalykas yra žinių bazė, kurioje saugomi aprašyti faktai. Programa turėdami faktų rinkinį bando rasti atsakymus į užklausas (faktų pagalba bando įrodyti teiginius). Tiek faktas, tiek užklausa privalo baigtis tašku.

   Faktai 

Faktas (jo pavadinimas) privalo būti atomas (žr. skyrelį "Prolog terminai"). Jis gali turėti kelis argumentus, tačiau gali jų ir neturėti. Kiekvienas argumentas turi būti  termu.

Bendras fakto aprašas:

   fakto_pavadinimas(argumentas1, argumentas2, ...).

Keli faktų pavyzdžiai:

salta.
temperatura(17).
temperatura(20).
metai(2012,spalis,29).
statistika(metai(2012,spalis,15), snigo)).
tautybe(lietuvis, maironis).

Daugiausiai dėmesio vertas 4-tas faktas, aprašytas struktūra. Kaip minėta anksčiau, kiekvienas fakto argumentas gali būti bet koks termas, vadinamas struktūros komponentu. Reikia pabrėžti, nors pavyzdyje komponento metai pavadinimas sutampa su fakto pavadinimu, jie susieti nėra. Taigi komponentas metai gali turėti ir 4-turis argumentus, nors faktas metai turi 3.

Taip pat reikia panagrinėti faktų semantiką (loginę prasmę). Faktas salta tiesiog aprašo būseną, kuri programiniu atžvilgiu neturi variacijų. Faktas temperatura(17) aprašo būseną, kuri gali turėti daugybė programinių variacijų, priklausomai nuo argumento reikšmės. Šiuo atveju šis faktas gali reikšti, kad programos vykdymo metu egzistuoja 17 'C temperatūra. Faktą tautybe(lietuvis, maironis) galime suprasti dvejopai: 1) objektas lietuvis yra maironis arba 2) objektas maironis yra lietuvis. Tačiau išties žinome, kad realybėje teisingas yra tik antrasis variantas. Taigi apsirašydami faktus turime nuspręsti jų semantiką - kaip šį faktą interpretuosime. PS tautybe(lietuvis, maironis) ir tautybe(maironis, lietuvis) programiniu atžvilgiu yra skirtingi faktai!

   Užklausos 

Užklausos (teiginio) tikslas - žinių bazėje rasti faktus pagal pateiktą teiginį. Tradiciniu atveju, jei teiginys randamas, grąžinamas atsakymas - yes (true), jei nerandamas - no (false). Konkretus atsakymas priklauso nuo naudojamo interpretatoriaus.

Kelios užklausos ir atsakymai, pagal pateiktą faktų pavyzdį:

salta.
   - true
temperatura(15).
   - false
temperatura(17).
   - true
karsta.
 -  false
temperatura(17), karsta.
   - false
temperatura(17); karsta.
   - true

Atkreipkite dėmesį į 9-12 eilutes: 9 eil. pademonstruota konjunkcija (Prolog kalboje loginis "ir" aprašomas kableliu), o 11 eil. - disjunkcija (loginis "arba" - kabliataškiu).

Kitas variantas - pateikti užklausą su kintamaisiais (žr. skyr. "Prolog terminai"):

temperatura(T).
   - T = 17,   /*jei yra keli atsakymai, kol nesibaigia, paspausti ; */
   - T = 20.
statistika(metai(2012,spalis,15), Oras)).
   - Oras = snigo.
statistika(Data, Oras)). 
   - Data = metai(2012,spalis,15),
   - Oras = snigo.
statistika(_, snigo)). 
   - true

Pateiktame pavyzdyje matome 4-turis skirtingus užklausų su kintamuoju variantus:

  1. 1-3 eil. matome, kad interpretatorius suradęs daugiau nei vieną faktą, atspausdina juos visus, tačiau po kiekvieno atsakymo  reikia paspausti klaviatūroje ';', jei norime matyti visus atsakymus. Jei užtenka pirmojo - klaviatūroje spaudžiame tašką.
  2. 4-5 eil. pateiktas tradicinis pavyzdys, kai randamas tik vienas faktas. Kintamasis gali būti rašomas bet kurio argumento vietoje.
  3. 6-8 eil. pateiktas pavyzdys, kai visi argumentai - kintamieji. Tokiu atveju spausdinamas visų tokio pavadinimo faktų sąrašas su priskirtomis kintamųjų reikšmėmis.
  4. 9-10 eil. demestruojamas specialaus '_' kintamojo naudojimo atvejis. Toks kintamasis parodo, kad mums nesvarbus konkreti argumento reikšmė. Šiuo atveju tiesiog domimės, ar kada nors snigo.