PLR (Programação em Lógica com Restrições) é uma extensão da Programação Lógica que une seu formato declarativo com a Programação com Restrições. Um problema é definido por variáveis, seus domínios, restrições e função objetivo. Algoritmos de busca como backtracking e propagação de restrições são usados para encontrar soluções dentro do espaço restringido pelas condições. O SWI-Prolog fornece módulos como clpfd para implementar PLR e resolver problemas como escalonamento e combinação.
3. Introdução
● É uma extensão da PL bem sucedida.
● une o formato declarativo da PL com a
Programação com Restrições.
● o código é um modelo do problema
expresso através de sentenças (V ou F).
● diferente do paradigma imperativo, onde o
programa é um passo a passo.
4. Restrições
● Fazem parte do nosso dia a dia.
● Muitas atividades estão condicionadas a
alguma restrição.
● É uma condição que restringe o universo
das possibilidades.
● "Eu só posso estudar de noite”.
● X^2 = Y, onde X > 0.
5. PLR
Na PLR um problema é definido por:
● um conjunto de variáveis;
● seus respectivos domínios;
● restrições;
● função objetivo (opcional).
6. PLR
Podemos esperar 3 tipos de resultados:
● uma solução qualquer dentre as possíveis;
● todas as soluções possíveis;
● uma solução ótima (atende função objetivo).
7. Algoritmos de busca
● Restrições sozinhas são incapazes de inferir
uma solução para o problema.
● Os algorítimos de busca substituem o
algorítimo da unificação.
● são executados sobre o espaço das
possibilidades restringido pelas restrições.
8. Algoritmos de busca
● Generate and Test
● Backtracking
● Backjumping
● Propagação de restrições
11. Propagação de restrições
● Aplica as restrições progressivamente
● Diminui o domínio das variáveis
● Descobre rapidamente problemas intratáveis
X = [7,11,13,17],
Y = [9,11,15,16,17],
X = Y.
X = [11, 17]
Y = [11, 17]
12. Aplicações
Escalonamento e Combinação.
● Geração de Horários;
● Gestão da Produção;
● Sequenciação de Tarefas;
● Colocação de itens em caixas;
● estacionamento de aviões em aeroportos.
13. SWI-Prolog
● Suporte adicionado a partir de 2004.
● Os modulos são extensões da linguagem.
● Modulos existentes: clpfd, clpq, clpr.
:- use_module(library(clpfd)).
15. Operações aritméticas
Expr1 #>= Expr2 Expr1 maior igual a Expr2
Expr1 #=< Expr2 Expr1 menor igual a Expr2
Expr1 #= Expr2 Expr1 igual Expr2
Expr1 #= Expr2 Expr1 diferente Expr2
16. Operações booleanas
# Q True se Q é false
P #/ Q True se P ou Q for true
P #/ Q True se ambos forem true
P #<==> Q True se P e Q são equivalentes
P #==> Q True se P implica Q
P #<== Q True se Q implica P
17. Outras funções
+Vars ins +Domain - domínio das variáveis.
labeling - Atribui valores válidos.
element(?N, +Vs, ?V) - Busca o enésimo.
all_different - todos os valores são diferentes.
all_distinct - propagação de restrições.
18. Exemplo SWI-Prolog
Quais os 4 números diferentes que quando
elevados ao quadrado e somados dão N?
19. Exemplo SWI-Prolog
:- use_module(library(clpfd)).
resolve(N, L) :-
L = [A,B,C,D], L ins 1..sup,
N #= A*A + B*B + C*C + D*D,
labeling([],L), all_distinct(L).