Boshqa so'rovlar
Prolog-ga boshqa umumiy so'rovlar yuborilishi mumkin, bu tizim bir nechta natijalarni keltirib chiqaradi:
-? - parent_of (Ota-ona, bola).
- Ota = bobbi
- Bola = Karlos
- Ota = Karlos
- Bola = doris
Ko'rib turganimizdek, mantiqiy dasturlash, ular haqida bilim olish uchun alissa yoki bobbi odamlar ekanligi haqida ma'lumotga ega bo'lishni talab qilmaydi. Aslida, shaxs deb nomlangan tushunchaning mavjudligini ko'rsatish shart emas.
Ko'pgina mantiqiy bo'lmagan dasturlash tillarida, odamlar haqida ma'lumotni qayta ishlaydigan dasturlarni yozishdan oldin, avval ushbu tushunchalarni aniqlab olishingiz kerak bo'ladi.
Mantiqiy dasturlash va funktsional dasturlash o'rtasidagi farq
Mantiqiy dasturlash dasturlarni matematik ifodalar orqali belgilaydi; bu funktsional dasturlashga o'xshaydi. Mantiqiy dasturlash mantiqiy ifodalarni ishlatadi (yaxshi, oxir-oqibat mantiq matematika).
Menimcha, funktsional va mantiqiy dasturlash o'rtasidagi asosiy farq "qurilish bloklari" dir: funktsional dasturiy funktsiyalarni funktsiyadan foydalanadi, mantiqiy dasturlash predikatlardan foydalanadi. Bevosita funksiya emas; u qaytish qiymatiga ega emas. Uning argumentlarining qiymatiga qarab, u haqiqiy yoki noto'g'ri bo'lishi mumkin; agar ba'zi bir qiymatlar aniqlanmagan bo'lsa, unda asosni to'g'ri bajaradigan qadriyatlarni topishga urinib ko'riladi.
Prolog, birinchi navbatdagi mantiqqa tegishli Horn clauses nomli maxsus mantiqiy qoidalarini qo'llaydi; Hilog yuqori tartibli mantiq qoidalarini qo'llaydi.
Prognozni oldindan belgilaganingizda shoxni belgilashingiz kerak: foo: - bar1, bar2, bar3. agar bar1, bar2 va bar3 rost bo'lsa, foo rost bo'lsa. Men aytmadim va faqat agar; bitta predikate uchun bir nechta moddalar bo'lishi mumkin:
foo:-
bar1.
foo:-
bar2.
Agar bar1 rost bo'lsa yoki bar2 rost bo'lsa, foo rost bo'lsa
Ba'zilar, mantiqiy dasturiy funktsional dasturlashning ustunligidandir, chunki har bir funktsiyaning asosiy sababi sifatida ifodalanishi mumkin:
foo(x,y) -> x+y.
sifatida yozilishi mumkin
foo(X, Y, ReturnValue):-
ReturnValue is X+Y.
ammo bu kabi bayonotlar biroz noto'g'ri deb hisoblayman
Mantiq va funktsional farqning yana bir farqi - takrorlash. Funktsional dasturlashda funksiya tanasiga kirganingizdan so'ng siz muvaffaqiyatsiz bo'lib, keyingi ta'rifga o'tishingiz mumkin. Masalan, siz yozishingiz mumkin
abs(x) ->
if x>0 x else -x
yoki hatto soqchilardan foydalaning:
abs(x) x>0 -> x;
abs(x) x=<0 -> -x.
ammo yozolmaysiz
abs(x) ->
x>0,
x;
abs(x) ->
-x.
Boshqa tomondan, Prolog da siz yozishingiz mumkin edi
abs(X, R):-
X>0,
R is X.
abs(X, R):-
R is -X.
if then you call abs(-3, R), Prolog would try the first clause, and fail when the execution reaches the -3 > 0 point but you wont get an error; Prolog will try the second clause and return R = 3.
Funktsional til uchun shunga o'xshash narsani amalga oshirish mumkin emas, deb o'ylamayman (lekin men bunday tilni ishlatmaganman).
Umuman olganda, har ikkala paradigma ham deklarativ deb hisoblansa-da, ular juda boshqacha; ular bilan taqqoslaganda, funktsional va majburiy uslublarni taqqoslash kabi his. Mantiqiy dasturlashni biroz sinab ko'rishni taklif qilaman; bu aql bovar qilmas tajriba bo'lishi kerak. Biroq, siz faqat falsafani tushunishga harakat qilmoqchisiz; Prolog sizga funktsional yoki hatto imperativ uslubda (dahshatli natijalar bilan) yozish imkonini beradi.
Funktsional dasturlashda sizning dasturingiz funktsional tavsiflar to'plamidir. Har bir funktsiyani qaytarish qiymati matematik ifodalar sifatida baholanadi, ehtimol o'tgan argumentlarni va boshqa aniqlangan funktsiyalardan foydalanadi. Masalan, siz ma'lum bir raqamning factorialini qaytaradigan factorial funktsiyasini belgilashingiz mumkin:
factorial 0 = 1 //a factorial of 0 is 1
factorial n = n * factorial (n - 1) //a factorial of n is n times factorial of n - 1
Mantiqiy dasturlashda sizning dasturingiz birlamchi predmetlar majmui. Predikatlar, odatda, har bir moddada matematik ifodalar, boshqa belgilangan predikatlar va taklifnomalar yordamida aniqlanishi mumkin bo'lgan moddalar to'plami sifatida tavsiflanadi. Misol uchun, siz "argumentli" bir asosni belgilashingiz mumkin, bu ikkinchi argüman birinchi navbatda,
factorial(0, 1). //it is true that a factorial of 0 is 1
factorial(X, Y) :- //it is true that a factorial of X is Y, when all following are true:
X1 is X - 1, //there is a X1, equal to X - 1,
factorial(X1, Z), //and it is true that factorial of X1 is Z,
Y is Z * X. //and Y is Z * X
Har ikkala uslub ham dasturlarda matematik ifodalarni ishlatishga imkon beradi.
0>
Do'stlaringiz bilan baham: |