"Prologue" - bu dasturlash tili yoki sun'iy intellektning asosi. Mantiqiy dasturlash. Prolog tili asoslari Prolog qayerda ishlatiladi?

Nega u ajoyib? Men bir necha o'nlab tillarni bilaman va boshqa yangi tilni o'rganish men uchun muammo emas, endi men bunga ehtiyoj sezmayapman.

Prolog o'ziga xosdir. Bu deklarativ dasturlash paradigmasini ifodalovchi yagona tildir; bu tilda yuzlab turli xil ilovalar mavjud, ammo ular hali ham Prolog deb ataladi, nomga faqat prefiks va qo'shimchalar qo'shadi; bu 20 yildan ortiq vaqt davomida sezilarli o'zgarishlar ro'y bermagan tirik til; Bu, ehtimol, haqiqiy dasturlashda qo'llanilmaydigan yagona dasturlash tilidir. Nima uchun Prolog?

Prolog tabiatan noyobdir, u baxtli tasodif (dunyoning sirli tuzilishi) tufayli paydo bo'lgan. Bir vaqtlar 60-yillarda teoremani avtomatik isbotlash nazariyasi juda tez rivojlanib bordi va Robinson har qanday haqiqiy teoremani (uni aksiomalardan olish) chekli vaqt ichida isbotlash imkonini beradigan rezolyutsiya algoritmini taklif qildi (buning uchun u emas). ma'lum). Keyinchalik ma'lum bo'lishicha, bu umumiy muammoning eng yaxshi yechimidir, cheklangan miqdordagi operatsiyalarda teoremani isbotlash mumkin emas. Oddiy so'zlar bilan aytganda, algoritm (umuman cheksiz) grafikning kenglik bo'yicha birinchi o'tishidir.Tabiiyki, algoritmning ishlashini bashorat qilish deyarli 0 ga teng; shunga ko'ra, bu dasturlash tili uchun mutlaqo mos emas. Va o'sha paytda Kalmarov muammoning yorqin toraytirilishini topdi, buning natijasida ba'zi teoremalarning isboti dasturning protsessual bajarilishiga o'xshardi. Shuni ta'kidlash kerakki, isbotlanadigan teoremalar sinfi juda keng va dasturlashtiriladigan masalalar sinfiga juda mos keladi. Shunday qilib, Prolog 1972 yilda paydo bo'ldi.

Ushbu maqolada men Prolog haqida umumiy mantiqiy muammolarni hal qilish vositasi sifatida gapirishga harakat qilaman. Ushbu mavzu Prolog sintaksisini allaqachon biladigan va uni ichkaridan tushunishni xohlaydiganlar uchun, shuningdek, til sintaksisini mutlaqo bilmaydigan, lekin ortiqcha vaqt sarflamasdan uning "lazzatini" tushunishni istaganlar uchun qiziqarli bo'ladi. sintaktik tuzilmalarni o'rganish.


Prologning asosiy xususiyati shundaki, uni o‘qish oson, lekin yozish juda qiyin bo‘lib, u barcha asosiy tillardan tubdan farq qiladi, ular yozish yanada osonlashdi, yana bir qadam va planshetda yozishingiz mumkin. Google+ dagi do'stlar kabi ishlaydigan modullar, biz hammamiz bilamizki, kodning o'zi bundan katta zarar ko'radi. Aftidan, har bir satr tushunarli, ammo tizim qanday ishlashini hatto ishlab chiquvchilar ham tushunib bo'lmaydi, ular Hindistonda. Menimcha, Prologni o'rgatish bo'yicha barcha kitoblarda ular bir xil xatoga yo'l qo'yishadi, faktlar, munosabatlar, so'rovlar haqida hikoya boshlaydilar va odamda Ekspert tizimi yoki ma'lumotlar bazasi sifatida tilga munosabat paydo bo'ladi. Dasturlarni to'g'ri o'qishni o'rganish va ularning o'nlablarini shu tarzda o'qish muhimroqdir :)

Prolog dasturlarini qanday qilib to'g'ri o'qish kerak

Dasturlarni o'qish juda oson, chunki tilda juda kam maxsus belgilar va kalit so'zlar mavjud va ular tabiiy tilga osongina tarjima qilinadi. Dasturchining asosiy xatosi shundaki, u dastur qanday ishlashini darhol tasavvur qilishni xohlaydi va dasturda nima tasvirlanganini o'qimaydi, shuning uchun menimcha, oddiy odamning bulutsiz miyasini o'rgatish dasturchiga qaraganda ancha osonroq.
Tushunchalar
Tilda 2 ta tushuncha mavjud predikatlar(shartlar) va ob'ektlar(ular ham o'zgaruvchilar va atamalardir). Predikatlar ma'lum bir shartni ifodalaydi, masalan, yashil ob'ekt yoki tub son; shartlar kiritish parametrlariga ega bo'lishi tabiiydir. Masalan green_object(ob'ekt), asosiy_raqam (raqam). Predikatdagi parametrlar soni predikatning o'ziga xosligini aniqlaydi. Ob'ektlar- atamalar, doimiylar va o'zgaruvchilar. Konstantalar- bu raqamlar va satrlar, o'zgaruvchilar- noma'lum ob'ektni, ehtimol qidirilayotgan ob'ektni ifodalang va qatorlar sifatida belgilanadi katta harflar. Keling, hozircha shartlarni qoldirib, eng oddiy dasturni ko'rib chiqaylik.
Dastur
Dastur - bu shakl qoidalari to'plami Agar 1-shart va 2-shart va... boʻlsa, shart rost boʻladi. Rasmiy ravishda bu qoidalar AND orqali birlashtiriladi, lekin qarama-qarshilikni olish mumkin emas, chunki Prologda mantiqiy inkor yo'q va That bog'lovchisida faqat bitta predikat (shart) bo'lishi mumkin.

Javob: - B_1, B_2. % qoidasi quyidagicha o'qiladi: Agar B_1 va B_2 bo'lsa, u holda A
toq_bosh(Raqam) :- tub (Raqam), toq(Raqam).
% Agar "Raqam" tub va toq bo'lsa, "Raqam" toq_tutqich bo'ladi

