Кіріспе
Бағдарламалау парадигмасы, онда айнымалылар арасындағы қатынастар шектеулер түрінде беріледі. Шектеулер бағдарламалауы (ШБ) – жасанды интеллект, компьютерлік ғылым және операциялық зерттеулер салаларынан алынған әдістерді пайдалана отырып, комбинаторлық есептерді шешуге арналған парадигма. Шектеулер бағдарламалауда қолданушылар шешім айнымалылары жиыны үшін қолданылатын шешімдерге шектеулерді декларативті түрде көрсетеді. Шектеулер императивті бағдарламалау тілдерінің әдеттегі негізгі элементтерінен өзгеше, олар орындалатын қадамды немесе қадамдар тізбегін емес, табылатын шешімнің қасиеттерін анықтайды. Шектеулерден басқа, қолданушылар осы шектеулерді шешу әдісін де көрсетуі керек. Бұл көбінесе хронологиялық кері іздеу және шектеулер таратуы сияқты стандартты әдістерді қамтиды, бірақ проблемаға тән тармақтану эвристикасы сияқты арнайы кодты пайдалануға да болады. Шектеулер бағдарламалау шектеулік логикалық бағдарламалаудан бастау алады және оны логикалық бағдарламаға шектеулерді енгізу арқылы білдіруге болады. Логикалық бағдарламалаудың бұл түрі Жаффар мен Лассезге тиесілі, олар 1987 жылы Prolog II-де ұсынылған шектеулердің нақты класын кеңейтті. Шектеулік логикалық бағдарламалаудың алғашқы іске асырылымдары Prolog III, CLP(R) және CHIP болды. Логикалық бағдарламалаудың орнына шектеулерді функционалдық бағдарламалаумен, термин түрлендірумен және императивті тілдермен үйлестіруге болады. Шектеулерді қолдауға арналған бағдарламалау тілдеріне Oz (функционалдық бағдарламалау) және Kaleidoscope (императивті бағдарламалау) жатады. Көбінесе шектеулер императивті тілдерде шектеулерді шешу құралдары арқылы іске асырылады, олар қолданыстағы императивті тіл үшін жеке кітапханалар болып табылады.
Constraint programming (CP) is a paradigm for solving combinatorial problems that draws on a wide range of techniques from artificial intelligence, computer science, and operations research. In constraint programming, users declaratively state the constraints on the feasible solutions for a set of decision variables. Constraints differ from the common primitives of imperative programming languages in that they do not specify a step or sequence of steps to execute, but rather the properties of a solution to be found. In addition to constraints, users also need to specify a method to solve these constraints. This typically draws upon standard methods like chronological backtracking and constraint propagation, but may use customized code like a problem specific branching heuristic. Constraint programming takes its root from and can be expressed in the form of constraint logic programming, which embeds constraints into a logic program. This variant of logic programming is due to Jaffar and Lassez, who extended in 1987 a specific class of constraints that were introduced in Prolog II. The first implementations of constraint logic programming were Prolog III, CLP(R), and CHIP. Instead of logic programming, constraints can be mixed with functional programming, term rewriting, and imperative languages. Programming languages with built in support for constraints include Oz (functional programming) and Kaleidoscope (imperative programming). Mostly, constraints are implemented in imperative languages via constraint solving toolkits, which are separate libraries for an existing imperative language.
Шектеу логикасын бағдарламалау
Шектеулер бағдарламалауы – бұл хост тілінде шектеулерді енгізу. Алғашқы хост тілдері логикалық бағдарламалау тілдері болғандықтан, бұл сала бастапқыда шектеулі логикалық бағдарламалау деп аталды. Екі парадигма да логикалық айнымалылар және кері іздеу сияқты маңызды ерекшеліктерді бөліседі. Бүгінде Prolog-тың көптеген нұсқалары шектеулі логикалық бағдарламалау үшін бір немесе бірнеше кітапханаларды қамтиды. Екеуінің арасындағы ең басты айырмашылық – әлемді модельдеудегі стильдері мен тәсілдері. Кейбір мәселелерді логикалық бағдарламалар түрінде жазуға көбірек үйлеседі (және осылай оңайырақ болады), ал кейбіреулерін шектеулер бағдарламалары түрінде жазуға ыңғайлы. Шектеулер бағдарламалау тәсілі – әлемде көптеген шектеулердің бір уақытта орындалуын қамтамасыз ететін жағдайды іздеу. Мәселе әдетте әлемнің белгілі бір күйінде, бірнеше белгісіз айнымалылары бар ретінде қойылады. Шектеу бағдарламасы барлық айнымалыларға мән табуға тырысады. Уақыттық бір мезгілде шектеулі бағдарламалау (TCC) және детерминистік емес уақыттық бір мезгілде шектеулі бағдарламалау (MJV) – бұл уақытпен жұмыс істей алатын шектеулер бағдарламалауының түрлері.
Шектеудің таралуы
Жергілікті сәйкестік шарттары – айнымалылар немесе шектеулердің ішінара жиынтықтарының сәйкестігімен байланысты шектеулерді қанағаттандыру мәселелерінің қасиеттері. Олар іздеу кеңістігін қысқартуға және мәселені шешуді жеңілдетуге мүмкіндік береді. Түйіндік сәйкестік, доғалық сәйкестік және жолдық сәйкестік сияқты жергілікті сәйкестік шарттарының түрлі нұсқалары қолданылады. Кез келген жергілікті сәйкестік шартын мәселенің шешімдерін өзгертпей оны өзгертетін түрлендіру арқылы сақтауға болады. Мұндай түрлендіру шектеу тарату деп аталады. Шектеу тарату айнымалылардың мәндік облыстарын қысқарту, шектеулерді күшейту немесе жаңаларын жасау арқылы жұмыс істейді. Бұл іздеу кеңістігінің қысқаруына алып келеді, соның салдарынан кейбір алгоритмдермен мәселені шешу оңайырақ болады. Шектеу тарату қанағаттандырылмаушылықты тексеру құралы ретінде де қолданылуы мүмкін, ол әдетте толық емес, бірақ кейбір жағдайларда толық болады.
Шектеулерді шешу
Шектілік қанағаттандыру мәселелерін шешу үшін үш негізгі алгоритмдік әдіс бар: кері іздеу, жергілікті іздеу және динамикалық бағдарламалау.
Қайта іздеу
Артқа іздеу – есептеу мәселелерінің, әсіресе шектеулерді қанағаттандыру мәселелерінің барлық (немесе кейбір) шешімдерін табуға арналған жалпы алгоритм. Ол шешімге үміткерлерді кезең-кезеңімен құрастырады және егер үміткерді жарамды шешімге аяқтау мүмкін емес екенін анықтаса, одан бас тартады ("артқа қайтады").
Жергілікті іздеу
Жергілікті іздеу – мәселенің шешімін табудың толық емес әдісі. Ол барлық шектеулер орындалғанға дейін айнымалылардың берілуін қайталап жақсартуға негізделген. Атап айтқанда, жергілікті іздеу алгоритмдері әр қадамда берілудегі бір айнымалының мәнін өзгертеді. Жаңа берілу, берілу кеңістігінде алдыңғы берілуге жақын болғандықтан, осыған байланысты жергілікті іздеу деп аталады.
Динамикалық бағдарламалау
Динамикалық бағдарламалау – математикалық оңтайландыру әдісі және компьютерлік бағдарламалау әдісі. Ол күрделі мәселені рекурсивті түрде қарапайым қосалқы мәселелерге бөліп, осылайша оңайлатуды білдіреді. Кейбір шешімді қабылдауға болатын мәселелерді осылай бөлу мүмкін болмаса да, уақыт бойынша бірнеше нүктеге созылатын шешімдер көбінесе рекурсивті түрде бөлінеді. Сонымен қатар, компьютер ғылымында, егер мәселені қосалқы мәселелерге бөліп оңтайлы шешуге болады, және содан кейін қосалқы мәселелерге оңтайлы шешімдерді рекурсивті түрде табуға болады, онда осы мәселенің оңтайлы құрылымы бар делінеді.