Кіріспе

Компьютерлік ғылымдағы алгоритмнің түрі

Компьютерлік ғылымда corecursion – рекурсияға қарама-қарсы операцияның түрі. Рекурсия аналитикалық түрде жұмыс істейді, базалық жағдайдан алыс деректерден бастап, оларды кішірек деректерге бөліп, базалық жағдайға жеткенше қайталайды. Ал corecursion синтетикалық түрде жұмыс істейді, базалық жағдайдан бастап оны құрастырады, қайталап, базалық жағдайдан алысқан деректерді шығарады. Қарапайым тілмен айтқанда, corecursive алгоритмдер өздері жасайтын деректерді, олар қолжетімді болған сайын және қажет болғанда, біртіндеп пайдаланады, осы арқылы қосымша деректерді өндіреді. Бұған ұқсас, бірақ ерекше ұғым – генеративтік рекурсия, онда corecursion мен рекурсияға тән нақты "бағыт" болмауы мүмкін. Рекурсия бағдарламаларға кез келген күрделі деректермен жұмыс жасауға мүмкіндік береді, егер оларды қарапайым деректерге (базалық жағдайларға) келтіруге болады. Ал corecursion бағдарламаларға ағын сияқты, кез келген күрделі және мүмкін шексіз дерек құрылымдарын жасауға мүмкіндік береді, егер оларды қарапайым деректерден (базалық жағдайлардан) шекті қадамдар тізбегі арқылы жасауға болады. Рекурсия аяқталуы мүмкін емес, ешқашан базалық жағдайға жетпейді, ал corecursion базалық жағдайдан басталады, сондықтан келесі қадамдарды детерминистік түрде жасайды, бірақ ол шексіз жалғасуы мүмкін (және қатаң бағалау кезінде аяқталмайды) немесе ол өндіргеннен көп тұтынуы мүмкін, соның салдарынан өнімді болмайды. Көптеген функциялар, дәстүрлі түрде рекурсивті деп талданады, альтернативті және, әрине, табиғи түрде, белгілі бір кезеңде аяқталатын corecursive функциялар ретінде түсіндірілуі мүмкін, мысалы, факториал сияқты қайталану қатынастары. Corecursion нәтижесі ретінде шекті және шексіз дерек құрылымдарын шығара алады және өзіне сілтеме жасайтын дерек құрылымдарын қолдана алады. Corecursion жиі жалқау бағалаумен бірге қолданылады, ықтимал шексіз құрылымның шекті жиынтығын ғана өндіру үшін (бірден бүкіл шексіз құрылымды өндіруге тырысудың орнына). Corecursion функционалдық бағдарламалауда ерекше маңызды ұғым болып табылады, онда corecursion және codata жалпы тілдерге шексіз дерек құрылымдарымен жұмыс істеуге мүмкіндік береді.

Мысалдар

Corecursion-ды көбірек таныс рекурсиямен салыстыру арқылы түсінуге болады. Corecursion көбінесе функционалдық бағдарламалауда қызығушылық тудырса да, оны императивті бағдарламалау арқылы мысалмен көрсетуге болады, бұл төменде Python-дағы генератор мүмкіндігін пайдаланып жасалады. Бұл мысалдарда жергілікті айнымалылар қолданылады және оларға императивті (өзгертетін) түрде мәндер беріледі, бірақ бұл таза функционалдық бағдарламалаудағы corecursion үшін қажет емес. Таза функционалдық бағдарламалауда жергілікті айнымалыларға мән берудің орнына, есептелген мәндер өзгермейтін тізбек құрайды, ал бұрынғы мәндерге өзіне сілтеме жасау арқылы қол жеткізіледі (тізбектегі келесі мәндер есептелуі тиіс тізбектегі бұрынғы мәндерге сілтеме жасайды). Мұндай мән берулер императивті парадигмада осыны ғана көрсетеді және есептеулер қайда орындалатынын нақты көрсетеді, бұл түсіндіруді айқындырақ жасайды.

Анықтама

Бастапқы дерек типтері белгілі бір типтегі теңдеудің ең кішкентай тұрақты нүктесі (изоморфизмге дейін) ретінде анықталуы мүмкін; изоморфизм бастапқы алгебра арқылы беріледі. Дуалды түрде, соңғы (немесе терминалды) дерек типтері типтегі теңдеудің ең үлкен тұрақты нүктесі ретінде анықталуы мүмкін; изоморфизм содан кейін соңғы коалгебра арқылы беріледі. Егер сөз домені жиынтар мен толық функциялар санаты болса, онда соңғы дерек типтері шексіз, негізсіз мәндерді қамтуы мүмкін, ал бастапқы типтерде мұндай мәндер болмайды. Керісінше, егер сөз домені толық ішінара реттелген жиындар мен үздіксіз функциялар санаты болса, бұл шамамен Haskell бағдарламалау тіліне сәйкес келеді, онда соңғы типтер бастапқы типтермен сәйкес келеді, ал сәйкес соңғы коалгебра мен бастапқы алгебра изоморфизм құрайды. Корекурсия – бұл функцияларды рекурсивті түрде анықтау әдісі, олардың мәндер жиыны (кодомені) соңғы дерек типі болып табылады, бұл әдеттегі рекурсия функцияларды рекурсивті түрде анықтаудан өзгеше, олардың анықталу домені бастапқы дерек типі болып табылады. Төмендегі талқылауда Haskell-те корекурсияны көрсететін бірнеше мысал келтірілген. Шамамен айтқанда, егер осы анықтамалар жиынтар санатына көшірілсе, олар әлі де корекурсивті болар еді. Бұл бейресми қолдану Haskell туралы қолданыстағы оқулықтармен сәйкес келеді. Осы мақалада келтірілген мысалдар корекурсияны анықтау және оның мәнін түсіндіру әрекеттерінен бұрын жасалған.

Тарих

Corecursion, циркулярлық бағдарламалау деп аталады, кем дегенде , Джон Хьюз бен Филип Уодлерге қарызы; одан да жалпы формалары әзірленді. Бастапқы себептердің қатарында тиімдірек алгоритмдер жасау (кейбір жағдайларда деректерді бір рет қарауға мүмкіндік беру, бірнеше рет қарау қажеттілігін жою) және функционалдық тілдерде екі жақты байланысқан тізімдер мен кезектер сияқты классикалық дерек құрылымдарын іске асыру болды.