Ko'rib turganingizdek, o'zgaruvchining nomi amal qilish doirasiga ega - bu qoida. Matematik jihatdan to'g'ri, qoida eshitiladi: har qanday o'zgaruvchi uchun - "Raqam", agar u tub va toq bo'lsa, u asosiy_toq bo'ladi. Xuddi shunday, uni quyidagicha ifodalash mumkin: Agar toq va tub bo'lgan “Raqam” bo'lsa, u toq_bosh hisoblanadi. Shuning uchun, o'zgaruvchining nomi juda muhim! Agar chap tomonda (oldin:-) Raqamni Raqam2 bilan almashtirsak, qoida o'z ma'nosini o'zgartiradi: Har qanday Raqam2 va Son uchun, agar Raqam tub va toq bo'lsa, u holda Raqam2 oddiy toq bo'ladi. Ma'lum bo'lishicha, barcha raqamlar tub_toq! Bu Prologda eng ko'p uchraydigan xatodir.

Javob: - B_1, B_2. % qoidasi quyidagicha o'qiladi: Agar B_1 va B_2 bo'lsa, u holda A toq_tutqich(Son) :- tub (Son), toq(Raqam). % Agar "Raqam" tub va toq bo'lsa, "Raqam" toq_tutqich bo'ladi

Misol - mukammal raqamlar
mukammal_raqam(N) :- son(N), son_bo'luvchilarning_soni_yig'indisi(N, bo'luvchilar yig'indisi), ga teng(bo'luvchilarning_yig'indisi, H). mukammal_raqam(1). teng (ob'ekt, ob'ekt). Raqamsiz (1, 1) bo'luvchilarning_yig'indisi. Raqamsiz_bo'luvchilarning_yig'indisi (Raqam, Yig'indi) :- oldingi_son (Raqam, Oldingi), sonning_raqamga_bo'luvchilari_yig'indisi (Raqam, Yig'indi, Oldingi). sonni_raqamga_bo'luvchilarning_yig'indisi(Raqam, 1, 1). son_bo'luvchilarning_songa_yig'indisi(Raqam, yig'indi, bo'luvchi) :- bo'lingan_(son, bo'luvchi), oldingi_son(bo'luvchi, oldingi), son_bo'luvchilarning_songa_yig'indisi(son, yig'indi, oldingi), qo'shish(yig'indi, bo'linuvchi). son_bo'luvchilarning_raqamga_yig'indisi(Raqam, yig'indi, bo'luvchi):- bo'linmaydigan_(Raqam, bo'luvchi), oldingi_son(bo'luvchi, oldingi), son_raqamga_bo'luvchilarning_yig'indisi(Raqam, yig'indi, oldingi).

Birinchidan, qoidalar nimani anglatishini rasmiy ravishda o'qib chiqamiz:

  1. Agar “H” son bo‘lsa va “H” va “SumDivisors” uchun sonni_sonsiz_bo‘luvchilar yig‘indisi sharti bajarilgan bo‘lsa, boshqacha aytganda, SumDivisors “H” sonining bo‘luvchilari yig‘indisi, “H” esa “SumDivisors” ga teng. , keyin "H" mukammal raqamdir.
  2. 1 - mukammal raqam. Qoidalarda shartlar bo'lmasligi mumkin, bu holda ular faktlar deb ataladi.
  3. Har bir ob'ekt "O" "O" ga teng. Asos sifatida, standart "=" predikati mavjud, ammo siz uni butunlay o'zingiz bilan almashtirishingiz mumkin.
  4. 1 raqamisiz bo'luvchilarning_yig'indisi 1 ga teng ekanligi.
  5. Agar "Raqam" ning oldingi "Raqam" raqamigacha bo'lgan bo'luvchilar yig'indisi "Sum" ga teng bo'lsa, bu raqamsiz_bo'luvchilarning_yig'indisidir. Shu tarzda X ning bo'luvchilari yig'indisi Y dan kichik yoki teng ekanligi ifodalanadi, chunki X X ga bo'linadi, shuning uchun biz Y = X - 1 ni olamiz.
  6. Keyinchalik, 3 ta predikatlar Y dan kichik yoki teng bo'luvchilar soni yig'indisini aniqlaydi (Bo'luvchi), 1-holat Y 1 ga teng, 2-holat Raqam Y ga bo'linadi, keyin bo'linuvchilarning_yig'indisi(X, Y) = bo'luvchilarning_yig'indisi(X, Y-) 1) + Y , va 3-holat Son Y ga boʻlinmaydi, keyin boʻluvchilarning_yigʻindisi(X, Y) = boʻluvchilarning_yigʻindisi(X, Y-1).
Dastur ta'riflar to'plamiga o'xshaydi
Ushbu qoidalarni o'qishning ikkinchi usuli bor, kamroq matematik va tabiiyroq, "ta'riflar" ga asoslangan. E'tibor qilishingiz mumkinki, Prologda chapdagi barcha qoidalar (o'sha paytdagi qismda) faqat bitta shartni o'z ichiga oladi, bu asosan ushbu shartning "ta'rifi".
Masalan, 1-qoida - mukammal sonlarning ta'rifi. "H" son bo'lsa va "H" ning bo'luvchilari yig'indisi "H" ga teng bo'lsa, "H" mukammal sondir. Bir xil predikatlar "yoki" sharti yordamida nomlar bo'yicha guruhlanadi. Ya'ni, siz ta'rifga qo'shishingiz mumkin: "H" - bu mukammal raqam, qachonki... yoki "H" 1 bo'lsa.

Ushbu o'qish usuli keng qo'llaniladi, chunki u predikatlarni bir hil guruhlarga birlashtirishga imkon beradi va tarjimon predikatlarni qanday tartibda ochishini tushunishga yordam beradi.
ba'zi bir bayonotning haqiqatini tekshiring. Masalan, ko`rinib turibdiki, agar predikat bitta ta`rifga ega bo`lmasa, u bilan gapning to`g`riligini isbotlab bo`lmaydi. 1-misolda "bo'lingan" predikati hech qanday ta'rifga ega emas.

Qizig'i shundaki, Prologda tsikllar, o'zgaruvchilar topshiriqlari, turdagi deklaratsiyalar mavjud emas va agar biz atamalar va kesish haqida ham eslasak, til algoritmik jihatdan to'liq bo'ladi.

Termal vannalar
Termal vannalar ob'ektlarning nomlangan to'plami sifatida rekursiv ta'rifga ega. Term = "ism"(ob'ekt, ob'ekt, ...), misol shaxs("Ism", "Familiya"), "+"(1, 2), shaxs(manzil("Ba'zi manzil"), familiya("Familiya"), telefon("Telefon")). Agar atamani matematik tushuncha deb hisoblasak, u holda atama funksiya, aniqrog‘i funktor, ya’ni “+”(1, 2) 1+2 ga teng bo‘lgan ob’ekt mavjudligini bildiradi. Bu umuman 1+2 = 3 degani emas; Prologda bu ifoda to'g'ri emas, xuddi qoldiqlar guruhi moduli 2da 3 ta umuman mavjud emas. Yana matematik nuqtai nazardan, o'zgaruvchilar For All so'zi bilan bog'lanadi va agar bayonotda so'z mavjud bo'lsa, bu maqsad uchun atama (funktor) ishlatiladi. Har qanday son uchun faktoriy raqam mavjud: faktoriy(X, fakt(X)).

Dasturlash nuqtai nazaridan atamalarni ancha soddaroq tushuntirish mumkin: atama atributlar to'plamiga ega ob'ekt, atributlar boshqa atamalar yoki doimiylar yoki o'zgaruvchilar (ya'ni aniqlanmagan) bo'lishi mumkin. Asosiy farq shundaki, Prologdagi barcha ob'ektlar o'zgarmasdir, ya'ni ulardagi atributlarni o'zgartirib bo'lmaydi, lekin maxsus holat - o'zgaruvchi mavjud.

