Кіріспе

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

Сипаттама

Шектеу логикалық бағдарламалауда ағымдағы мақсаттағы мақсаттар тізбектей бағаланады, көбінесе LIFO тәртібімен, яғни жаңа мақсаттар бірінші бағаланады. Логикалық бағдарламалаудың параллельдік нұсқасы мақсаттарды параллель бағалауға мүмкіндік береді: әрбір мақсат жеке процесспен бағаланады және процестер бір мезгілде орындалады. Бұл процестер шектеулер сақтағышы арқылы өзара әрекеттеседі: бір процесс шектеулер сақтағышына шектеу қоса алады, ал екіншісі сақтағыштағы шектеудің салдары бар-жоғын тексереді. Шектеуді сақтағышқа қосу әдеттегі шектеу логикалық бағдарламалаудағыдай жүзеге асырылады. Шектеудің салдары бар-жоғын тексеру шарттардың күзетшілері арқылы жасалады. Күзетшілер синтаксистік кеңейтуді қажет етеді: параллельді шектеу логикалық бағдарламалау шарты H : G | B түрінде жазылады, мұнда G – шарттың күзетшісі деп аталатын шектеу. Дерексіз айтқанда, осы шарттың жаңа нұсқасы тек қана күзетші шектеуі сақтағышта болған жағдайда ғана, мақсаттағы литералды ауыстыру үшін қолданылуы мүмкін, бұл үшін литерал мен шарт басының теңдеуі сақтағышқа қосылады. Бұл ереженің нақты анықтамасы күрделірек және төменде келтіріледі. Бір мезгілдегі емес және бір мезгілдегі шектеу логикалық бағдарламалау арасындағы басты айырмашылық – біріншісі іздеуге, ал екіншісі параллельді процестерді іске асыруға бағытталған. Бұл айырмашылық таңдауларды кері қайтару мүмкіндігіне, процестердің тоқтауына рұқсат етілмеуіне және мақсаттар мен шарттардың бас жағының теңестірілу жолына әсер етеді. Қалыпты және бір мезгілдегі шектеу логикалық бағдарламалау арасындағы бірінші семантикалық айырмашылық – мақсатты дәлелдеу үшін бірнеше шарт қолданылатын жағдайға қатысты. Бір мезгілдегі емес логикалық бағдарламалау мақсатты қайта жазу кезінде барлық мүмкін шарттарды тексереді: егер мақсатты шарттың жаңа нұсқасының денесімен алмастыру арқылы дәлелдеуге болмаса, басқа шарт дәлелденіп, егер бар болса, қолданылады. Себебі мақсатты дәлелдеу – басты міндет, сондықтан мақсатты дәлелдеудің барлық мүмкін жолдары тексеріледі. Ал бір мезгілдегі шектеу логикалық бағдарламалау параллельді процестерді бағдарламалауға бағытталған. Жалпы, параллельді бағдарламалауда процесс таңдау жасаса, бұл таңдауты кері қайтаруға болмайды. Шектеу логикалық бағдарламалаудың параллельдік нұсқасы процестерге таңдау жасауға мүмкіндік береді, бірақ олар жасағаннан кейін оған міндеттеме алады. Техникалық тұрғыдан алғанда, егер мақсаттағы литералды қайта жазу үшін бірнеше шарт қолданылатын болса, бір мезгілдегі емес нұсқа барлық шарттарды тізбектеп тексереді, ал бір мезгілдегі нұсқа бір ғана кездейсоқ шартты таңдайды: бір мезгілдегі емес нұсқадан айырмашылығы, басқа шарттар ешқашан тексерілмейді. Көптеген таңдауларды басқарудың осы екі әдісі «қандай екенін білмейтін детерминизм» және «қанағаттандыратын детерминизм» деп аталады. Мақсаттағы литералды қайта жазу кезінде қарастырылатын шарттар – шектеу сақтағышының және литералдың шарт басымен теңдеуінің бірігісінен шығатын күзетшісі бар шарттар ғана. Күзетшілер қандай шарттарды мүлдем қарастыруға болмайтынын анықтайды. Бұл, әсіресе, бір мезгілдегі шектеу логикалық бағдарламалаудың бір ғана шартқа міндеттемесін ескере отырып маңызды: шартты бір рет таңдағаннан кейін, бұл таңдау ешқашан қайта қарастырылмайды. Күзетшілер болмаса, интерпретатор литералды қайта жазу үшін «жаман» шартты таңдауы мүмкін, ал басқа «жақсы» шарттар бар. Бір мезгілдегі емес бағдарламалауда бұл кем маңызды, өйткені интерпретатор әрқашан барлық мүмкіндіктерді тексереді. Бір мезгілдегі бағдарламалауда интерпретатор басқаларын сынамай-ақ бір ғана мүмкіндікке міндеттенеді. Бір мезгілдегі емес және бір мезгілдегі нұсқалар арасындағы айырмашылықтың екінші салдары – бір мезгілдегі шектеу логикалық бағдарламалау процестердің тоқтамай жұмыс істеуіне мүмкіндік беру үшін арнайы жасалған. Тоқтамайтын процестер жалпы алғанда, параллельді өңдеуде жиі кездеседі; шектеу логикалық бағдарламалаудың параллельдік нұсқасы оларды сәтсіздік шартын пайдаланбай іске асырады: егер мақсатты қайта жазу үшін ешқандай шарт қолданылмаса, осы мақсатты бағалау процесі тоқтатылады, бұл бүкіл бағалауды бір мезгілдегі емес шектеу логикалық бағдарламалаудағыдай сәтсіздікке ұшыратады. Нәтижесінде, мақсатты бағалау процесі тоқтатылуы мүмкін, өйткені жалғастыру үшін ешқандай шарт жоқ, бірақ сонымен бірге басқа процестер жұмысын жалғастырады. Әр түрлі мақсаттарды шешетін процестердің синхрондалуы күзетшілерді пайдалану арқылы жүзеге асырылады. Егер мақсатты қайта жазу мүмкін болмаса, өйткені қолданылатын барлық шарттардың күзетшісі шектеу сақтағышында болмайды, осы мақсатты шешетін процесс күзетшінің кемінде бір қолданылатын шарттың салдары болуы үшін басқа процестердің қажетті шектеулерді қосуын күтеді. Бұл синхрондалу өлі тұруға бейім: егер барлық мақсаттар тоқтатылса, жаңа шектеулер қосылмайды және демек, ешқандай мақсат ешқашан тоқтатылмайды. Бір мезгілдегі және бір мезгілдегі емес логикалық бағдарламалау арасындағы үшінші айырмашылық – мақсатты шарттың жаңа нұсқасының басымен теңестіру жолында. Операциялық тұрғыдан алғанда, бұл шарт басының айнымалыларын мақсатқа тең болатындай терминдермен теңестіруге болатынын тексеру арқылы жасалады. Бұл ереже шектеу логикалық бағдарламалаудағы сәйкес ережеден айырмашылығы, ол тек айнымалы=термин түріндегі шектеулерді қосуға рұқсат береді, мұнда айнымалы шарт басының бірі болады. Бұл шектеу мақсат пен шарт басын әртүрлі қарастыратын бағыттылықтың бір түрі ретінде қарастырылуы мүмкін. Нақты айтқанда, шарттың жаңа нұсқасы H: G|B мақсатты A қайта жазу үшін қолданылатындығын анықтайтын ереже мынадай: Біріншіден, A мен H бірдей предикатқа ие екені тексеріледі. Екіншіден, қазіргі шектеу сақтағышында берілген A мен H теңестірілуіне болатындығы тексеріледі; қалыпты логикалық бағдарламалаудан айырмашылығы, бұл шарт басының айнымалысы тек терминге тең болатын бір жақты біріктіру арқылы жасалады. Үшіншіден, күзетші шектеу сақтағышынан және екінші қадамда жасалған теңдеулерден шығарылатындығы тексеріледі; күзетші шарт басында көрсетілмеген айнымалыларды қамтуы мүмкін: бұл айнымалылар экзистенциалды түрде түсіндіріледі. Шарттың жаңа нұсқасының мақсатты ауыстыруға қолданылуын шешу әдісін былай қысқаша түсіндіруге болады: қазіргі шектеу сақтағышы шарт басының айнымалыларының және күзетшінің бағалануы бар екенін көрсетеді, сонда шарт басы мақсатқа тең болады және күзетші салдары бар. Іс жүзінде, салдарды тексеру толық емес әдіспен жүзеге асырылуы мүмкін. Параллельді логикалық бағдарламалаудың синтаксисі мен семантикасына қосымша – атомдық хабарлау. Интерпретатор шартты қолданғанда, оның күзетшісі шектеу сақтағышына қосылады. Алайда, дене шектеулері де қосылады. Осы шартқа міндеттеме бергендіктен, интерпретатор дене шектеулері сақтағышпен қайшы болса да кері қайтпайды. Бұл жағдайды атомдық хабарлауды пайдалану арқылы болдырмауға болады, ол шартта «екінші күзетші» түрін қамтитын нұсқа болып табылады, ол тек тұрақтандыру үшін тексеріледі. Мұндай шарт H : G:D | B түрінде жазылады. Бұл шарт тек қана G шектеу сақтағышынан шығарылатын болса және D онымен үйлесімді болса ғана литералды қайта жазу үшін қолданылады. Бұл жағдайда G және D екеуі де шектеу сақтағышына қосылады.

Тарих

Бір мезгілдегі шектеулі логикалық бағдарламалауды зерттеу 1980 жылдардың соңында басталды, осы кезде Майкл Дж. Махер бір мезгілдегі логикалық бағдарламалау принциптерінің бір бөлігін шектеулі логикалық бағдарламалаумен біріктірді. Кейіннен, Мартин Ринард және Виджай А. Сарасват сияқты түрлі авторлар бір мезгілдегі шектеулі логикалық бағдарламалаудың теориялық қасиеттерін зерттеді.