General
Cursuri
Laboratoare
Teme
General
Cursuri
Laboratoare
Teme
Aceasta e o versiune anterioară a paginii.
O problemă de satisfacere a restricțiilor este descrisă printr-un set de variabile V, o mulțime de domenii finite de valori pentru acestea D și un set de constrângeri C. Vom nota D(X) domeniul variabilei X ∈ V. O constrângere c va fi reprezentată printr-o relație între una sau mai multe variabile din V.
O soluție pentru o astfel de problemă este reprezentată printr-o instanțiere a variabilelor din V cu valori ce satisfac toate restricțiile din C.
Arc-consistența reprezintă o metodă pentru propagarea restricțiilor (eliminarea din domeniile variabilelor a acelor valori care nu pot face parte dintr-o soluție a problemei). Arc-consistența este obținută atunci când pentru fiecare valoare din domeniul unei variabile și pentru orice restricție care implică acea variabilă există o instanțiere a tuturor variabilelor implicate care conține acea valoare astfel încât restricția să fie satisfăcută.
Să se scrie un predicat gac3/5
pentru revizuirea domeniilor de valori ale unor variabile folosind algoritmul GAC3 descris mai sus.
gac3(+Vars, +Domains, +Constraints, +HyperArcs, -RevisedDomains)
Vars
reprezintă mulțimea tuturor variabilelor problemei (o listă de variabile Prolog). De exemplu: [X, Y, Z]
.
Domains
reprezintă lista domeniilor de valori pentru variabilele Vars
. De exemplu: [[1,2,3], [3,4], [1,4,7]]
.
Constraints
reprezintă lista tuturor restricțiilor problemei. O constrângere va fi reprezentată printr-o structură constraint(CVars, Expression)
unde
CVars
reprezintă lista variabilelor implicate de acea constrângere (o listă de variabile Prolog)Expression
reprezintă un scop Prolog ce va putea fi verificat după instanțierea variabilelor din CVars
De exemplu: [constraint([X], X > 0), constraint([X, Y, Z], X =:= Y + Z)]
.
HyperArcs
reprezintă lista hiperarcelor ce trebuie verificate. Un hiperarc va fi reprezentat astfel: hypeararc(X, Ys, Constraint)
, unde
X
reprezintă variabila al cărei domeniu trebuie verificat pentru consistențăYs
reprezintă lista celorlalte variabile implicate în restricțieConstraint
reprezintă un scop Prolog ce va putea fi verificat după instanțierea lui X
și a celorlalte variabile Ys
De exemplu: [hyperarc(X,[], X>0), hyperarc(Z, [X, Y], X =:= Y + Z)]
.
RevisedDomains
reprezintă lista domeniilor variabilelor problemei după impunerea arc-consistenței.
Observație: listele Vars
, Domains
și RevisedDomains
vor avea același număr de elemente.
Să se scrie un predicat solve_csp/4
pentru rezolvarea problmelor de satisfacere a restricțiilor:
solve_csp(+Vars, +Domains, +Constraints, -Solution)
Argumentele Vars
, Domains
și Constraints
reprezintă aceleași lucruri precum în cazul predicatului gac3/5
.
Prin satisfacerea unui scop solve_csp
, variabila Solution
va fi legată la o listă de valori pentru variabilele Vars
care compun o soluție a problemei.
De exemplu:
?- solve_csp([X,Y,Z], [[1,2,3], [1,2,3], [1,2,3]], [constraint([X], X > 2), constraint([X, Y, Z], X < Y + Z)], Solution). Solution = [3, 1, 3]; Solution = [3, 2, 2]; Solution = [3, 3, 1].