Misol - Butun sonli arifmetika
nat (0). nat(raqam(Raqam)) :- nat(Raqam). ortiqcha (0, raqam, raqam). ortiqcha(son(N1), N2, raqam(Res)) :- ortiqcha(N1, N2, Res). ko'paytiring (0, Raqam, 0). ko'paytiring(son(Ch1), Ch2, Res2) :- ko'paytiring(Ch1, Ch2, Res), ortiqcha(Res, Ch2, Res2).
  1. nat xossasining ta'rifi (natural son). 0 - natural son, agar raqam natural bo'lsa, u holda ob'ekt raqami (Raqam) mavjud bo'lib, u ham natural sondir. Matematik jihatdan "raqam" atamasi +1 funktsiyasini ifodalaydi; dasturlash nuqtai nazaridan "raqam" ma'lumotlarning rekursiv tuzilishi bo'lib, uning elementlari: raqam (0), raqam (raqam (0)), raqam (raqam). (raqam (0))).
  2. Plyus nisbati 0 + Raqam = Raqam. Agar Ch1 + Ch2 = Res bo'lsa, u holda (Ch1+1) + Ch2 = (Res+1).
  3. Ko'paytirish nisbati 0 * Raqam = 0. Agar Ch1 * Ch2 = Res va Res + Ch2 = Res2 bo'lsa, u holda (Ch1+1) * Ch2 = Res2.
Shubhasiz, bu gaplar oddiy arifmetika uchun to'g'ri, lekin nega biz Raqam + 0 = Raqam kabi aniq bo'lganlarni kiritmadik. Javob oddiy: ortiqchalik har qanday ta'rifga ko'ra juda yomon. Ha, bu hisob-kitoblarga, erta optimallashtirishga yordam berishi mumkin, ammo nojo'ya ta'sirlar ta'riflardagi qarama-qarshiliklar, bayonotning noaniq chiqishi va tarjimonning aylanishi bo'lishi mumkin.

Prolog qanday qilib predikatlarni tushunadi va gaplarni qanday isbotlaydi

Albatta, o'qish dasturlari Prolog uslubini his qilishga yordam beradi, lekin bu ta'riflar nima uchun va qanday ishlatilishini aniq ko'rsatmaydi. Yuqorida keltirilgan misollarni to'liq dastur deb atash mumkin emas, chunki kirish nuqtasi etarli emas. Prologga kirish nuqtasi SQL ma'lumotlar bazasiga qarshi so'rovga o'xshash yoki funktsional dasturlashda asosiy funktsiyani chaqirishga o'xshash so'rovdir. So'rovlarga misollar: nat(Raqam) - natural sonni toping, plyus(0, 0, Natija) - Natija o'zgaruvchisiga 0 va 0 qo'shish natijasini toping, nat(0) - 0 natural son ekanligini tekshiring va hokazo. .

Albatta, so'rovlar natijalarini mantiqiy mulohazalar asosida taxmin qilish qiyin emas, lekin dastur ularni qanday qo'lga kiritganini tushunish juda muhimdir. Axir, Prolog qora quti emas, balki dasturlash tilidir va SQL rejasi tuzilgan va so'rov turli ma'lumotlar bazalarida turlicha bajarilishi mumkin bo'lgan ma'lumotlar bazasidan farqli o'laroq, Prolog juda aniq bajarish tartibiga ega. Gap shundaki, ma'lumotlar bazasida biz jadvaldagi ma'lumotlarga asoslanib, qanday javob olishni xohlayotganimizni to'liq bilamiz, afsuski, dasturning Prologiga qarab, qaysi bayonotlar mantiqiy ravishda aniqlanishi mumkinligini aytish juda qiyin, shuning uchun bu juda oson. Prolog tarjimoni qanday ishlashini tushunish uchun.

Keling, misol so'rovini ko'rib chiqaylik ortiqcha(0, 0, Natija) :
1. Biz qoidalardan birining chap qismi bilan ushbu so'rovning mosligini (naqsh-moslik, rezolyutsiya turi) topamiz. Ushbu so'rov uchun ortiqcha (0, raqam, raqam). Keling, barcha so'rov argumentlarini qoida bilan birma-bir bog'laymiz va quyidagini olamiz: 0 = 0, 0 = raqam, Natija = raqam. Bu tenglamalar 2 ta o'zgaruvchini (Raqam va Natija) o'z ichiga oladi, ularni yechish orqali biz Raqam = Natija = 0 ni olamiz. Bu qoidada hech qanday shart yo'qligi sababli biz berilgan savolga javob oldik. Javob: ha va natija = 0.

So'rov nat (raqam) :
1. Tenglamalarni mos ravishda yechish orqali nat(0) qoidasi bilan 1-chi moslikni topamiz, boshqacha qilib aytganda rezolyutsiyani topib, Raqam = 0 ni olamiz. Javob: ha va Raqam = 0.

