7-ameliy_paradigma_qq
.pdf7-ámeliy jumıs. Logikalıq programmalastırıwda máselelerdi sheshiw
Jumıstıń maqseti: Logikalıq programmalastırıw paradigmasınıń (Declarative Programming) tiykarǵı principlerin ózlestiriw. Prolog (Programming in Logic) tilinde "Faktler", "Qaǵıydalar" (Rules) hám "Sorawlar" (Queries) menen islesiwdi úyreniw. Bilimler bazasın (Knowledge Base) dúziw, unifikaciya hám rekursiya mexanizmlerin qollanıp, tuwısqanlıq baylanısları hám logikalıq basqatırmalardı sheshiw kónlikpelerin qáliplestiriw.
Teoriyalıq bólim:
Logikalıq programmalastırıw imperativ tilden (C++, Java) túptamırınan ózgeshelenedi. Biz kompyuterge "qalay islew" kerekligin emes (algoritm), al "ne haqıyqat" ekenin (faktler) hám olar arasındaǵı baylanıstı (qaǵıydalar) aytamız.
Tiykarǵı túsinikler:
1.Fakt (Fact): Dúnya haqqındaǵı sózsiz haqıyqat. Mısalı: ata(alim, azamat). -> "Alim Azamattıń atası".
2.Qaǵıyda (Rule): "Eger ... onda ..." formasındaǵı logikalıq baylanıs. Prologta: bas :- dene. (Juwmaq, eger shártler orınlansa).
3.Soraw (Query): Bilimler bazasınan juwap izlew. Mısalı: ?- ata(alim, X). -
>"Alim kimniń atası?".
4.Unifikaciya: Eki termniń teńligin tekseriw hám ózgeriwshilerge mánis beriw procesi.
5.Rekursiya: Qaǵıydanıń ózin-ózi shaqırıwı (Prologta cikllerdiń ornına qollanıladı).
ÁMELIY BÓLIM:
Prolog tilinde (SWI-Prolog ortalıǵında) programmalar dúziwdi kórip shıǵamız.
(Esletpe: Prologta barlıq atamalar kishi háripten, al ózgeriwshiler Bas háripten baslanıwı kerek).
1-mısal: Shańaraq shejiresi (Family Tree)
Másele: Ata-analar haqqında faktlerdi kirgiziw hám "ata", "apa", "aǵa-ini" baylanısların anıqlaw.
Kod (knowledge_base.pl):
%--- Faktler ---
%ata(Ata, Bala). ata(nurlan, alim). ata(nurlan, guli). ata(alim, azamat). ata(alim, malika).
%ana(Ana, Bala). ana(aygul, alim). ana(aygul, guli). ana(zarina, azamat). ana(zarina, malika).
%er(Er, Hayal). er(nurlan, aygul). er(alim, zarina).
%--- Qaǵıydalar ---
%X Y-tiń ákesi, eger X Y-tiń atası bolsa hám X er adam bolsa. akesi(X, Y) :- ata(X, Y).
%X Y-tiń anası, eger X Y-tiń anası bolsa.
anasi(X, Y) :- ana(X, Y).
%X Y-tiń ata-anası (Parent). ata_ana(X, Y) :- ata(X, Y). ata_ana(X, Y) :- ana(X, Y).
%X Y-tiń babası (Grandfather), eger X Z-tiń ákesi bolsa hám Z Y-tiń ataanası bolsa.
baba(X, Y) :- ata(X, Z), ata_ana(Z, Y).
%X hám Y tuwısqan (Sibling), eger olardıń ata-anası bir bolsa hám olar hár túrli adam bolsa.
tuwisqan(X, Y) :- ata_ana(Z, X), ata_ana(Z, Y), X \= Y.
Sorawlar (Prolog konsolında):
?- akesi(nurlan, alim). true.
?- baba(nurlan, azamat). true.
?- baba(X, malika). X = nurlan.
?- tuwisqan(alim, guli). true.
2-mısal: Rekursiya (Recursion)
Másele: Ata-baba shınjırın (Ancestor) tabıw. Baba, babasınıń atası hám t.b.
Kod:
%Baza jaǵdayı: X Y-tiń ata-babası, eger X Y-tiń tikkeley ata-anası bolsa. ata_baba(X, Y) :- ata_ana(X, Y).
%Rekursiv jaǵday: X Y-tiń ata-babası, eger X Z-tiń ata-anası bolsa hám Z Y- tiń ata-babası bolsa.
ata_baba(X, Y) :- ata_ana(X, Z), ata_baba(Z, Y).
Sorawlar:
?- ata_baba(nurlan, azamat). true. (Nurlan -> Alim -> Azamat)
3-mısal: Dizimler menen islesiw (List Processing)
Másele: Dizimniń uzınlıǵın esaplaw.
Kod:
%Baza jaǵdayı: Bos dizimniń uzınlıǵı 0. uzinliq([], 0).
%Rekursiv jaǵday: [Bas|Quyrıq] diziminiń uzınlıǵı N, eger Quyrıqtıń uzınlıǵı N1 bolsa hám N is N1 + 1.
uzinliq([_ | Tail], N) :- uzinliq(Tail, N1), N is N1 + 1.
Soraw:
?- uzinliq([alma, anar, juzim], X). X = 3.
3-mısal: Logikalıq basqatırma (Einstein's Riddle style)
Másele: Kim qanday taǵamdı jaqsı kóredi?
Faktler: likes(ali, palaw).
likes(ali, shashlik). likes(vali, palaw). likes(guli, mantı).
Qaǵıyda: Eger eki adam bir taǵamdı jaqsı kórse, olar dos bola aladı. dos_bola_aladi(X, Y) :- likes(X, Food), likes(Y, Food), X \= Y.
Soraw:
?- dos_bola_aladi(ali, vali). true.
ÁMELIY TAPSÍRMALAR
1-tapsırma: Kóbeytiw kestesin rekursiya menen shıǵarıw.
Prologta print_table(N, I) predikatın jazıń. Ol N sanın 1 den 10 ǵa shekem kóbeytip, ekranda kórsetiwi kerek. (I - esaplaǵısh, dáslep 1 boladı). Baza jaǵdayı: I > 10 bolǵanda toqtaw.
2-tapsırma: Dizimniń summası.
sum_list(List, Sum) predikatın jazıń. Ol pútin sanlar dizimin qabıllap, olardıń qosındısın esaplap Sum ózgeriwshisine júklesin.
Mısal: sum_list([1, 2, 3, 4], X) -> X = 10.
3-tapsırma: "Dayı/Aǵa" (Uncle) qatnasıǵı.
1-mısaldaǵı shańaraq bazasına qosımsha faktler qosıń (aǵa-iniler).
dayi(X, Y) qaǵıydasın jazıń: X Y-tiń dayısı (yamasa aǵası), eger X Y-tiń ataanasınıń tuwısqanı (er adam) bolsa.
4-tapsırma: Faktorial esaplaw (Prolog).
factorial(N, F) predikatın jazıń.
Baza jaǵdayı: 0! = 1.
Rekursiv jaǵday: N! = N * (N-1)!. Prologta is operatorın qollanıp esaplań.
