Автор работы: Пользователь скрыл имя, 14 Сентября 2014 в 20:59, реферат
Программирование в ограничениях (или программирование ограничениями) является парадигмой программирования, в которой отношения между переменными указаны в форме ограничений. Ограничения отличаются от общих примитивов языков императивного программирования тем, что они определяют не последовательность шагов для исполнения, а свойства искомого решения. Это делает программирование в ограничениях формой декларативного программирования. Ограничения, которые используются в программировании в ограничениях, бывают различных видов: те, которые используются в задачах удовлетворения ограничений (например, «А или В истинно»), те, которые решаются симплекс-алгоритмом (например, «x ≤ 5») и другие. Ограничения, как правило, встроены в язык программирования или осуществляются через отдельные программные библиотеки.
1.Введение……………………………………………………………………..2
2.Основы логистического программирования………………………………3
3.Программирование в ограничениях………………………………………..4
4.Удовлетворение в ограничениях…………………………………………...6
Содержание
1.Введение……………………………………………………
2.Основы логистического программирования………………………………3
3.Программирование в
4.Удовлетворение в
ВВЕДЕНИЕ
Программирование
в ограничениях (или программиров
Программирование в ограничениях тесно связано с теорией удовлетворения ограничений, которая предлагает удобный аппарат и простую формальную схему для представления и решения комбинаторных задач искусственного интеллекта.
Программирование в ограничениях началась с логического программирования с ограничениями (ЛПО), которое является вкладыванием ограничений в логическое программирование. Появление этого варианта логического программирования связано с именами Jaffar и Lassez, которые расширили в 1987 году определенный класс ограничений, которые были введены в Prolog II. Первыми реализациями логического программирование в ограничениях были Пролог III, CLP (R) и CHIP. Некоторые интерпретаторы логического программирования в ограничениях существуют и сегодня, например GNU Prolog.
Помимо логического программирования, ограничения могут быть смешаны с функциональным программированием, переписыванием и императивным языком. Языки программирования с встроенной поддержкой ограничений включаютOz (функциональное программирование) и Kaleidoscope (императивное программирование). Главным образом, ограничения осуществляются в императивных языках через инструментальные средства для решения задач с ограничениями, которые являются отдельными библиотеками для существующих императивных языков.
ОСНОВЫ ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ.
Логическое программирование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций.
Самым известным языком логического программирования является Prolog.
Парадигма программирования — это совокупность идей и понятий, определяющих стиль написания компьютерных программ. Это способ концептуализации, определяющий организацию вычислений и структурирование работы, выполняемой компьютером.
Важно отметить, что парадигма программирования не определяется однозначно языком программирования; практически все современные языки программирования в той или иной мере допускают использование различных парадигм (мультипарадигмальное программирование).
Пролог (фр. Programmation en Logique) — язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.
Основными понятиями в языке Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений.
Факты в языке Пролог описываются логическими предикатами с конкретными значениями. Правила в Прологе записываются в форме правил логического вывода с логическими заключениями и списком логических условий.
Особую роль в интерпретаторе Пролога играют конкретные запросы к базам знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода.
Факты в базах знаний на языке Пролог представляют конкретные сведения (знания). Обобщённые сведения и знания в языке Пролог задаются правилами логического вывода (определениями) и наборами таких правил вывода (определений) над конкретными фактами и обобщёнными сведениями.
ПРОГРАММИРОВАНИЕ В ОГРАНИЧЕНИЯХ.
Программирование в ограничениях (constraint programming)- достаточно новое направление в декларативном программировании. Появилось оно во многом в результате развития систем символьных вычислений, искусственного интеллекта и исследования операций.
Программирование в ограничениях - это программирование в терминах "постановок задач".
Постановка задачи - это конечный набор переменных V = {v[1], ..., v[n]}, соответствующих им конечных (перечислимых) множеств значений D = {D[1], ...,D[n]}, и набор ограничений С = {C[1],...,C[m]}. Ограничения представлены как утверждения, в которые входят в качестве "параметров" переменные из некоторого подмножества V[j],j=1..m набора V. Решение такой задачи - набор значений переменных, удовлетворяющий всем ограничениям C[j].
Синтаксически такую постановку задачи можно записать как "правило" для "типизированного" Пролога:
problem(V1:D1, ..., Vn:Dn) :-
С1, ... Cm.
Семантически, однако, программирование в ограничениях отличается от традиционного логического программирования в первую очередь тем, что исполнение программы рассматривается не как доказательство утверждения, а нахождение значений переменных. При этом порядок "удовлетворения" отдельных ограничений не имеет значения, и система программирования в ограничениях, как правило, стремится оптимизировать порядок "доказательства" утверждений с целью минимизации отката в случае неуспеха.С этой целью набор ограничений может быть соответствующим образом преобразован - по правилам, аналогичным правилам Пролога. Любую задачу можно рассматривать как ограничение: "значения переменных должны быть решением этой задачи". Часто о программировании в ограничениях говорят исключительно как о "дополнительной" ветви логического программирования.
В качестве примера, мы можем задать системе программирования в ограничениях следующий запрос:
? (X : integer) X>1, member(X, [1,2,3]).
Типичная Пролог-система на таком запросе выдаст ошибку: Х является неинициализированной переменной, и его нельзя сравнивать с числом 1. Система, поддерживающая программирование в ограничениях, воспримет эти "утверждения" как ограничения (а не как цели, которые требуется доказать), и выдаст нам требуемые решения: Х=2 и Х=3.Это может быть реализовано, например, следующим образом: при "прологовом" доказательстве утверждения Х>1 будет выведено ограничение на переменную Х (естественно, Х>1). Результаты доказательства следующей подцели (member(...)) будут проверяться на удовлетворение этому ограничению (фактически, будет пере доказываться утверждение X>1 для конкретных значений Х). Первый вариант (Х=1) не пройдет эту проверку, остальные будут приняты как удовлетворяющие выведенному ограничению.Задачу в ограничениях можно рассматривать и как задачу о минимальном необходимом наборе ограничений, что позволяет в некоторых случаях описать в явном виде бесконечные множества решений. Так, минимальным необходимым набором ограничений для задачи X:integer, X>2, X<4 будет Х=3; для задачи X,Y:integer, X*2=Y таким набором будет X:integer, Y mod 2 = 0.Системы символьных вычислений нередко позволяют использовать "допущения" - по сути, те же ограничения. И на следующий (простой) запрос:
assume X>0.
when X+1<10 ?
выдавать ответ:
X in (0..9).
Как правило, такие системы могут доказывать
достаточно нетривиальные математические
утверждения, выводя "минимальными
необходимыми ограничениями", и проверяя
эти ограничения на совместность.В задачах
исследования операций и реализации искусственного
интеллекта часто используется некоторое
"пространство решений", сужением
которого достигается необходимый результат.
Такие "сужения" естественным образом
представляются как ограничения.Кроме
этого, программирование в ограничениях
естественным образом приложимо к задаче
автоматического вывода типов: выведенные
ограничения на переменные, соответствующие
типам подвыражений, будут задавать "минимальный
набор требований на типы". Так, удовлетворение
ограничения type_correct("
Как и логическое программирование, программирование в ограничениях предполагает совершенно аналогичную "естественную" реализацию на параллельных платформах.
УДОВЛЕТВОРЕНИЕ В ОГРАНИЧЕНИЯХ.
Одной из важных задач искусственного интеллекта (ИИ) является задача удовлетворения ограничений (УО) (constraint satisfaction problem). Теория УО предлагает удобный аппарат и простую формальную схему для представления и решения комбинаторных задач ИИ.
Целью решения задачи УО является нахождение значений переменных, удовлетворяющих заданным ограничениям.
Проблема существования решений задачи УО является NP-полной.
Тесно связано с теорией УО программирование в ограничениях, которое является парадигмой программирования для декларативного описания и эффективного решения комбинаторных задач. Многие классические комбинаторные задачи, такие как известная теорема Ферма, задача выполнимости (SAT) из пропозициональной логики, задача раскраски графа и задача изоморфизма графов из теории графов могут формулироваться в виде задач УО (ЗУО). Остановимся подробнее на одной из давно поставленных задач в математике - задаче о раскраске графа, частным случаем которой является известная задача о раскраске карты. Формулировка задачи о раскраске в виде задачи УО ставит в соответствие вершинам раскрашиваемого графа переменные, возможные цвета представляют собой домены (области определения) переменных, а ограничения-неравенства между смежными вершинами являются ограничениями задачи.
РЕШЕНИЕ ПОСТАВЛЕННОЙ ЗАДАЧИ
Задание:
На одной улице стоят 4 дома. В каждом из них живет один из 4-х людей: Семен, Николай, Артур и Роман. Каждый из них владеет профессией: Врач, Художник, Егерь, Тренер. Определить, кто в каком доме живет, и кто какой профессией владеет. Известно, что:
Вид главного окна:
Исходный код программы
houses([house(1, _, _ ),house(2, _, _ ),house(3, _, _ ),house(4, _,_ )]).
left_of(A, B, [A, B | _]).
left_of(A, B, [_ | Y]) :- left_of(A, B, Y).
right_of(A, B, [B, A | _]).
right_of(A, B, [_ | Y]) :- right_of(A, B, Y).
next_to(A, B, [A, B | _]).
next_to(A, B, [B, A | _]).
next_to(A, B, [_ | Y]) :- next_to(A, B, Y).
member(X, [X|_]).
member(X, [_|Y]) :- member(X, Y).
ne_in(_,[]).
ne_in(X,[X|_]):-!,fail.
ne_in(X,[_|A]):-ne_in(X,A).
ne_trener(H):-member(house(_,
ne_trener(H):-member(house(_,
ne_trener(H):-member(house(_,
ne_trener(H):-member(house(_,
print_houses([]).
print_houses([A|B]) :-
write(A),
print_houses(B).
false(X):-X,!,fail.
false(_).
solve(H):-houses(H),
next_to(house(_,_,paint),
house(_,_,trener),H),
next_to(house(_,_,doctor),
house(_,_,paint),H),
% Егерь живет левее Врача
left_of(house(_,_,oxotnic),
house(_,_,doctor),H),
false(next_to(house(_,_,
house(_,_,hunter),H)),
right_of(house(_,_,paint),
house(_,semen,_),H),
next_to(house(_,semen,_),
house(_,nikolay,_),H),
false(next_to(house(_,artur,_)
house(_,roman,_),H
)),
ne_trener(H),
member(house(_,roman,_), H),
member(house(_,artur,_), H),
member(house(_,semen,_), H),
member(house(_,nikolay,_), H),
print_houses(H).
:-solve(_).
ВЫВОД
В результате выполнения данной курсовой работы:
Информация о работе Логическое программирование. Программирование в Psharp