So'rov ortiqcha(Natija, 0, raqam(0)) :
1. Plyus(0, Raqam, Raqam) qoidasi bilan rezolyutsiyani toping: Natija = 0, 0 = Raqam, raqam(0) = Raqam, lekin (!) Raqam = 0 = raqam(0) - mumkin emas, chunki 0 bir xil raqam (0). Shuning uchun, biz quyidagi qoida bilan qaror izlayapmiz.
2. Plyus (son(N1), Ch2, raqam(Res)) qoidasi bilan aniqlikni toping, biz raqam (N1) = Natija, Ch2 = 0, raqam (Res) = raqam (0), demak Res = 0 ni olamiz. .Bu qoidalar, biz hisobga o'lchamlari (o'zgaruvchan qiymatlari) natijalarini olib, tekshirish kerak bo'lgan shartlar bor, plus(Ch1, Ch2, Res) -> plus(Ch1, 0, 0). Biz stekdagi o'zgaruvchilar qiymatini eslaymiz va yangi so'rov yaratamiz ortiqcha(H1, 0, 0)
3*. Plyus(X1, 0, 0) so'rovini yechishda biz plyus(0, Number, Number) bilan ruxsatni topamiz va X1 = 0 va Number = 0 ni olamiz.
4. Biz stek bo'ylab oldingi o'zgaruvchilarga qaytamiz Natija = raqam (N1) = raqam (0). Javob topildi raqam(0). Shunga ko'ra, prolog mashinasi endi X + 0 = 1 tenglamasini yechdi.

Prolog tilida qoidalarni malakali tuzish juda qiyin ish, lekin agar siz ularni ixcham tuzsangiz, siz nafaqat to'g'ridan-to'g'ri javob va echimlarni, balki teskari javoblarni ham olishingiz mumkin.

Misol so'rovi ortiqcha (raqam, raqam, raqam) : javob ha, raqam = 0.

Misol so'rovi ortiqcha(0, 0, 0) : javob yo'q, birinchi urinishda barcha qarorlar bajarilmaydi.

Misol so'rovi ortiqcha (Raqam, Raqam, raqam (Raqam)) : Javob ha, Raqam = 1. X + X = X + 1 tenglamasini yechish.

Ko'paytirish (Raqam, raqam (0), raqam (0)) uchun chiqishni sinab ko'ring, bu o'zgaruvchilarni stekga 2 marta surish va yangi so'rovni hisoblashni talab qiladi. Prolog mashinasining mohiyati shundan iboratki, siz 1-natijani bekor qilishingiz mumkin, keyin Prolog oldingi holatga qaytadi va hisoblashni davom ettiradi. Masalan, so'rov nat (raqam) , birinchi qoidani qo'llaydi va 0 chiqadi, so'ngra 2-qoida + 1-qoidani qo'llaydi va raqamni chiqaradi (0), siz takrorlashingiz va barcha natural sonlarning cheksiz ketma-ketligini olishingiz mumkin. Yana bir misol, iltimos ortiqcha(Raqam, raqam(0), raqam2) , X + 1 = Y tenglamaning barcha juft yechimlari ketma-ketligini hosil qiladi.

Xulosa

Afsuski, mavzuning o'rtacha hajmi asosiy mavzuga, ya'ni Prologda murakkab mantiqiy masalalarni yechish strategiyasiga ega bo'lmasdan yechishga imkon bermadi. Prolog kodining katta bo'laklari nafaqat yangi boshlanuvchilarni, balki tajribali dasturchilarni ham qo'rqitishi mumkin. Ushbu maqolaning maqsadi Prolog dasturlari oddiygina qila olishini ko'rsatishdir tabiiy tilda o'qing, shuningdek oddiy tarjimon tomonidan bajariladi.
Prologning asosiy xususiyati shundaki, u murakkab mantiqiy masalalarni yechadigan qora quti yoki kutubxona emas, siz Mathematica-ga algebraik tenglamani kiritishingiz mumkin va u yechimni ishlab chiqaradi, lekin bajarilgan qadamlar ketma-ketligi noma'lum. Prolog umumiy mantiqiy muammolarni hal qila olmaydi (uning mantiqiy "yoki" va "inkori" yo'q), aks holda uning chiqishi chiziqli ruxsat sifatida deterministik bo'lmaydi. Prolog - bu oddiy tarjimon va teoremani isbotlovchi mashina o'rtasidagi oltin o'rtacha; har qanday yo'nalishdagi siljish xususiyatlardan birini yo'qotishiga olib keladi.

Keyingi maqolada men tartiblash masalalari qanday echilishi, qon quyish ketma-ketligi, Miss Manners va boshqa taniqli mantiqiy muammolar haqida gapirmoqchiman. O'zini qoniqarsiz his qilganlar uchun men taklif qilmoqchiman keyingi vazifa (sovrinni birinchi bo'lib hal qilgan kishi):
Predikat yozing, bu 3 dan boshlanadigan cheksiz natural sonlar ketma-ketligini hosil qiladi. Bular Prologdagi standart raqamlar bo'lishi kerak, ular ustida amallar predikat yordamida bajariladi: X 3 + 1 => X=4.

Ko'p ming yillar davomida insoniyat bilimlarni to'playdi, qayta ishlaydi va uzatadi. Bu maqsadlar uchun doimiy ravishda yangi vositalar ixtiro qilinib, eskilari takomillashtirilmoqda: nutq, yozish, pochta, telegraf, telefon va boshqalar. Bilimlarni qayta ishlash texnologiyasida kompyuterlarning paydo bo'lishi katta rol o'ynadi.

1981 yil oktyabr oyida Yaponiya Xalqaro savdo va sanoat vazirligi tadqiqot tashkiloti - Yangi avlod kompyuter texnologiyalari tadqiqot markazi instituti tashkil etilganligini e'lon qildi. Ushbu loyihaning maqsadi bilimga asoslangan axborotni qayta ishlash tizimlarini yaratish edi. Ushbu tizimlar foydalanuvchilar bilan tabiiy tildan foydalangan holda muloqot qilish imkoniyati tufayli boshqaruv qulayligini ta'minlaydi deb taxmin qilingan. Bu tizimlar o'z-o'zini o'rganishi, xotirada to'plangan bilimlardan turli xil muammolarni hal qilishda foydalanishi, foydalanuvchilarga ekspert maslahatlarini berishi kerak edi va foydalanuvchidan informatika bo'yicha mutaxassis bo'lishi shart emas edi. Inson beshinchi avlod kompyuteridan televizor, magnitafon va changyutgich kabi har qanday maishiy elektr jihozlari kabi bemalol foydalana oladi, deb taxmin qilingan edi. Yaponiyadan ko'p o'tmay, Amerika va Evropa loyihalari boshlandi.

