320 likes | 414 Vues
Learn to encode constraints in a readable form, set up models without introducing choice points, and support constraint propagation using Propia and CHR modules. Find examples and efficiency experiments.
E N D
Propia and CHRs Transforming Constraint Specification into Constraint Behaviour
Motivation for Propia and CHRs • Encode constraints in readable form • Set up model without leaving choice points • Support constraint propagation • NB: Never introduce choice points in constraint setup • Why not? • repeatedly setting up constraints on different branches • partially blind searching
The noclash Example Specification: noclash(S,T) (T S+5) (S T) Encoding as ECLiPSe clauses: noclash(S,T) :- ic:(T >= S+5). noclash(S,T) :- ic:(S >= T). Model Setup: setup(S) :- S::1..10, constraint(noclash(S,6)).
constraint(Goal) :- call(Goal). ?- setup(S). yes S = 1 This program leaves a choice point The noclash constraint in ECLiPSe Prolog noclash(S,T) :- ic:(T >= S+5). noclash(S,T) :- ic:(S >= T). setup(S) :- S::1..10, constraint(noclash(S,6)).
constraint(Goal) :- Goal infers most. ?- setup(S). yes S{[1, 6..10]} This program does not create any choice points noclash with Propia noclash(S,T) :- ic:(T >= S+5). noclash(S,T) :- ic:(S >= T). setup(S) :- S::1..10, constraint(noclash(S,6)).
constraint(noclash(S,T)) <=> ic:(T<S+5) | ic:(S >= T). constraint(noclash(S,T)) <=> ic:(S<T) | ic:(T >= S+5). ?- setup(S). yes S{1..10} This program does not create any choice points noclash with CHRs noclash(S,T) :- ic:(T >= S+5). noclash(S,T) :- ic:(S >= T). setup(S) :- S::1..10, constraint(noclash(S,6)).
Choice Points and Efficiency Experiment sum(Products,Raw1,Raw2,Profit) :- ( foreach(Item,Products), foreach(R1,R1List), foreach(R2,R2List), foreach(P,PList) do product(Item,R1,R2,P) ), Raw1 #= sum(R1List), Raw2 #= sum(R2List), Profit #= sum(PList). £1 1pin 19nuts £2 2pins 17nuts £P R1pins R2nuts Products: Raw1 = 1 + 2 + R1 Raw2 = 19 + 17 + R2 Profit= 1 + 2 + P product( 101,1,19,1). product( 102,2,17,2). product( 103,3,15,3).product( 104,4,13,4). product( 105,10,8,5). product( 106,16,4,4). product( 107,17,3,3). product( 108,18,2,2). product( 109,19,1,1).
95>= R1+R1+R1+R1+R1+R1+R1+R1+R1 95>= R2+R2+R2+R2+R2+R2+R2+R2+R2 40=< P +P +P +P +P +P +P +P +P Time for all 13801 solutions: Time to first solution: 1 hour 33 secs Choice Points and Efficiency product_plan(Products) :- length(Products,9), Raw1 #=< 95, Raw2 #=< 95, Profit #>= 40, sum(Products,Raw1,Raw2,Profit), labeling(Products). sum(Products,Raw1,Raw2,Profit) :- ( foreach(Item,Products), foreach(R1,R1List), foreach(R2,R2List), foreach(P,PList) do product(Item,R1,R2,P) ), Raw1 #= sum(R1List), Raw2 #= sum(R2List), Profit #= sum(PList). infers most
Propia • Annotations • Most Specific Generalisation • Algorithm
Propia’s infers Annotation Propia annotation says what you want to infer: • Goal infersconsistent • Fail as soon as inconsistency can be proven • Goal infersunique • Instantiate as soon as unique solution exists • Goal infersac • Maintain finite domains covering all solutions • Goal infersmost • Use strongest available representation covering all solutions
Annotation Results p(1,1). p(1,3). p(1,4). ?- p(X,Y) infers consistent. No information extracted ?- p(X,3) infers unique. X=1 ?- p(X,Y) infers most. X=1 (assuming ic is not loaded) ?- p(X,Y) infers most. X=1,Y{[1,3,4]} (assuming ic is loaded) ?- p(X,Y) infers ac. X=1,Y{[1,3,4]} (ic must be loaded)
C5 C1 C7 C4 (C1,C4,C5) infers most C3 C6 Constraints C2 C8 Problem More “global” Consistency pp(X,Y,Z) :- p(X,Y), p(Y,Z). ?- pp(X,Y,Z) infers most. X=1, Y=1, Z{[1,3,4]}
Most Specific Generalisation The Opposite of Unification! [1,A] [1,1] [1,1] [2,2] [X,X] [1,_] “most specific generalisations”
Most Specific Generalisation over Finite Domains f(1,2) f(2,4) 1 2 X::{[1,2]} f(X::{1,2},Y::{2,4}) “most specific generalisations”
Naïve Propia Algorithm Goal infers most Find all solutions to Goal, and put them in a set Find the most specific generalisation of all the terms in the set member(X,[1,2,3]) infers most Find all solutions tomember(X,[1,2,3]): {1,2,3} Find the most specific generalisation of {1,2,3}: X::{1,2,3}
Propia Algorithm Goal infers most Find one solutionSto Goal The current most specific generalisationMSG = S Repeat Find a solutionNewSto Goal which is NOT an instance ofMSG Find the most specific generalisationNewMSG ofMSGandNewS MSG := NewMSG until no such solution remains
Example - without finite domains p(1,2). p(1,3). p(2,3). p(2,4). p(X,Y) infers most MSG: 1st Iteration: p(1,2) 2nd Iteration: p(1,_) 3rd Iteration: p(_,_) No more iterations
Propia Algorithm for Arc Consistency p(1,2). p(1,3). p(2,3). p(2,4). This algorithm only works for predicates defined by ground facts p(X,Y) infers ac is implemented as: element(I,[1,1,2,2],X), element(I,[2,3,3,4],Y).
CHR - Constraints Handling Rules • CHR -- set of rewrite rules for constraints • Can be mixed with normal Prolog code • H1...,Hn <=><Guards>|<Goals>. remove “ask” add, “tell” Constraint Store
Constraint Store Goal ?- le(B,C) le(A,B) Clauses, Constraints, Goals Clause le(X,Y1), le(Y2,Z) ==> Y1=Y2 | le(X,Z) Head Guard Body le(B,C) le(A,C)
Constraint Store Goal le(B,A) ?- le(B,A) le(A,B) le(A,B) Simplification Rule Clause le(X,Y), le(Y,X) <=> X=Y Head Body A=B
Constraint Store Goal le(1,2) ?- le(1,2) Definition of “less than or equal” (le) :- constraints le/2. le(X,Y), le(Y,Z) ==> le(X,Z). le(X,Y), le(Y,X) <=> X=Y. le(X,Y) ==> X=<Y. le(X,Y) <=> X=<Y | true. true
Constraint Store Goal ?- min(A,B,Min) le(A,B) Entailment Testing Clause le(X,Y) \ min(X,Y,Z) ==> Z=X Head Body min(A,B,Min) Min=A
Entailment Testing – without CHR’s ge1(X,Y,Z) :- ‘=<‘(X,Y,B), ge2(B,X,Y,Z). delay ge2(B,_,_,_) if var(B). ge2(0,_,Y,Z) :- Z=Y. ge2(1,X,_,Z) :- Z=X. min1(X,Y,Z) :- ic: (Z=<X), ic: (Z=<Y), ge1(X,Y,Z). ?- ic: (X=<Y), ic: (X,Y,B). Yes B::0..1
CHR-Defined Precedence prec(Time1,Duration,Time2) means that Time1 precedes Time2 by at least Duration. • Note that: • Time1andTime2may be variables or numbers • Durationis a number • Durationmay be negative • (prec(S1,-5,S2)means thatS2precedesS1by no more than 5)
Syntax and semantics for CHRs • Simplification rule: • H1...,Hn <=><Guards>|<Goals>. • Propagation rule: • H1...,Hn ==><Guards>|<Goals>. • Simpagation rule: • H1..\..Hn <=><Guards>|<Goals>. • Heads are match only - no binding of external vars. • Goals are any Prolog goals or constraints. • Constraint added to store if no rule applicable.
CHRs for prec/3 %A timepoint precedes itself by a maximum duration of 0prec(S,D,S) <=> D=<0. (implicit guard in the head) %Two timepoints preceding each other by (at least) 0 are the sameprec(S1,0,S2), prec(S2,0,S1) <=> S1=S2. (rule with two atoms in the head) %Transitivity prec(S1,D1,S2),prec(S2,D2,S3) ==> D3 is D1+D2, prec(S1,D3,S3). (propagation rule) % prec(S1,D1,S2) is redundantprec(S1,D1,S2) \ prec(S1,D2,S2) <=> D2>=D1 | true. (simpagation rule)
Complete Precedence Entailment % Assume D is a number noclash(S,T)\ prec(T,D,S)<=> D >= -5 | prec(T,0,S). noclash(S,T)\ prec(S,D,T)<=> D >= 0 | prec(S,5,T). prec(S,D,T) ==> ic:(T>=S+D).
Global Consistency • Reasoning on Combinations of Constraints • Propia and CHRs can apply consistency techniques to combinations of constraints • Propia for a priori combinations • Propia can be applied to program-defined predicates • These predicates combine sets of constraints selected in advance of program execution • CHRs for combining newly posted constraints • CHR multi-headed rules can match combinations of constraints • CHR multi-headed rules can match constraints newly posted during search
CHR Exercise Using CHR, axiomatise constraints “less than” and “minimum” Ensure logical completeness.
Propia and CHR Exercise • Implement three constraints, 'and', 'or' and 'xor' • in Propia • in CHR (if you have time) • The constraints are specified as follows: • All boolean variables have domain [0,1]: • 0 for 'false' • 1 for 'true • and(X,Y,Z) =def (X&Y) = Z • or(X,Y,Z) =def (X or Y) = Z • xor(X,Y,Z) =def ((X & -Y) or (-X & Y)) = Z
Testing Your Solution Suppose your constraints are called cons_and, cons_or and cons_xor Now write enter the following procedure: full_adder(I1,I2,I3,O1,O2) :- cons_xor(I1,I2,X1), cons_and(I1,I2,Y1), cons_xor(X1,I3,O1), cons_and(I3,X1,Y2), cons_or(Y1,Y2,O2). The test is : ?- full_adder(I1,I2,0,O1,1).