Programação com Constraints Programando com Constraints • Linguagens tradicionais (incl. OO): pouco suporte p/ relacionamentos entre objetos • Ex. V=RxI: vários comandos p/ sit. diferentes – V:=I*R – I:=V/R – R:=V/I • Constraint Solvers: algoritmos eficientes capazes de verificar exist. de solução (ex. simplex p/ ineq. lineares) • Principais áreas de aplicação: – planejamento – escalonamento – otimização Constraint Logic Programming • Program. declarativa: Ex. Prolog – flexibilidade no uso, MAS – Prolog puro tem apenas unificação • relações explícitas • relações obtidas com busca • relações extra-lógicas (ex. aritméticas) testadas só qdo. variáveis estão instanciadas • Idéia: mesclar busca e resolução com “constraints” • Alternativa seria geração e teste – ineficiente – às vezes impossível. Ex. Reais • Constraint Solver é ativado qdo. – Constraint é adicionada – Variável é instanciada • Impossibilidade de satisfação: árvore de busca é podada backtracking • Obs: o próprio processo de unificação pode ser encarado como uma resolução de “constraints” Constraints • • • • • • Variáveis: repres. valores desconhecidos: X,Y,Z, LIST,... Símbolos de funções: mapeamento entre valores: +, -, *, /, sen, cos Símbolos de relações: relações entre valores: =,, Constraint Primitiva: Relação com argumentos. Exs. X4 e X+2Y=9 Constraint: conjunção de constraints primitivas: X3 X=Y Y 4 Valoração: atrib. de valores a variáveis. – = { X3, Y 4, Z 2} – (X+2Y)=3+2*4=11 • Solução: valoração que satisfaz constraint: (X 3 Y=X+1)=(3 3 4=3+1) = true • Constr. pode ser satisfeita (satisfiable). Ex. X 3 Y=X+1 • Constr. não pode ser satisfeita (unsatisfiable) X 3 Y=X+1 Y2 Constraints II • Sintaxe – São cadeias de símbolos – Ordem importa alguns algoritmos dependem da ordem X=0Y=1 não é o mesmo que Y=1X=0 • Equivalência de Constraints: mesmo conj. de soluções – X> 0 e 0<X – X=1Y=2 e Y=2 X=1 – X=Y+1Y2 e X=Y+1X3 • Modelagem com Constraints: descreve comportamento idealizado dos objetos no mundo. Exs. – Leis da Física – Cronogramas de construção Modelando c/ Constraints V 1 I 1 R1 V 2 I 2 R2 V V1 0 V V 2 0 I V1V 2 0 I I1 I 2 0 I I1 I 2 0 + + R2 R1 V V2 V1 I1 -3_ I2 --- Modelando c/ Constraints start TS 0 foundations TA TS 7 interior walls TB TA 4 exterior walls TC TA 3 chimney TD TA 3 roof TD TC 2 doors TE TB 2 tiles TE TD 3 windows TE TC 3 Satisfação de Constraints • • • • • • Dada constraint C, há 2 perguntas: – satisfação: ela tem solução? – solução: qual a solução, se tiver? Constraint Solver responde à questão sobre satisfação (mais básica), mas normalmente tem como subproduto solução (soluções) Abordagem simplificada: tentar todas as valorações (enumeração) Enumeração não funciona p/ Reais Versões mais espertas são usadas p/ domínios finitos Constraints sobre Reais (expressões lineares): métodos de eliminação. Ex. Gauss-Jordan – Substit. repetidas de var. p/ colocar eq. em forma x = e – Forma resolvida: vars. do lado esq.(não-paramétricas) não aparecem no lado direito de nenhuma eq. – partindo de 1+X=2Y+Z Z-X=3 X+Y=5+Z chegar em conclusão de não-satisfação – Usando só 2 prim. eqs.: X=Z-3 Y=-1 – Atribuindo valores arbitrários p/ parâmetros, obtêm-se valores das demais variáveis. Domínios • Inteiros • Reais • Igualdade de árvores: unificação de termos (como no Prolog) • Valores Booleanos • Constraints sobre seqüências. Ex. Genética • Mundo dos blocos: constraints não têm que ser matemáticas • Muitos outros: normalmente relacionados a estruturas matemáticas bem conhecidas. Valores Booleanos • Ex. de uso em modelagem de X O circuitos • • • Valores 0 e 1 Álgebra de Boole Operação E representada por “&” p/ não confundir com composição de constraints • Ex. 1: XOR com máx. 1 falha • Valor observado: • { X 0, Y 0, Z 1} • Solução { FO 1, FA 0, FN 0, FZ 0, X 0, Y 0, Z 1} Z Y A FO (O (XY)) FA (A (X&Y)) FN (N A) FZ (Z N&O) (FO&FA) (FO&FN) (FO&FZ) (FA&FN) (FA&FZ) (FN&FZ) N Valores Booleanos • Vários métodos • P/ ser completo: complex. exponencial (problema NP) • Método incompleto, mas útil (c/ tempo polinomial) – Seja m o núm. de constraints primitivas em C, seja epsilon um número entre 0 e 1 (grau do quão incompleto deve ser o algoritmo) – Para i =1 até n • Gere uma valoração randômica das variáveis em C • Se valoração satisfaz C, então retorne true – Retorne não sei Propriedades de CS • Completo. Desejável, mas muitas vezes não existe (ex. eq. não-lineares sobre inteiros) ou demora muito (ex. booleanas, eqs. não lin. sobre reais) • Bem comportado – Baseado em conjunto: resposta depende apenas do cj. de constr. primitivas – Monotônico falha p/ C1 falha p/ C1 C2 – Independente do nome das variáveis: renomeandose variáveis obtém-se mesmo resultado Simplificação de Constraints • Constraints podem ser equivalentes, mas uma mais simples que a outra X1X 3 2=X+Y X 3 2=X+Y 3X X=2-Y X=2-Y 3X X=2-Y 3 2-Y X=2-Y Y -1 • Oper. que mantêm equivalência – – – – rem. de constraints redundantes reescrita de constraint primitiva mudança de ordem substituição usando equação Projeção • Simplificação importante: interesse em apenas algumas variáveis, por exemplo p/ expressar resultado • A projeção de uma constraint C no cj. de variáveis V é uma constraint C1 tal que – C1 tem apenas variáveis de V – Toda solução de C é sol. de C1 – Uma sol. de C1 pode ser estendida de forma a produzir sol. p/ C C: XY YZ Z 0 tem como proj. em {X} C1: X 0 { X 0} em C1 pode ser estendida p/ { X 0, Y 0, Z 0} em C { X 4, Y 3, Z 1} em C é sol de C1, porque { X 4 } já é sol. • Algoritmo de Fourier p/ elimin. de var. Y – – – – divisão de ineqs. em t1Y e Y t2 e outras casar pares p/ produzir ineqs. t1 t2 aplicável tb. p/ ineq. estritas (“<” e “>”) pode produzir inform. redundante a ser filtrada Projeção II • Exemplo de alg. de Fourier, excluindo Y (projetando em apenas {X}) X 1 Y Y 1 X Y Y 1 X Y 1 X X 1 Y Y 1 X +1 -1 +1 X +1 X X 1 X 1 Y Y 1 X 0 2 1 X Y Y 1 X 0 2 1 X Y Y 1 X 1 X -1 -1 X 1 1 X • Obs.: não são todos os domínios que possibilitam projeção: às vezes são criadas variáveis locais p/ expressar relações Otimização e Verific. de Implicação • Problemas de otimização – achar valor mínimo p/ função, dado cj. de constraints – P/ ineq. lineares, Fourier pode ser usado, mas é ineficiente – Simplex: • tempo polinomial na prática • fornece algoritmo eficiente p/ verificação da satisfação de constraints • Verificação de implicação e equivalência – Pode-se usar implic. p/ definir equivalência e vice-versa impl(C1,C2)=equiv(C1,C1C2) equiv(C1,C2)=impl(C1,C2) impl(C2,C1) – pode-se usar constraint solver p/ testar implicação impl(C1,C2)=¬solv(C1 ¬C2) – ex. • impl(CH,TBTC)= ¬solv(CH TB<TC) Implementações • Cada constraint solver tem sua sintaxe. Para o uso de cada um, normalmente inclui-se um módulo. • Constraint solvers no SWI: clpq(racionais), clpr (reais) e ‘clp/bounds’ (domínio finito) e simplex • Constraint solvers no SICSTUS: clpq(racionais), clpr (reais) e ‘clpfd’ (domínio finito) e clpb (booleanos) Ex. Hipoteca :-use_module(library(clpr)). mortgage(P,T,I,R,B):- {T=0, P=B}. mortgage(P,T,I,R,B):{ T>=1.0, NT=T-1, NP=P+P*I-R }, mortgage(NP,NT,I,R,B). • P: principal, T: tempo, I: juros, R: prestação, B: saldo • Vários usos – mortgage(1000,10,10/100,150,B). Resp: B=203.129 – mortgage(P,10,10/100,150,0). Resp: P=921.685 – mortgage(P,10,10/100,R,B). Resp: P=0.3855*B+6.1446*R Relação entre principal, saldo e prestação • Note: indicação de uso do módulo e constraints entre “{“ e “}” (para reais) Referências • Prolog c/ constraints – Eclipse: consórcio europeu, grupo agora no Imperial College – Sicstus Prolog: constraint solvers p/ • booleanos • racionais • reais • domínios finitos – CHR: biblioteca para criação de “constraint solvers” – Livro base: Programming with Constraints: An Introduction. Marriott and Stuckey (1998) – Conferência Principal: Principles and Practice of Contraint Programming (CP) – Pesquisas e desenvolvimentos relacionados • Bancos de Dados com constraints • Outros paradigmas de linguagens c/ Constraints: funcionais, imperativas e OO