Bunday tizimlarning paydo bo'lishi bilim bazalari va ekspert tizimlaridan foydalanish orqali texnologiyani o'zgartirishi mumkin. Kompyuterlarning beshinchi avlodiga sifat jihatidan o‘tishning asosiy mohiyati ma’lumotlarni qayta ishlashdan bilimlarni qayta ishlashga o‘tishdan iborat edi. Yaponlar fon Neyman arxitekturasidan uzoqlashgan holda, inson tafakkurini kompyuterning ishlash tamoyillariga moslashtirmasdan, balki kompyuter ishini inson fikrlash tarziga yaqinlashtirishga umid qilishgan. 1991 yilda beshinchi avlod kompyuterlarining birinchi prototipini yaratish rejalashtirilgan edi.

Endi ma'lum bo'ldiki, qo'yilgan maqsadlar hech qachon to'liq amalga oshirilmagan, ammo bu loyiha sun'iy intellekt sohasidagi tadqiqotlarning yangi bosqichini rivojlantirish uchun turtki bo'lib xizmat qildi va mantiqiy dasturlashga qiziqish portlashiga sabab bo'ldi. An'anaviy fon Neyman arxitekturasi samarali amalga oshirish uchun mos bo'lmaganligi sababli, PSI va PIM maxsus mantiqiy dasturlash kompyuterlari yaratildi.

Beshinchi avlod kompyuter loyihasi uchun dasturiy ta'minotni ishlab chiqishning asosiy metodologiyasi sifatida quyidagilar tanlandi: mantiqiy dasturlash, uning taniqli vakili prolog tilidir. Aftidan, hozirda Prolog Yaponiya va Yevropada eng ommabop sun'iy intellekt tili bo'lib qolmoqda (AQShda an'anaviy ravishda boshqa sun'iy intellekt tili kengroq tarqalgan - funktsional dasturlash tili Lisp).

Tilning nomi "Prolog" so'zlardan kelib chiqqan MANTIQ DASTURLASH(Frantsuz tilida PROgrammation en LOGique va ingliz tilida LOGic tilida dasturlash).

Prolog matematik mantiqning shunday bo'limiga asoslanadi predikatlar hisobi. Aniqroq aytganda, uning asosi teoremalarni isbotlash tartibi hisoblanadi hal qilish usuli Uchun Shox gaplar. Keyingi ma'ruza shu mavzuga bag'ishlanadi.

Prolog tilining paydo bo`lishi va rivojlanishi tarixida quyidagi bosqichlarni ajratib ko`rsatish mumkin.

1965 yilda ACM jurnalining 12-sonida chop etilgan "Rezolyutsiya printsipiga asoslangan mashinaga yo'naltirilgan mantiq" maqolasida J. Robinson birinchi tartibli predikatlar hisobidagi teoremalarning isbotlarini avtomatik ravishda topish usulini taqdim etdi. " hal qilish printsipi". Bu ishni tarjimada o'qish mumkin: Robinson J. Mashinaga asoslangan mantiq rezolyutsiya printsipi// Kibernetik to'plam. - jild. 7 (1970). Aslida, bu usul g'oyasi 1931 yilda, hali kompyuterlar mavjud bo'lmaganda Gerbrand tomonidan taklif qilingan (Herbrand, "Une methode de demonstration", These, Parij, 1931). Robinson ushbu usulni avtomatik, kompyuterda foydalanish uchun mos bo'lishi uchun o'zgartirdi va qo'shimcha ravishda uning usulining asosini tashkil etuvchi samarali birlashtirish algoritmini ishlab chiqdi.

1973 yilda Alen Kolmero boshchiligidagi "sun'iy intellekt guruhi" Marsel universitetida teoremalarni isbotlash uchun mo'ljallangan dastur yaratdi. Ushbu dastur tabiiy tildagi matnlarni qayta ishlash tizimlarini yaratish uchun ishlatilgan. Teoremani isbotlovchi dastur Prolog deb nomlangan (Programmation en Logique dan). U Prologue uchun prototip bo'lib xizmat qildi. Afsonaga ko'ra, bu ismning muallifi Alan Kolmeroning rafiqasi bo'lgan. Dastur Fortranda yozilgan va juda sekin ishlaydi.

Robert Kovalskining ishi mantiqiy dasturlashni rivojlantirish uchun katta ahamiyatga ega edi. Predikativ mantiq Qanaqasiga dasturlash tili"(Kowalski R. Predicate Logic as Programming Language. IFIP Kongressi, 1974), unda u samaradorlikka erishish uchun o'zini to'plamdan foydalanish bilan cheklash kerakligini ko'rsatdi. Shox gaplar. Aytgancha, Kovalski va Kolmero bir yoz davomida birga ishlagani ma'lum.

1976 yilda Kovalski o'zining hamkasbi Maarten van Emden bilan birgalikda mantiqiy dastur matnlarini o'qishga ikkita yondashuvni taklif qildi: protsessual va deklarativ. Ushbu yondashuvlar uchinchi ma'ruzada muhokama qilinadi.

1977 yilda Edinburgda Uorren va Pereyra DEC-10 kompyuteri uchun juda samarali Prolog kompilyatorini yaratdilar, bu Prologning keyingi ko'plab ilovalari uchun prototip bo'lib xizmat qildi. Qizig'i shundaki,

Ma’ruza holat fazo grafigi yordamida masalalarni yechishga bag‘ishlangan. Holat fazosi holatlar yig`indisi - grafik uchlari, holatdan holatga o`tishlar to`plami - grafik yoylari, boshlang`ich holatlar to`plami va yakuniy holatlar to`plami shaklida tasvirlangan. Muammoning yechimi boshlang'ich holatni yakuniy holatga bog'laydigan holat fazosi grafigidagi yo'l sifatida ifodalanadi. Agar muammoning davlat maydoni kichik bo'lsa, u holda barcha optimal echimlar chuqurlikdan birinchi qidiruv yordamida topiladi. Katta davlat maydoniga ega bo'lgan masalalarda kenglikdan birinchi qidirish orqali faqat bitta optimal echim hisoblanadi. Muammolarga universal hal qiluvchilar qo'llaniladi. Turli vazifalardagi davlatlar turli domenlarga tegishli bo'lishi mumkin. Topilgan eng yaxshi echimlarni eslab qolish uchun "o'zgaruvchan o'zgaruvchan" varM ishlatiladi. Kompilyatorning o'zi kerakli turlarni topadi. Visual Prolog versiyasi 7.5, hali nashr etilmagan. Uning nashr etilishi 2014 yilga mo‘ljallangan, biroq aniq sana hozircha ma’lum emas. Visual Prolog 7.4 endi hamma uchun mavjud.

