کیوری

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

کیوری (به انگلیسی: Curry) یک زبان تجربی و تابع محور بر پایه زبان Haskell است. این زبان تلفیقی است از خصوصیت های برنامه نویسی منطقی و تابع محور. curry یک مجموعه بزرگ و نسبتا کامل از Haskell است که از ایجاد انواع متفاوت کلاس پشتیبانی نمی کند، گرچه بعضی از پیاده سازی های مرتبط این امکان را به عنوان ویژگیی افزونه بر این زبان فراهم می کنند، مانند Munster Curry Compiler.

مفاهیم پایه ی برنامه نویسی منطقی تابع محور[ویرایش]

مفاهیم پایه برنامه نویسی منظقیِ تابع محور یک برنامه تابع محور ،مجموعه ای از توابع است که به کمک قوانین تعریف شده اند. محتویات تابع می تواند شامل جایگزینی مقادیر به کمک علامت تساوی باشد. برای مثال تابع double را که به صورت زیر تعریف شده است می بینید. double x = x+x عبارت double 1 می تواند با 1+1 جایگزین شود.این روش به صورت زنجیروار قابل تعمیم است بطوریکه می توان 1+1+1 را به صورت 1+2 =3 نوشت .به عبارتی دیگر 'double (1+2)' → '(1+2)'+(1+2) → 3+'(1+2)' → '3+3' → 6 حالتی دیگر با جایگزینی راست به چپ نتیجه می شود 'double (1+2)' → (1+2)+'(1+2)' → '(1+2)'+3 → '3+3' → 6 همان طور که مشاهده می شود نتیجه دو عبارت با هم برابر است، بنابرین ترتیب و زمان جایگزینی تفاوتی ایجاد نمی کند.همین ویژگی توسعه و اصلاح این نوع برنامه ها را راحت تر می کند. برنامه های منظقی تابع محور ، همیشه این ویژگی را ندارند. Haskell به عنوان یه زبان تابع محور این خاصیت را داراست،در Curry می توان انواع داده های جبری ایجاد کرد. برای مثال نوع بولین می تواند به صورت زیر تعریف شود که یا دارای مقدار صحیح است یا غلط. data Bool = True | False توابع روی مقادیر بولین می توانند براساس بررسی تطابق با الگوها تعریف شوند. یعنی می توان براساس مقادیر مختلف نوع بولین (صحیح یا غلط) معادله های ممکن را نوشت : not True = False not False = True همانطور که می بینید قانون جایگزینی تساوی ها با هم هنوز برقرار است: not '(not False)' → 'not True' → False ساختارهای پیچیده تر داده را می توان با تعریف قوانین بازگشتی روی انواع داده ایجاد کرد. برای مثال یک لیست از داده (هر نوع داده دلخواه) ، یا لیستی خالی است ، یا لیستی است که یک المان مانند e:1 را به همراه لیست دیگری در ادامه شامل می شود(تعریف به صورت بازگشتی) : data List a = [] | a : List a نوع List معمولا به صورت [a] و لیست های محدود به صورت [e1,e2,...,en] نمایش داده می شوند.می توانیم عملگر ها را به صورت بازگشتی روی انواع داده تعریف کنیم.برایمثال عملیات ++ روی لیست های چند ریختی می تواند به صورت زیر تعریف شود: (++) :: [a] -> [a] -> [a] [] ++ ys = ys (x:xs) ++ ys = x : xs++ys بر این اساس می توان یک تابع با مشخص کردن روابط منطقی ایجاد کرد.مشابه زبانهای منظقی ، زبان های منطقی تابع محور نیز می توانند برای مثال تساوی xs++[e] = [1,2,3] را با جایگزینی xs با لیست [1,2] حل کنند. در Curry این عملیات می تواند به صورت زیر تعریف شود: last l | xs++[e] =:= l = e where xs,e free علامت =:= بررسی تساوی به صورت شرطی را معنی می دهد.برای مثال یه تساوی شرطی به صورت l | c = r زمانی انجام می شود که c برقرار باشد. برعکس زبانهای تابع محور عادی ، در این زبان می توان با حدس مقادیر مجهول نتیجه شرط را تعیین کرد.از روش نازک سازی (به انگلیسی : Narrowing) برای حل این نوع مسائل استفاده می شود که در ادامه توضیح داده می شود.

نازک سازی[ویرایش]

همانطور که در بخش قبل اشاره شد در این روش مقادیر ممکن برای یک متغیر در برنامه امتحان می شود. این روش از برنامه نویسی منطقی منتج شده است. نازک سازی بسیار مفید است زیرا یک تابع را می تواند به یک رابطه تبدیل کند : یعنی مقادیر آن می تواند در هر دو جهت مورد بررسی قرار بگیرد. مثالهای قبلی این موضوع را نشان می دهند. نازک سازی درواقع گراف برنامه را کوچک و بهینه می کند.در دهه 90 Antoy et al نشان داد که یک استراتژی نازک سازی خاص به نام نازک سازی مورد نیاز(به انگلیسی : needed narrowing) حالت بهینه را برای رسیدن به فرم نرمال فراهم می کند.

منابع[ویرایش]