Title: Constraints and Logic Programming
1Constraints and Logic Programming
- All problems involving finite domains (including
booleans, and sets) may be solved, in principle,
with logic programming (LP) alone. - (after all, finite domains are a subset of the
Herbrand Universe constants). - Why should one move towards Constraint
Programming (CP), rather than staying within LP? - Greater Efficiency
- Most combinatorial problems are more easily
solved by constraint propagation than simple
generate and test implememted in LP. - Greater Expressiveness
- Specific constraints are harder to express in LP
(e.g. conditional constraints, global
constraints).
2Constraints and Logic Programming
- If propagation of constraints is so important for
solving constraint (satisfaction / optimisation)
problems why not to abandon LP altogether and
move towards Constraint Logic Programming (CLP). - Modelling - Declarativeness
- LP features such as unification (allowing
flexible input/output parameters) and
backtracking provide a declarative style of
programming where constraints can be very easily
expressed. - Natural extension
- The semantics of LP already assume a special type
of constraint processing equality of Herbrand
terms. - All that CLP requires is an extension of this
constraint solving capabilities to other useful
domains.
3Operational Semantics of CLP
- The operational semantics of CLP (LP is a special
case) can be described as a transition system on
states. - The state of a constraint solving system can be
abstracted by a tuple - ltG, C, S gt
- where
- G is a set of constraints (goals) to solve
- C is the set of active constraints
- S is a set of passive constraints
- Sets C, S are considered the Constraint Store.
- A derivation is just a sequence of transitions.
- A state that cannot be rewritten is a final
state. - An executor of CLP (LP) aims at finding
successful final states of derivations starting
with a query.
4Operational Semantics of CLP
- A derivation is failed if it is finite and its
final state is fail. - A derivation is successful if it is finite and
processes all the constraints, i.e. it ends in a
state with form - ltØ, C, S gt
- The state transitions are the following
- S(elect) Select a goal (constraint)
- It is assumed that
- A computation rule selects some goal g, among
those still to be considered. - This goal requires some constraint c to be solved
and/or further goals, G, to be considered
5Operational Semantics of CLP
- The other transition rules require the existence
of two functions, infer(C,S) and consistent(C),
adequate to the domains that are considered. - I(nfer) Process a constraint, inferring its
consequences - C(heck) Check teh consistency of the Store
6Operational Semantics of CLP
- In Logic Programming
- Handling a goal g is simply checking whether
there is a clause h ? B whose head h matches the
goal. In this case, the equality constraint
between Herbrand terms gh is added to the
passive store. - Function infer(C,S) performs unification of the
terms included in g and h, after applying all
substitutions included in C - function infer(C, gh)
- if unify(g?C,h?C, C) then infer(success, C)
- else infer (fail,_)
- end function
- Checking consistency is simply checking whether
the previous unification has returned success or
failure (in practice the two functions are of
course merged).
7Operational Semantics of CLP
- For example, assuming that
- C X / f(Z), Y / g(Z,W) a solved form
- G includes goal p(Z,W)
- there is a clause p(a,b) - B.
- then the following transitions take place, when
goal p(Z,W) is called - lt G , X/f(Z), Y/g(Z,W), gt
- ?s goal selection
- lt G\g?B, X/f(Z), Y/g(Z,W), p(Z,W)
p(a,b) gt - ?i,c unification
- lt G\g?B, X/f(a), Y/g(a,b), Z/a, W/b, gt
8Operational Semantics of CLP
- In Constraint Logic Programming
- Handling a goal g is as before. Handling a
constraint in a certain domain, usually built-in,
simply places the constraint in set S. - .
- Function infer(C,S) propagates the constraint to
the active store, by methods that depend on the
constraint system used. Tipically, - It attempts to reduce the values in the domains
of the variables or - obtain a new solved form (like in unification)
- Checking consistency also depends on the
constraint system. - It checks whether a domain has become empty or
- It was not possible to obtain a solved form.
9Operational Semantics of CLP
- A positive example
- Assuming that variables A and B can take values
in 1..3, then the constraint store may be
represented as - C,S A in 1..3, B in 1..3,
- Rule S If the constraint selected by rule S is A
gt B, then the store becomes - C,S A in 1..3, B in 1..3, A gt B
- Rule I The Infer rule propagates this constraint
to the active store, which becomes - C,S A in 2..3, B in 1..2, A gt B,
- Rule C The system does not find any inconsitency
in the active store, so the system does not
change..
10Operational Semantics of CLP
- A negative example
- Assuming that variables A and B can take,
respectively values in the sets 1,3,5 and
2,4,6. The constraint store may be represented
as - C,S A in 1,3,5 B in 2,4,6,
- Rule S If the constraint selected by rule S is A
B, the store becomes - C,S A in 1,3,5 B in 2,4,6 , A B
- Rule I The rule propagates this constraint to
the active store. Since no values are common to A
and B, their domains become empty - C,S A in , B in ,
- Rule C This rule finds the empty domains and
makes the transition to fail (signaling the
system to backtrack in order to find alternative
successful derivations).
11(C)LP solutions
- In LP and CLP, solutions are obtained, by
inspecting the constraint store of the final
state of a successful derivation. - In systems that maintain a solved form, (like LP,
but also constraint systems CLP(B) for booleans,
and CLP(Q), for rationals), solutions are
obtained by projection of the store to the
relevant variables. - For example if the initial goal was p(X,Y) and
the final store is - X/f(Z,a), Y/g(a,b), W/c
- then the solution is the projection to variables
X and Y - X/f(Z,a), Y/g(a,b), W/c
- In systems where a solved form is not
maintained, solutions require some form of
enumeration. For example, from - C X in 2..3, Y in 1..2, X gt Y,
- the solutions ltX2Y1gt, ltX3Y1gt and
ltX3Y1gt, are obtained by enumeration.
12Restrições Booleanas
- O domÃnio dos Booleanos (ou variáveis 0/1) tem
especial aplicação em aplicações - Envolvendo circuitos digitais
- Exemplo Circuito semi-somador
- Em problemas envolvendo escolhas binárias
- Exemplo Rainhas
- Em problemas que envolvam conjuntos
13Restrições Booleanas
- Nas restrições booleanas (de igualdade) podem ser
utilizadas os habituais operadores (not, and,
or, nand, nor, xor, ...). - Modelo do semi-somador
- C and(A,B)
- S xor(A,B)
14Restrições Booleanas
- As restrições (correspondentes às variáveis
Booleanas) podem ser igualmente expressas com
esses operadores - Modelo das 4-rainhas
- or(Q1, Q2, Q3, Q4) Linha 1
- and(Q1,Q2) 0 Linha 1
- ....
- and(Q1, Q6) 0 Diagonal
15Restrições Booleanas
- A satisfação de restrições booleanas pode ser
abordada de várias formas diferentes - Simbolicamente
- Unificação booleana
- SAT
- Colocação de todas as restrições na forma clausal
- Resolução construtiva (retrocesso) ou reparativa
(pesquisa local) - DomÃnios finitos
- O domÃnio 0/1 é um domÃnio finito com 2 valores
- Resolução comum aos domÃnios finitos
16Restrições Booleanas
- Para verificar a satisfação de restrições
booleanas de uma forma simbólica é conveniente
converter todas as restrições de forma a usar
apenas, - os operadores
- (ou-exclusivo) e (conjunção),
- constantes booleanas
- 0 e 1 ( e outras constantes, dependentes do
domÃnio) - variáveis
- denotadas por letras maiúsculas
- Isto é sempre possÃvel, já que o conjunto 0, 1,
, é completo.
17Restrições Booleanas
- Com efeito, dados os termos arbitrários a e b,
todos os operadores e constantes podem ser
expressos através destes operadores - a ? b a b
- a ? b a b a b
- ? a 1 a
- a ? b 1 a a b
- a ? b 1 a b
- Termos arbitrários serão denotados por minúsculas
18Restrições Booleanas
- Mais formalmente, o tuplo lt A, 0, 1, , gt, em
que A é um qualquer domÃnio (contendo os
elementos 0 e 1), constitui um anel booleano se
se verificarem as seguintes propriedades - Associatividade
- a(bc) (ab)c a(bc) (ab)c
- Comutatividade
- a b b a ab ba
- Distribuição
- a(bc) (ab)(ac) a(bc) abac
- Elemento Neutro
- a0 a a1 a
- Exclusividade e Idempotência
- aa 0 aa a
- Elemento Absorvente
- a0 0
-
19Restrições Booleanas
- As restrições booleanas que consideraremos
resumem-se à igualdade, já que todas as outras se
podem exprimir em função da igualdade. - Por exemplo, dada a equivalência
- a ? b ? a ? b a ? a ? b b
- a restrição de inclusão de conjuntos acima pode
ser reescrita em termos de igualdade como - a b ab b
- ? a b b ab b b
- ? a ab 0
- ? ab a
20Restrições Booleanas
- Conjuntos
- A constante 1 corresponde ao conjunto U
(Universal) - A constante 0 corresponde ao conjunto Ø (Vazio)
- O operador corresponde à União Exclusiva
- O operador corresponde à Intersecção
- De notar que no caso de conjuntos, uma vez
definido os elementos que contém o conjunto
universal, para além das constantes 0 e 1, o
domÃnio A contém todos os subconjuntos de U.
21Restrições Booleanas
- Circuitos digitais
- A constante 1 corresponde ao H
- A constante 0 corresponde ao L
- O operador corresponde ao XOR
- O operador corresponde ao AND
- E A B AB
- F 1 BC
- G CD
- H 1 EF
- I 1 FG
22Unificação Booleana
- A implementação de CLP(B) mantem as restrições
numa forma resolvida, obtida através da
unificação booleana. - Uma restrição booleana tem a forma t1 t2 (em
que os dois termos Booleanos, t1 e t2 são
formados exclusivamente a partir dos operadores
e . - A restrição booleana t1 t2 pode ser satisfeita
sse existir um unificador booleano para os dois
termos t1 e t2. - Um unificador booleano é uma substituição de
variáveis por termos booleanos que garante que os
dois termos tomam o mesmo valor booleano. - Os unificadores booleanos serão designados
através de letras gregas.
23Unificação Booleana
- Â
- Exemplo Os termos t11A e t2 AB podem ser
unificados com o unificador - ? A/1, B/0
- Com efeito, denotando por t?? (ou simplesmente
t?) a aplicação da substituição ? ao termo t,
temos - t1?? (1A)?A/1, B/0 1 1 0
- t2?? (AB)?A/1, B/0 1 0 0
- o que garante a satisfação da restrição de
igualdade t1 t2.
24Unificação Booleana
- Em geral, dados dois termos Booleanos, t1 e t2,
pode haver mais do que um unificador mais geral. - Exemplo A unificação dos termos t1 1 AB e
t2 C D pode ser obtida por qualquer um dos
seguintes unificadores mais gerais - ?1 C / 1 AB D
- ?2 D / 1 AB C
- ?3 A / 1 C D, B / 1
- ?4 A / 1, B / 1 C D
- Com efeito,
- t1? ?1 (1AB)?C/1ABD 1AB
- t2? ?1 (CD)?C/1ABD(1ABD)D 1AB
- e
- t1? ?2 (1AB)?D/1ABC 1AB
- t2? ?2 (CD)?D/1ABC C(1ABC) 1AB
25Unificação Booleana
- Existem outros unificadores (menos gerais) que
podem ser obtidos através de instâncias dos
anteriores, isto é, da composição de unificadores
mais gerais com outras substituições. - Por exemplo, a substituição ? obtida pela
composição de ?1 com a substituição A/0 - ? C/1ABD o A / 0
- C/1D, A/0
- ainda é um unificador dos termos t11AB e
t2CD - t1 ? ? (1AB) ? C/1D, A/0 10B 1
- t2 ? ? (CD) ? C/1D, A/0 (1DD) 1
26Algoritmo de Unificação Booleana
- Tendo em atenção que a restrição t1 t2 é
equivalente a t1t20, a unificação dos termos t1
e t2 equivale a anular o termo t1t2. - As condições em que um termo t se pode anular,
podem ser analisadas através dos pontos
seguintes. - O anulamento de um termo constante t é
trivialmente verificável - se t 0 o termo já é nulo
- se t 1 o termo não é anulável.
- Dada a propriedade distributiva, um termo t, não
constante, pode sempre ser reescrito na forma
aUb (em que U é uma qualquer das variáveis que
ocorrem em t) pondo U em evidência.
27Algoritmo de Unificação Booleana
- 3. Um termo t aU b só se pode anular, se
tivermos ou a 1 ou b 0 (na situação
contrária, em que fosse a 0 e b 1, terÃamos
t 1 ? 0, independentemente do valor de U). - 4. Essa condição (a 1 ou b 0) é garantida se
e só se anular o termo (1 a)b. - 5. Uma vez garantida esta condição, constata-se
que - se a 0 (e b 0), então a variável U pode tomar
um valor arbitrário (pois 0 0U 0) - se a 1, então a variável U tem de tomar o valor
b (pois neste caso temos 0 1U b)
28Algoritmo de Unificação Booleana
- A atribuição de valores a U nestes termos pode
ser implementada com o recurso a uma nova
variável booleana, (isto é, que não ocorra em t).
Chamando _U a essa variável a condição anterior é
equivalente à substituição - U (1a)_U b
- Com efeito,
- se a 0 (e b 0 ) temos U _U, ou seja U pode
tomar um valor arbitrário, já que a variável _U,
sendo uma variável nova, não está associada a
quaisquer restrições - Se a 1 temos U (11)_U b, ou seja U b,
como pretendido.
29Algoritmo de Unificação Booleana
- Estas considerações podem ser materializadas no
predicado unif_bool, especificado abaixo. - O predicado recebe os termos t1 e t2 a unificar,
e sucede se o predicado anula suceder, retornando
a substituição ? retornada por este predicado. - predicado unif_bool(in t1, t2 out ?)
- t ? t1 t2
- unif_bool ? anula(t,?)
- fim predicado.
- Passemos agora à implementação do predicado anula.
30Algoritmo de Unificação Booleana
- predicado anula (in t out ?)
- caso t 0 anula Verdade, ?
- caso t 1 anula Falso
- caso contrário
- Au B ? t
- s ? (1A)B
- se anula(s,s) então
- anula ? Verdade
- ? ? U/(1A)_UB o s
- senão
- anula Falso
- fim se
- fim caso
- fim predicado.
31Algoritmo de Unificação Booleana
- ? ? U/(1A)_UB o s
- De notar que a substituição ? retornada pelo
predicado anula é obtida pela composição das
substituições U/(1A)UB e s obtida na chamada
recursiva do predicado (se este suceder). -
- Exemplo Satisfazer a restrição X XZ YZ 1
- Â
- Unifica XXZ e YZ1
- anula XXZYZ1
- (1Z)XYZ1 AxXBx
- anula (1(1Z))(YZ1) (1Ax)Bx
- Z(YZ1)
- ZYZ AyXBy
- anula (1Z)Z (1Ay)By
- 0
32Algoritmo de Unificação Booleana
- Unifica XXZ e YZ1
- anula XXZYZ1 (1Z)XYZ1
- anula (1(1Z))(YZ1)ZYZ (1Ax)Bx
- anula (1Z)Z 0 (1Ay)By
- sz
- sy Y/(1Ay)_YBy o sz
- Y/(1Z) _YZ o
- Y/(1Z) _YZ
- sx X/(1Ax)_YBx o sy
- X/(11Z)_X YZ1 o Y/(1Z)_YZ
- X/ Z_X YZ1 o Y/(1Z)_YZ
- X/ Z_X ((1Z)_YZ)Z1, Y/(1Z)_YZ
- X/ Z_X Z1, Y/(1Z)_YZ
- ? X/ Z_X Z1, Y/(1Z)_YZ
33Restrições Booleanas
- Desta forma a restrição XXZ YZ1 é
satisfazÃvel, já que a unificação dos termos
XXZ e YZ1 sucede retornando o unificador
booleano mais geral - ? X/Z_X Z1, Y/(1Z)_YZ
- Podemos confirmar este resultado, verificando que
- (XXZ)? ? (Z_XZ1)(Z_XZ1)Z
- (Z_XZ1)Z_X
- Z1
- e que
- (YZ1)? ? ((1Z)_YZ)Z1)
- Z1
34Restrições Booleanas
- ? X/Z_X Z1, Y/(1Z)_YZ
- Podemos pois concluir que a restrição X XZ
YZ 1 pode ser satisfeita independentemente do
valor da variável Z, dado que o unificador mais
geral ? não a menciona) - Numa análise mais pormenorizada
- se Z0 então X 1 e Y _Y (i.e. Y pode tomar
qualquer valor) - se Z1 então X _X e Y 1 (i.e. X pode tomar
qualquer valor) - O unificador ? tem pois como instâncias fechadas
(ground), os unificadores - X/1, Y/0, Z/0,
- X/1, Y/1, Z/0,
- X/0, Y/1, Z/1,
- X/1, Y/1, Z/1,
35Aplicações
- Um domÃnio de eleição para a utilização de
restrições booleanas é o domÃnio dos circuitos
digitais. - Exemplo
- Modelar o circuito abaixo através de um conjunto
de restrições booleanas - Verificar em que condições a saÃda toma o valor
1.
R1 C 1 AB R2 D 1 AC R3 E 1
BC R4 F 1 DE
36Aplicações
- 1. Restrições que modelam o circuito
- R1 C 1 AB R2 D 1 AC
- R3 E 1 BC R4 F 1 DE
- Resolução das Restrições
- R1 Resolvendo R1 obtemos a substituição ?1
- C 1 AB ?1 C / 1 AB
- R2 Aplicando ?1 temos
- R2 R2 ? ?1 D (1AC)?C/1AB
- D (1A(1AB))
- D 1 A AB
- Resolvendo esta restrição obtemos a substituição
- ?2 D / 1 A AB
37Aplicações
- Compondo ?2 com ?1 obtemos
- ?2 ?1 o ?2
- C/1AB o D/1AAB
- C/1AB, D/1AAB
- R3 Aplicando ?2 temos
- R3 R3 ? ?2 E (1BC)? D/1AAB,
C/1AB - E 1B(1AB)
- E 1B(1AB)
- Resolvendo R3 obtemos a substituição
- ?3 E/1BAB
- Compondo ?3 com ?2 obtemos
- ?3 ?2 o ?3
- E/1BAB o D/1AAB o C/1AB
- E/1BAB, D/1AAB, C/1AB
38Aplicações
- R4 Aplicando ?3 temos
- R4 R4? ?3
- F (1DE)? E/1BAB, D/1AAB,
C/1AB - F 1(1AAB)(1BAB)
- F 11BABAABABABABAB
- F A B
- Resolvendo R4 obtemos a substituição
- ?4 F/AB
- Combinando ?4 com ?3 obtemos
- ?4 ?3 o ?4
- E/1BAB, D/1AAB, C/1ABoF/AB
- E/1BAB, D/1AAB, C/1AB, F/AB
- Interpretando ?4 concluÃmos que o circuito com 4
portas nand implementa um ou-exclusivo, já que F
/ A B.
39Aplicações
- 2. Que entradas impõe a saÃda igual a 1
- Para representar esta situação acrescenta-se a
restrição R5 F 1. - R5 Aplicando ?4 temos
- R5 R5 ? ?4
- (F 1)? E/1BAB, D/1AAB, C/1AB,
F/AB - AB 1
- Resolvendo R5 obtem-se a substituição ?5
A/1B. Compondo esta substituição ?5 com ?4
obtem-se - ?5 ?4 o ?5
- E/1BAB, D/1AAB, C/1AB,
F/ABoA/1B - E/1B, D/B, C/1, F/1, A/1B
- De ?5, e em particular do par A/1B, conclui-se
que para o circuito ter uma saÃda 1, as suas
entradas devem ser complementares, i.e. ou A0 e
B1 ou A0 e B1
40Restrições Booleanas no SICStus Prolog
- Uma vez carregado o SICStus Prolog o módulo de
Restrições Booleanas, através da directiva -  - use_module(library(clpb)).
- As restrições Booleanas podem ser verificadas
através do predicado sat(E) , em que a igualdade
é representada por e os operadores e
através de e , respectivamente. -  Exemplos
- Â 1. ?- sat(ABF).
- sat(ABF)?
- A restrição ABF é satisfazÃvel, com a
substituição A/BF
41Restrições Booleanas no SICStus Prolog
- 2. ?- sat(AB1CD).
sat(A\CDB)?  - A restrição AB1CD é satisfazÃvel, com
substituição A/1CDB - 3. ?- sat(AB1CD), sat(CDB).
- sat(BCD),
- sat(A\CDCD) ?
- As restrições AB1CD e BCD são satisfeitas
com a substituição A/1CDCD, B/CD - Â
- Nota Atenção à notação das respostas.
- A Exp corresponde a A / Exp
- A\ Exp corresponde a A / 1 Exp
42Restrições Booleanas no SICStus Prolog
- Um exemplo mais completo, relativo ao circuito
anterior - - use_module(library(clpb)).
- nand_gate(X,Y,Z)-
- sat(XY 1Z).
- circuit(A,B,C,D,E,F)-
- nand_gate(A,B,C),
- nand_gate(A,C,D),
- nand_gate(B,C,E),
- nand_gate(D,E,F).
43Restrições Booleanas no SICStus Prolog
- Alguma interacção com o sistema
- ?- circuit(A,B,C,D,E,1).
- C 1,
- E A,
- sat(B\A),
- sat(D\A) ?
- Comparando-se esta resposta com ?5 anterior
- ?5 E/1B, D/B, C/1, F/1, A/1B
- constata-se que são ambas variantes do
unificador mais geral.
44Restrições Booleanas no SICStus Prolog
- Outra interacção
- ?- circuit(A,B,C,D,E,F).
- sat(C_AFF_A),
- sat(A\_AF_BFF_A),
- sat(B\_AF_BF_A),
- sat(D\_BF),
- sat(E\_BFF) ?
- A comparação com ?4 anterior é um pouco menos
óbvia ... - ?4 E/1BAB, D/1AAB, C/1AB, F/AB
- 1AB 1 (1_AF_BFF_A) (1_AF_BF_A)
- 1((1_AF_BF_A)F)(1_AF_BF_A)
- 1(1_AF_BF_A)(1_AF_BF_A)F
- 1 1_AF_BF_A F_AF_BF_AF
- F_A_AF
- C
45Restrições Booleanas no SICStus Prolog
- Padrões de Teste de Avarias (Stuck-at-0/1) num
semi-somador - Objectivo Obter uma saÃda diferente entre
- o circuito correcto e
- o circuito com falhas
- Definir um predicado tp/2 que dado um conjunto de
falhas F indique as entradas que detectam essas
falhas - tp(F, I1, I2)
46Restrições Booleanas no SICStus Prolog
- Primeiro, convem definir o comportamento de cada
gate (sem falhas) por intermédio das
correspondentes restrições booleanas. - Uma gate sem falhas é representada por 3
argumentos - 1. Tipo da gate Número de identificação da gate
no circuito - 2. Lista de
- 3. SaÃda
- gate(or, I1,I2,Z)-
- sat(I1I2 Z).
- gate(nor, I1,I2,Z)-
- sat(I1I2 \ Z).
- gate(xor, I1,I2,Z)-
- sat(I1I2 Z).
- gate(and, I1,I2,Z)-
- sat(I1I2 Z).
- gate(nand,I1,I2,Z)-
- sat(I1I2 \ Z).
- gate(not,I1,Z)-
- sat(I1 \ Z).
47Restrições Booleanas no SICStus Prolog
- Em segundo lugar, é necessário especificar o
comportamento de uma gate, incluindo o caso em
que ela esteja avariada. Uma gate é representada
por 5 argumentos - 1. Número de identificação da gate no circuito
- 2. Lista de falhas no circuito. Cada falha é
representada por um par N/B em que N é o
identificador da gate e B o tipo de falha
(stuck-at-0 ou stuck-at-1). - 3. Tipo da gate
- 4. Lista de entradas da gate
- 5. SaÃda da gate
- gate(N,F,_,_,0)- a saÃda é 0, se
- member(N/0, F), !. a gate está stuck-at-0
- gate(N,F,_,_,1)- a saÃda é 1,
se - member(N/1, F), !. a gate está stuck-at-1
- gate(_,_,T,I,S)- caso contrário, a gate
- gate(T,I,S). tem comportamento
normal
48Restrições Booleanas no SICStus Prolog
- Em terceiro lugar, há que definir o que é um
circuito Semi-somador em termos das suas
componentes, que podem naturalmente estar
avariadas. -
- semi_somador(F, I1,I2,S,C)- F é o
conjunto - gate(1, F, and, I1,I2, C), de falhas
- gate(2, F, xor, I1,I2, S).
- O predicado member/2 é o habitual.
- member(H,H_).
- member(H,_T)-
- member(H,T).
49Restrições Booleanas no SICStus Prolog
- Finalmente, há que comparar um circuito com
falhas F e um circuito sem falhas, de forma a que
uma das saÃdas, pelo menos, seja diferente. - tp(F, I1, I2)-
- semi_somador(,I1, I2, S1,C1),
- semi_somador(F, I1, I2, S2,C2),
- gate(xor, S1, S2, S),
- gate(xor, C1, C2, C),
- gate(or,S,C,1).
50Restrições Booleanas no SICStus Prolog
- Alguma interacção com o sistema
- ?- tp(1/0,I1,I2).
- I1 1,I2 1 ? no
- A avaria G1 (and) stuck-at-0, é detectada se
ambas as entradas forem 1 - ?- tp(1/1,I1,I2).
- sat(I1_AI2_A) ? no
- A avaria G1 (and) stuck-at-1, é detectada se
uma das entradas for 0. - . (I2 1 ? I1 0).
- ?- tp(2/0,I1,I2).
- sat(I1\I2) ? no
- A avaria G2 (xor) stuck-at-0, é detectada se as
entradas forem diferentes. - ?- tp(2/1,I1,I2).
- I2 I1 ? no
- A avaria G2 (xor) stuck-at-1, é detectada se as
entradas forem iguais.
51Restrições Booleanas no SICStus Prolog
- N Rainhas
- Para modelar o problemas das rainhas há que
garantir que - Em todas as linhas há exactamente uma rainha
- Em todas as linhas há uma ou mais rainhas
- Em todas as linhas há uma ou menos rainhas
- Em todas as colunas há exactamente uma rainha
- Em todas as colunas há uma ou mais rainhas
- Em todas as colunas há uma ou menos rainhas
- Em todas as diagonais há uma ou menos rainhas
52Restrições Booleanas no SICStus Prolog
- Eis uma possÃvel solução
- rainhas_3(Q1, Q2, Q3,
- Q4, Q5, Q6,
- Q7, Q8, Q9)-
- um_ou_mais( Q1, Q2, Q3), linha 1
- um_ou_menos(Q1, Q2, Q3),
- ...
- um_ou_mais( Q1, Q4, Q7), coluna 1
- um_ou_menos(Q1, Q4, Q7),
- ...
- um_ou_menos(Q2,Q6),
- um_ou_menos(Q1, Q5, Q9), diagonais \
- um_ou_menos(Q4,Q8),
- um_ou_menos(Q2,Q4),
- um_ou_menos(Q3, Q5, Q7), diagonais /
- um_ou_menos(Q6,Q8).
53Restrições Booleanas no SICStus Prolog
- Uma ou mais rainhas
- um_ou_mais(L)- L A,B,C,...,Z
- or_exp(L, Exp), Exp ABC...Z
- sat(Exp 1). ABC...Z 1
- or_exp(H, H).
- or_exp(HT, H T_exp)-
- or_exp(T, T_exp).
- Uma ou menos rainhas
- um_ou_menos(_).
- um_ou_menos(H1,H2T)-
- sat(H1 H2 0), A1A2 0
- um_ou_menos(H1T), idem para outros pares
com A1 - um_ou_menos(H2T). idem para outros pares
sem A1