Prologning paydo bo'lishi mantiq, matematika va dasturlashning rivojlanishi bilan bog'liq edi. Ikkinchisi eng muhim rol o'ynadi. Mantiq va matematika bo'yicha mutaxassislar dasturlashni "to'g'ri yo'lga" qo'yishga harakat qilishdi, ammo axborot texnologiyalarining rivojlanishi butunlay boshqacha natija ko'rsatdi.

Pragmatik imperativ dasturlash yanada istiqbolli bo'lib chiqdi. "Prolog" dasturlash tili sifatida muvaffaqiyat qozondi, ammo sun'iy intellekt uchun asos bo'lmadi.

Klassik dasturlash va mantiq

Inson qiyin qarorlarni mantiqiy va oqilona qabul qiladi. Deyarli o'ylamasdan, odam donolik bilan harakat qiladi. Agar biz ma'lumot to'plash, uni tahlil qilish va murakkab hisob-kitoblarni talab qiladigan qarorlarni hisobga olmasak, har qanday natija tez, aniq va oqilona bo'ladi.

Bu fakt har doim qaror qabul qilish vositasini yaratishni oddiy masala deb hisoblash uchun xayoliy sabab bo'lgan. Prologue paydo bo'lishi bilan, sun'iy intellekt masalasi texnologiya masalasi bo'lib tuyuldi va Homo sapiens robototexnikaning uchta qonunini ishlab chiqdi. Biroq, sun'iy intellekt arvoh bo'lib qoldi va robototexnikaning uchta qonuni ertak bo'lib chiqdi - "buni qil, men nima bilmayman".

So'zning klassik ma'nosida dasturlash ("protsessual", "imperativ" yoki "funktsional" atamalari ko'pincha qo'llaniladi) son-sanoqsiz dasturlash tillari mavjud bo'lgan 80-90-yillardagi "muammoli vaqtlar" ni ishlab chiqdi va muvaffaqiyatli yengib chiqdi.

"Paskal" va "Si" o'rtasidagi namoyish kurashi uzoq davom etdi va shafqatsiz edi, lekin betaraf va jimgina yakunlandi. Qolgan narsa - yaxshi dasturlash tili g'oyasi va uning bir nechta muvaffaqiyatli amalga oshirilishi.

Bu Prolog dasturlash tili sifatida rivojlanmagan degani emas. Ammo u o'z oldiga qo'ygan maqsadlariga erisha olmadi. Bugun biz nafaqat aytishimiz, balki oqlashimiz ham mumkin: "Prolog" - bu akademik til:

  • o'quv maqsadlari;
  • predikativ mantiq;
  • matematika;
  • tor dastur.

Bu da'voni inkor etish mumkinligi shubhali. Sun'iy intellekt nafaqat keng qo'llaniladi, balki ijtimoiy tuzilmani va dunyo manzarasini tubdan o'zgartiradigan juda jiddiy hodisadir.

Sun'iy intellekt uchun prolog tilida dasturlash amalga oshirilmadi: tilning qirq yildan ortiq tarixi davomida jamoatchilik ongiga taalluqli bo'lgan, buning aksini ko'rsatadigan birorta ham tubdan yangi hodisa ro'y bermadi.

Ob'ektiv haqiqat shundaki: eng kuchlisi emas, balki talab va dolzarb bo'lgan narsa omon qoladi.

"Prolog" - deklarativ dasturlash tili

Faktlar va qoidalarni tasvirlash uchun vositaga ega bo'lish yaxshi, ammo buning nima keragi bor? Faktlar va qoidalar oddiy ma'lumotlar bazasiga juda mos keladi. Malakali klassik dasturchi foydalanuvchi uchun interaktiv muloqotni ta'minlaydi, ikkinchisi esa uning muammolarini hal qiladi.

Agar kerak bo'lsa, dasturchi dialogni aniqlaydi, foydalanuvchi esa faktlar va qoidalar ma'lumotlar bazasini to'ldiradi. Allaqachon hal qilingan va hal qilinishi mumkin bo'lgan ko'plab muammolarni amalga oshirish uchun mutlaqo ishlaydigan va o'nlab yillar davomida sinovdan o'tgan variant.

Prolog dasturlash tilining har qanday amalga oshirilishida faktlar va qoidalarning deklarativ taqdimoti konventsiya, reallikni intellektual holatida rasmiylashtirishga urinishdir. An'anaviy dasturlash aqlga tegmaydi. Klassik dasturlash pozitsiyadan mamnun: ma'lumotlarni tavsiflash va qayta ishlash. Bu erda juda ko'p muammolar bor, lekin ishlaydigan juda ko'p ajoyib echimlar mavjud.

"Prolog" dasturlash tili sifatida bu faktlar:

  • onasi (Mariya, Natasha); - Mariya - Natashaning onasi;
  • dadam (Evgeniy, Marina); - Evgeniy - Marinaning otasi.

Bu erda bir haqiqat darhol haddan tashqari ko'rinadi: "Mariya" va "Marina" - bu boshqa nomlar. Faktni qo'shishga hech narsa to'sqinlik qilmaydi:

  • dadam (Yevgeniy, Mariya); - Evgeniy - Mariyaning otasi.

Ushbu tavsiflar qoidalarga hayot bag'ishlaydi:

  • ota (x, y)<- папа (x, y);
  • ota (x, y)<- мама (x, y);

Ammo ular dadam Marinaning otasi, Marina esa Mariyaning onasi degan xulosaga kelishimizga imkon bermaydi. Bu muammoni hal qilish mumkin, siz yana bitta qoida qo'shishingiz mumkin, yana bitta fakt qo'shishingiz mumkin. Lekin bu harakatlarning qanchasi real vaziyatda amalga oshirilishi kerak?

