کیوری (به انگلیسی: 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) حالت بهینه را برای رسیدن به فرم نرمال فراهم می‌کند.

منابع ویرایش