Aslida, "Prolog" dasturlash tili sifatida faktlar va qoidalarni e'lon qilishning namunasidir, ammo klassik dasturchining ongi odatlangan mantiq emas. "Prolog" o'zini predikat mantiqiy til sifatida ko'rsatadi, ammo siz unda dasturlashni faqat tilning ma'lum bir amalga oshirilishini ishlab chiquvchilardan misollar va namuna tavsiflari orqali o'rganishingiz mumkin.

Prologlar oilasi

Frantsiya Prologning tug'ilgan joyi hisoblanadi va 1973 yil tug'ilgan yil hisoblanadi. Tilga qiziqish vaqti-vaqti bilan yangilanib turdi, ammo havas qiladigan barqarorlik bilan susaydi. Tilning shiori: “Predikat mantiqi elementardir! Bu fikrlash qanday ishlashini tushuntirishning bir usuli" - va shiori bo'lib qoldi.

Prolog dasturlash tilining har qanday amalga oshirilishi predikat mantig'iga qat'iy amal qilgan, lekin har doim protsessual dasturlashning klassik g'oyalarini o'z ichiga olgan. "Imperativ" deyish to'g'riroq, chunki bu atama protsessual, funktsional, ob'ektga yo'naltirilgan yoki boshqalarga qaraganda ko'proq rasmiyatchilik bilan qo'llaniladi.

Har qanday dasturlash ma'lumotlar va ularni qayta ishlash bilan bog'liq. Til konstruksiyalari hal qilinayotgan muammoni imkon qadar aniq tasvirlashi kerak, shuning uchun Prologning barcha maʼlum ilovalari: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog va boshqalar deklarativ konstruksiyalardan tashqari oddiy imperativ ifodalarni ham oʻz ichiga oladi.

Prologue oilasi akademik va tadqiqot tashkilotlarida ishlab chiqilgan va shuning uchun faqat kontseptual ma'noda umumiy til sifatida gapirish mumkin, deb ishoniladi. Shunga qaramay, "Prolog" kontseptsiyasining tirik va rivojlanayotganligini ko'rib chiqish mumkin: bu tilning ko'lami bor va u muayyan vazifalar doirasida talabga ega.

Sun'iy intellektning asosi

Sun'iy intellektga bo'lgan qiziqish hech qachon so'nmagan, ular bu haqda keyingi imkoniyat paydo bo'lganda gapirishni boshlaydilar, lekin Prolog hech qachon oddiy klassik dasturlash tilidan ko'ra sun'iy intellekt bilan bog'lanmagan.

80-yillarning oxirida "Ixtiro qiluvchi mashina" haqiqiy, dolzarb va mashhur intellektual loyihasi mavjud edi. Ixtirolar, fizik, kimyoviy va boshqa qonunlar bo'yicha ulkan amaliy bilimlar bazasini (ma'lumotlarini) rasmiylashtirish uchun Prologdan foydalanishga haqiqiy urinish bo'ldi.

Natijaga erishilmadi, prologda dasturlash tili sifatida juda ko'p faktlar va qoidalar yozilishi kerak edi, ular oddiy imperativ xarakterga ega edi. Shu bilan birga, ko'plab muvaffaqiyatli dasturiy mahsulotlar oddiy tillarda parallel ravishda amalga oshirildi.

90-yillarning boshlarida Evropa Ittifoqi kompyuterida 3 yoshgacha bo'lgan bolaning xatti-harakatlarini taqlid qiluvchi haqiqiy intellektual tizim loyihasi muvaffaqiyatli amalga oshirildi! Prologdan foydalanish imkoniyati hatto ko'rib chiqilmagan.

Ushbu intellektual tizim nafaqat ona va dadaning nima ekanligini va Mariya Marinadan qanday farq qilishini "aniqladi", balki ko'p harakat qilmasdan, mustaqil ravishda ushbu masalalar bo'yicha olingan bilimlardan to'plarga va ularning kublardan farqlariga, ranglariga o'tdi. ob'ektlar va... (!) elementar matematikaga: oddiy arifmetik amallar butunlay boshqa masalalarni yechish orqali olingan bilimlar asosida uning imkoniyatlari doirasida bo'lib chiqdi.

Klassik dasturlash sun'iy intellekt hududini o'zlashtirish bo'yicha Prologdan oldinda deb ayta olmaymiz, lekin u haqiqiy natijalarni beradi.

Aql-idrokka vazifa sifatida kelsak, bu erda savol tilda emas, balki uni amalga oshirish g'oyasida. Agar 1991 yilgi assembler situatsion razvedkaning aqlli tizimi uchun "asos" bo'lishi mumkin bo'lsa, unda masala amalga oshirish tilida emas, balki g'oyada ekanligi aniq.

Prolog dasturlash tili yetakchi mantiqiy dasturlash tillaridan biri hisoblanadi. U 1970-yillarda Alen Kolmerauer tomonidan yaratilgan. Bu yangi boshlanuvchilar uchun kompyuter ekranidagi ko'rsatmalar bilan nimaga erishmoqchi ekanligingizni diqqat bilan ko'rsatishdan ko'ra, mantiqni ifodalashga imkon beradigan dasturlash tilini yaratishga urinish edi.

Prolog ko'plab sun'iy intellekt dasturlarida qo'llaniladi, lekin uning sintaksisi va semantikasi juda sodda va tushunarli (asl maqsad kompyuter savodsiz tilshunoslar uchun vosita bilan ta'minlash edi). Prolog nomi mantiqiy dasturlashning qisqartmasi bo‘lib, dasturlash asoslarini o‘rgatishda keng tarqalgan.

Prolog predikatlar hisobiga asoslanadi (aniqrog'i, birinchi tartibli predikatlar hisobi), lekin u Horn formulalari bilan chegaralanadi. Prolog dasturlari teoremalarni birinchi yaqinlashishgacha isbotlash uchun samarali hisoblanadi. Qo'shilish, quyruq rekursiyasi va kuzatishning asosiy tushunchalari.

Ma'lumotlar turlari

Prolog biz umumiy dasturlash tillarida o'rganib qolgan ma'lumotlar turlaridan foydalanmaydi. Biz ma'lumotlar turlari o'rniga Prolog leksik elementlari haqida gapirishimiz mumkin, bu qo'g'irchoqlar uchun dasturlashda odatiy emas.

Doimiy matn atomlar yordamida kiritiladi. Atom kichik harf bilan boshlanadigan harflar, raqamlar va pastki chiziqdan iborat ketma-ketlikdir. Odatda, agar bu alfavit-raqamli atomlar bo'lmasa, ularni apostroflar bilan belgilash kerak (masalan, "+" - atom, + - operator).

Ko'pgina Prolog ilovalari haqiqiy va kasr sonlarni ajratmaydi.

O'zgaruvchilar

O'zgaruvchilar katta harfdan boshlanadigan harflar, raqamlar va pastki chiziqdan iborat qator bilan aniqlanadi. Prolog muhitida o'zgaruvchi tayinlanishi mumkin bo'lgan konteyner emas (protsessual dasturlash tillaridan farqli o'laroq). Uning xatti-harakati birlashmalarga o'xshash modelga yaqinroqdir.

Anonim deb ataladigan o'zgaruvchilar bitta pastki chiziq (_) sifatida yoziladi.

Shartlar Prolog murakkab ma'lumotlarni ifodalashning yagona yo'lidir. Bu atama funktor (atom bo'lishi kerak) va parametrlar (turlar bilan cheklanmagan) deb ham ataladigan boshdan iborat. Parametrlar soni, atamaning aritmi deb ataladigan narsa muhim ahamiyatga ega. Termin bosh va arit bilan belgilanadi, odatda funktor/arity sifatida yoziladi.
Ro'yxatlar

Roʻyxat mustaqil maʼlumotlar turi emas, chunki u rekursiv konstruksiya bilan aniqlanadi (/2 “.” atamasi yordamida):

Atom - bo'sh ro'yxat

Dasturchiga qulay bo'lishi uchun ro'yxatlar turli yo'llar bilan tuzilishi va yo'q qilinishi mumkin.

Agar L ro'yxat va X element bo'lsa, u holda "." (X, L) roʻyxatning aʼzosi. Birinchi element X va undan keyin L kontekstning mazmuni sintaktik tarzda ifodalanadi.

Dasturchiga qulay bo'lishi uchun ro'yxatlar turli yo'llar bilan tuzilishi va yo'q qilinishi mumkin.

Elementlar ro'yxati:
Bir elementning so'zboshi:
Dastlabki bir nechta elementlar:
Muddat kengaytmasi: "."(abc, "."(1, "."(f(x), "."(Y, "."(g(A,rst), )))))

Satrlar odatda qo'shtirnoq ichidagi belgilar ketma-ketligi sifatida yoziladi. Ular ko'pincha ASCII belgilar kodlari ro'yxati sifatida taqdim etiladi.

PROLOGda dasturlash protsessual tillar bilan ishlashdan keskin farq qiladi. Prologda siz faktlar va qoidalar ma'lumotlar bazalari bilan ishlaysiz, ma'lumotlar bazasi so'rovlarini bajarishingiz mumkin. Prologning asosiy birligi to'g'ri deb belgilangan predikatdir. Predikat bosh va bir qancha argumentlardan iborat. Masalan:

Bu erda "mushuk" bosh va "tom" argumentdir. Bu faktga asoslanib, Prolog tarjimonidan foydalanib bajarishingiz mumkin bo'lgan ba'zi so'rovlar misoli:

Mushuk (tom).
ha.

Mushuk (X).
X = tom;
yo'q.

Predikatlar odatda dastur dunyo haqida biladigan faktni ifodalash uchun aniqlanadi. Aksariyat hollarda predikatlardan foydalanish muayyan konventsiyalarni talab qiladi. Quyidagilardan qaysi biri Pat Sallining otasi ekanligini anglatadi?

Ota (sally, pat).
ota (pat, Sally).

Ikkala holatda ham "ota" bosh, "sally" va "pat" esa argumentlardir. Biroq, birinchi holatda, Sally argumentlar ro'yxatida birinchi o'rinda, Pat esa ikkinchi o'rinda va aksincha. Birinchi holat fe'l predmeti va ob'ekti tartibidagi ta'rifga misol bo'lsa, ikkinchi misolda tartib fe'l ob'ekt mavzusidir. Prolog ingliz tilini tushunmagani uchun ikkala versiya ham yaxshi, lekin shunday bir narsa yozishga to'g'ri kelmasdan, bitta dastur yozishda konventsiya deb ataladigan bir uslubga yopishib olish yaxshi dasturlash uslubi hisoblanadi:

Ota (pat, Sally). otasi (Jessika, Jeyms).

Ba'zi predikatlar tilga o'rnatilgan va Prolog-ga kundalik faoliyatning mashaqqatliligini kamaytirishga imkon beradi (masalan, grafikadan foydalangan holda kiritish/chiqarish va operatsion tizim bilan boshqa aloqalar). Masalan, yozish predikatlari quyidagi kabi ko'rsatish uchun ishlatilishi mumkin:

Yozing ("salom")

Ekranda "Salom" so'zini ko'rsatadi.

Qoidalar

Prologdagi bayonotning ikkinchi turi qoidalardir. Misol qoidasi:

Chiroq (yoqish): - yoqish (yoqish).

":-" "agar" degan ma'noni anglatadi, bu qoida agar yoqish (yoqish) rost bo'lsa, yorug'lik (yoqish) to'g'ri (yoqilgan) degan ma'noni bildiradi (agar kalit yoqilgan bo'lsa, unda yorug'lik bor). Qoidalar o'zgaruvchilardan ham foydalanishi mumkin; o'zgaruvchilar bosh harf bilan boshlanadi, doimiylar esa kichik harflar bilan boshlanadi. Masalan,

Ota(X,Y):- ota-ona(X,Y),erkak(Y).

Bu shuni anglatadiki, agar kimdir ota-ona bo'lsa va u erkak bo'lsa, u otadir. Sabablar va oqibatlar ham teskari tartibda bo'lishi mumkin, shuning uchun bu oddiy mantiqqa zid kelmaydi. Natijalar bo'limiga bir nechta predikatlarni birlashtirib joylashtirishingiz mumkin, masalan:

Bu bir nechta deklaratsiyalarga teng:

A:- d. b:- d. c:- d.

Ammo ko'rsatmalarga o'xshash:

Bu "agar c keyin a yoki b" ning ekvivalenti. Bu Horn formulasi tomonidan o'rnatilgan cheklash bilan bog'liq.