Instytut Automatyki, Robotyki i Inżynierii Informatycznej Politechniki Poznańskiej Adam Meissner Adam.Meissner@put.poznan.pl http://www.man.poznan.pl/~ameis PROGRAMOWANIE WIELOPARADYGMATOWE Wykłady 2-3 Programowanie w paradygmacie CP(FD) Literatura [1] Apt K.R., Prciples of Constrat Programmg, Cambridge Univ. Press, 2003. [2] Niederliński A., Programowanie w logice z ograniczeniami. Łagodne wprowadzenie dla platformy EC- LiPSe, Wyd. Pracowni Komputerowej Jacka Skalmierskiego, Gliwice, 2014 [3] Van Roy P., Haridi S., Concepts, Techniques, and Models of Computer Programmg, The MIT Press, Cambridge, USA, 2004. [4] Smolka G., Schulte Ch., Fite Doma Constrat Programmg Oz. A Tutorial, Mozart Consortium, 2008. 1
Programowanie CP(FD) (1) Problem rozwiązań symetrycznych do zbioru rozwiązań symetrycznych (ang. symmetric solutions) problemu CSP należą rozwiązania "te same" z dokładnością do pewnego izomorfizmu elimowanie rozwiązań symetrycznych może wydatnie zwiększyć efektywność poszukiwania wszystkich rozwiązań problemu CSP i stanowi jedno z podstawowych zagadnień rozpatrywanych w ramach teorii programowania z ograniczeniami jedną z podstawowych technik elimowania rozwiązań symetrycznych jest wprowadzanie porządku do wartościowań poszczególnych zmiennych Przykład 2.1 (wg [4]) Sformułowanie problemu W sklepie zakupiono 4 różne produkty; kasjer podał ich cenę łączną - 7,11 zł (711 gr), zaraz jednak poprawił się wyjaśniając, że zamiast zsumować poszczególne kwoty, wykonał ich mnożenie. Jednakże, po zsumowaniu, cena łączna nie zmieniła się. Podać ceny poszczególnych produktów. 2
Programowanie CP(FD) (2) Przykład 2.1 (c.d.) Implementacja proc {Grocery Root} A#B#C#D = Root S = 711 Root ::: 0#S A*B*C*D =: S*100*100*100 A+B+C+D =: S %% elimowanie rozw. symetrycznych - wariant 1 A =<: B B =<: C C =<: D %% elimowanie rozw. symetrycznych - wariant 2 % A =: 79*{FD.decl} % B =<: C % C =<: D {FD.distribute generic(value:splitmax) Root} 3
Paradygmat CP(FD) (3) Nakładanie więzów za pomocą podprogramów Do nakładania ograniczeń, oprócz bezpośredniego stosowania propagatorów bibliotecznych, można wykorzystywać własne podprogramy. Przykład 2.2 (wg [4]) Sformułowanie problemu 1. Maria i Klara są matkami 2 rodz 2. W każdej rodzie jest 3 synów i 3 córki 3. Różnica wieku między dziećmi nie jest w żadnym przypadku mniejsza niż 1 rok 4. Wszystkie dzieci mają mniej niż 10 lat 5. W rodzie Klary właśnie urodziła się córka 6. Najmłodszym dzieckiem Marii jest dziewczynka. 7. W obu rodzach suma wieku chłopców jest równa sumie wieku dziewczynek; równość zachodzi także między sumami kwadratów wieku chłopców i dziewczynek 8. Suma wieku wszystkich dzieci wynosi 60 Ile lat mają poszczególne dzieci w każdej z rodz? Elementy modelu problemu Rodzę reprezentuje się za pomocą rekordu Name(boys:[B1 B2 B3] girls:[g1 G2 G3]). Elementy obu list są uszeregowane malejąco. W celu sformułowania więzów F opisujących rodzę, której matką jest N, defiuje się procedurę {FamilyOf N F}. 4
Paradygmat CP(FD) (4) Przykład 2.2 (wg [4], c.d.) Implementacja proc {Family Root} proc {FamilyOf Name F} Coeffs = [1 1 1 ~1 ~1 ~1] Ages F = Name(boys:{AgeList} girls:{agelist}) Ages = {App F.boys F.girls} {FD.distct Ages} {FD.sumC Coeffs Ages '=:' 0} {FD.sumCN Coeffs {Map Ages fun {$ A} [A A] } '=:' 0} proc {AgeList L} {FD.list 3 0#9 L} {Nth L 1} >: {Nth L 2} {Nth L 2} >: {Nth L 3} Maria = {FamilyOf maria} Clara = {FamilyOf clara} AgeOfMariasYoungestGirl = {Nth Maria.girls 3} AgeOfClarasYoungestGirl = {Nth Clara.girls 3} Ages = {FoldR [Clara.girls Clara.boys Maria.girls Maria.boys] App nil} Root = Maria#Clara {ForAll Maria.boys proc {$ A} A >: AgeOfMariasYoungestGirl } AgeOfClarasYoungestGirl = 0 {FD.sum Ages '=:' 60} {FD.distribute split Ages} 5
Paradygmat CP(FD) (5) Przykład 2.3 (wg [4], zagadka Estea) Sformułowanie problemu W 5 domach położonych wzdłuż (po jednej stronie) ulicy mieszka 5 mężczyzn różnej narodowości. Każdy z nich ma ny zawód, ny ulubiony napój i ne ulubione zwierzę. Każdy dom ma ny kolor. Znane są przy tym następujące fakty. 1. Anglik mieszka w domu koloru czerwonego 2. Hiszpan ma psa 3. Japończyk jest malarzem 4. Włoch lubi herbatę 5. Norweg mieszka w pierwszym domu 6. Właściciel zielonego domu lubi kawę 7. Zielony dom następuje po domu białym 8. Rzeźbiarz hoduje ślimaki 9. Dyplomata mieszka w domu koloru żółtego 10.Właściciel trzeciego domu lubi mleko 11.Dom Norwega sąsiaduje z domem niebieskim 12.Skrzypek lubi sok 13.Lis żyje przy domu, który jest obok domu lekarza 14.Koń żyje przy domu obok domu dyplomaty 15.Zebra żyje przy domu koloru białego 16.Jeden z mieszkańców lubi wodę Kto gdzie mieszka? 6
Paradygmat CP(FD) (6) Przykład 2.3 (wg [4], c.d.) Elementy modelu problemu W rozpatrywanym problemie występuje 5 cech (narodowość, zawód, kolor domu, ulubione zwierzę, ulubiony napój) z których każda może przyjąć 5 wartości. Z każdą wartością cechy wiąże się zmienną oznaczającą numer domu. Wykorzystuje się dwie procedury służące do nakładania więzów: {Partition Group} postulującą, że cechy występujące na liście Group muszą przysługiwać parami różnym domom oraz procedurę {Adjacent X Y} stwierdzającą, że cechy X oraz Y przysługują domom sąsiadującym ze sobą. Implementacja proc {Zebra Nb} Groups = [[english spanish japanese italian norvegian] [green red yellow blue white] [pater diplomat violist doctor sculptor] [dog zebra fox snails horse] [juice water tea coffee milk] ] Properties = {FoldR Groups App nil} proc {Partition Group} {FD.distct {Map Group fun {$ P} Nb.P }} proc {Adjacent X Y} {FD.distance X Y '=:' 1} {FD.record number Properties 1#5 Nb} 7
Paradygmat CP(FD) (7) Przykład 2.3 (wg [4], c.d.) Implementacja {ForAll Groups Partition} Nb.english = Nb.red Nb.spanish = Nb.dog Nb.japanese = Nb.pater Nb.italian = Nb.tea Nb.norvegian = 1 Nb.green = Nb.coffee Nb.green >: Nb.white Nb.sculptor = Nb.snails Nb.diplomat = Nb.yellow Nb.milk = 3 {Adjacent Nb.norvegian Nb.blue} Nb.violist = Nb.juice {Adjacent Nb.fox Nb.doctor} {Adjacent Nb.horse Nb.diplomat} Nb.zebra = Nb.white {FD.distribute ff Nb} Skrypty z parametrami Problemy CSP są w wielu przypadkach skalowalne. Do ich reprezentowania wykorzystuje się skrypty z parametrami o postaci zgodnej z poniższym schematem fun {Name N1... Nn}... proc {$ Sol}... 8
Paradygmat CP(FD) (8) Przykład 2.4 (wg [4], problem N-hetmanów) Sformułowanie problemu Na szachownicy o wymiarze N N należy rozmieścić N hetmanów w taki sposób, aby żadne dwa hetmany nie szachowały się wzajemnie. Elementy modelu problemu Ciąg hetmanów reprezentuje się jako N-elementową listę liczb, której element R(i) odpowiada hetmanowi w i-tej kolumnie i w R(i)-tym wierszu dla i = 1,, n. Warunek, aby dowolne dwa hetmany, tj. R(i) oraz R(j) nie leżały na jednej przekątnej wyraża się jako R(i) + (j - i) R(j) oraz R(i) - (j - i) R(j) dla 1 i < j n lub równoważnie, aby ciągi R(1) - 1,, R(N) - N oraz R(1) + 1,, R(N) + N były różnowartościowe Implementacja fun {Queens N} proc {$ Row} L1N = {MakeTuple c N} LM1N = {MakeTuple c N} Row = {FD.tuple queens N 1#N} {For 1 N 1 proc {$ I} L1N.I=I LM1N.I=~I } {FD.distct Row} {FD.distctOffset Row L1N} {FD.distctOffset Row LM1N} {FD.distribute generic(order:size value:mid) Row} 9
Paradygmat CP(FD) (9) Przykład 2.5 (wg [4]) Sformułowanie problemu Dana jest pewna liczba monet o różnych nomałach. Niech a i oznacza liczbę dostępnych monet o nomale d i dla i = 1,, n. Wyznaczyć mimalną liczbę monet niezbędną do wypłacenia kwoty A. Elementy modelu problemu Informację o dostępnych monetach reprezentuje rekord r(d 1 #a 1 d n #a n ). Rozwiązanie problemu reprezentuje ciąg liczb C(1),, C(n) taki, że dla i = 1,, n element C(i) jest liczbą monet o nomale d i, przy czym 0 C(i) a i. Implementacja fun {ChangeMoney Cos Amount} Avail = {Record.map Cos fun {$ A#_} A } Denom = {Record.map Cos fun {$ _#D} D } NbDenoms = {Width Denom} proc {$ Change} {FD.tuple change NbDenoms 0#Amount Change} {For 1 NbDenoms 1 proc {$ I} Change.I =<: Avail.I } {FD.sumC Denom Change '=:' Amount} {FD.distribute generic(order:naive value:max) Change} 10
Paradygmat CP(FD) (10) Optymalizacyjne problemy CSP do rozpatrywanej klasy należą problemy, z którymi wiąże się konieczność znalezienia rozwiązania najlepszego w zbiorze R wszystkich rozwiązań problemu w szczególności, optymalizacja może polegać na mimalizowaniu funkcji ceny określonej na zbiorze R w niektórych (prostych) przypadkach mimalizację funkcji ceny można uzyskać poprzez zastosowanie 2-wymiarowej strategii dystrybucji Przykład 3.1 (wg [4], kolorowanie mapy) Sformułowanie problemu Dana jest polityczna mapa Europy Zachodniej, na której widnieje Holandia, Belgia, Francja, Hiszpania, Portugalia, Niemcy, Luksemburg, Szwajcaria, Austria i Włochy. Używając jak najmniejszej liczby kolorów pomalować mapę tak, aby żadne dwa kraje graniczące ze sobą nie miały tej samej barwy. Elementy modelu problemu Rozwiązanie problemu reprezentuje rekord color(r 1 :c 1 r n :c n ) taki, że dla i = 1,, n pole r i o wartości c i oznacza kraj o nazwie r i i kolorze na mapie wyrażonym przez liczbę c i ; dziedzą zmiennej c i jest zbiór 1#NbColors. 11
Paradygmat CP(FD) (11) Przykład 3.1 (wg [4], c.d.) Implementacja Data = [belgium # [france netherlands germany luxemburg] germany # [austria france luxemburg netherlands] switzerland # [italy france germany austria] austria # [italy switzerland germany] france # [spa luxemburg italy] spa # [portugal] italy # nil luxemburg # nil netherlands # nil portugal # nil] fun {MapColor Data} Countries = {Map Data fun {$ C#_} C } proc {$ Color} NbColors = {FD.decl} {FD.distribute naive [NbColors]} {FD.record color Countries 1#NbColors Color} {ForAll Data proc {$ A#Bs} {ForAll Bs proc {$ B} Color.A \=: Color.B } } {FD.distribute ff Color} 12
Paradygmat CP(FD) (12) Przykład 3.2 (wg [4], program konferencji) Sformułowanie problemu Ułożyć program (plan) konferencji w formie ciągu paneli. Konferencja składa się z 11 sesji a w każdym panelu może toczyć się równolegle do 3 sesji. Ponadto, obowiązują następujące ograniczenia. 1. Sesja 4 musi odbyć się przed sesja 11. 2. Sesja 5 musi odbyć się przed sesja 10. 3. Sesja 6 musi odbyć się przed sesja 11. 4. Sesja 1 nie może toczyć się równolegle z sesjami 2, 3, 5, 7, 8 oraz 10 5. Sesja 2 nie może toczyć się równolegle z sesjami 3, 4, 7, 8, 9 oraz 11 6. Sesja 3 nie może toczyć się równolegle z sesjami 5, 6 oraz 8 7. Sesja 4 nie może toczyć się równolegle z sesjami 6, 8 oraz 10. 8. Sesja 6 nie może toczyć się równolegle z sesjami 7 oraz 10 9. Sesja 7 nie może toczyć się równolegle z sesjami 8 oraz 9 10.Sesja 8 nie może toczyć się równolegle z sesją 10 Znaleźć rozwiązanie o mimalnej liczbie paneli 13
Paradygmat CP(FD) (13) Przykład 3.2 (wg [4], c.d.) Elementy modelu problemu Do reprezentowania liczby paneli służy zmienna NbSlots::4#11. Rozwiązanie ma postać krotki plan(p 1... p 11 )takiej, że element p i dla i = 1,..., n oznacza panel, w którym odbywa się i-ta sesja; dla każdego i, p i :: 1#NbSlots. Implementacja fun {Conference Data} NbSessions = Data.nbSessions NbParSessions = Data.nbParSessions Constrats = Data.constrats MNbSlots = NbSessions div NbParSessions proc {$ Plan} NbSlots = {FD.t MNbSlots#NbSessions} {FD.distribute naive [NbSlots]} {FD.tuple plan NbSessions 1#NbSlots Plan} {For 1 NbSlots 1 proc {$ Slot} {FD.atMost NbParSessions Plan Slot} } {ForAll Constrats proc {$ C} case C of before(x Y) then Plan.X <: Plan.Y [] disjot(x Ys) then {ForAll Ys proc {$ Y} Plan.X \=: Plan.Y } } {FD.distribute ff Plan} 14
Paradygmat CP(FD) (14) Przykład 3.2 (wg [4], c.d.) Data = data(nbsessions: 11 nbparsessions: 3 constrats: [before(4 11) before(5 10) before(6 11) disjot(1 [2 3 5 7 8 10]) disjot(2 [3 4 7 8 9 11]) disjot(3 [5 6 8]) disjot(4 [6 8 10]) disjot(6 [7 10]) disjot(7 [8 9]) disjot(8 [10]) ]) Ograniczenia nadmiarowe (redundantne) Niech P oraz S będą zbiorami ograniczeń, zbiór S jest redundantny względem P, jeżeli S jest konsekwencją logiczną P; przykładowo, zbiór ograniczeń {X<:10} jest redundantny względem zbioru {X<:5}. Wprowadzenie odpowiednich ograniczeń redundantnych może zmniejszyć drzewo poszukiwań, jak również zredukować liczbę kroków propagacji wykonywanych w przestrzeniach obliczeń. Przykład 3.3 (wg [4], ułamki) Sformułowanie problemu Znaleźć przypisanie cyfr różnych od 0 do liter występujących w poniższym wyrażeniu tak, aby uzyskać poprawne wyrażenie arytmetyczne (A / BC) + (D / EF) + (G/HI) = 1 15
Paradygmat CP(FD) (15) Przykład 3.3 (wg [4], c.d.) Elementy modelu problemu W celu usunięcia rozwiązań symetrycznych, wprowadza się następujący porządek na wartościowania zmiennych: (A / BC) (D / EF) (G/HI). Na tej podstawie można sformułować następujące ograniczenia redundantne: Implementacja 3 * (A / BC) 1 oraz 3 * (G/HI) 1 proc {Fraction Root} sol(a:a b:b c:c d:d e:e f:f g:g h:h i:i) = Root BC = {FD.decl} EF = {FD.decl} HI = {FD.decl} Root ::: 1#9 {FD.distct Root} BC =: 10*B + C EF =: 10*E + F HI =: 10*H + I A*EF*HI + D*BC*HI + G*BC*EF =: BC*EF*HI A*EF >=: D*BC D*HI >=: G*EF 3*A >=: BC 3*G =<: HI {FD.distribute split Root} 16
Paradygmat CP(FD) (16) Przykład 3.4 (wg [4], liczby Pitagorasa) Sformułowanie problemu Wyznaczyć liczbę trójek (A, B, C), takich że A B C 1000 i A 2 + B 2 = C 2. Elementy modelu problemu Do reprezentowania liczb Pitagorasa służą zmienne A, B, C; dziedzą początkową każdej z nich jest zbiór 1#1000. Z ograniczenia A 2 + B 2 = C 2 można wyprowadzić następujące ograniczenie redundantne: Implementacja 2 * B 2 C 2 proc {Pythagoras Root} [A B C] = Root AA BB CC Root ::: 1#1000 AA = {FD.times A A} BB = {FD.times B B} CC = {FD.times C C} AA + BB =: CC A =<: B B =<: C % ograniczenie nadmiarowe 2*BB >=: CC {FD.distribute ff Root} 17
Paradygmat CP(FD) (17) Przykład 3.5 (wg [4], kwadraty magiczne) Sformułowanie problemu Kwadratem magicznym rzędu N nazywa się macierz N N zawierającą liczby naturalne z przedziału [1, N 2 ], ułożone tak aby suma elementów w każdym wierszu i w każdej kolumnie oraz na obu przekątnych gł. była taka sama (jest to tzw. suma magiczna). Przykładowo, poniższa macierz jest kwadratem magicznym rzędu 3. 2 7 6 9 5 1 4 3 8 Elementy modelu problemu Do reprezentowania elementu (i, j) kwadratu używa się zmiennej F i,j, a zmienna S oznacza sumę magiczną. Obowiązują następujące ograniczenia. F 1,1 < F N,N, F N,1 < F 1,N, F 1,1 < F N,1 (elim. symetrii) 0.5 * N 2 * (N 2 + 1) = S * N (ogr. redundantne) 18
Paradygmat CP(FD) (18) Przykład 3.5 (wg [4], c.d.) Implementacja fun {MagicSquare N} NN = N*N L1N = {List.number 1 N 1} % [1 2 3... N] proc {$ Square} fun {Field I J} Square.((I-1)*N + J) proc {Assert F} %% {F 1} + {F 2} +... + {F N} =: Sum {FD.sum {Map L1N F} '=:' Sum} Sum = {FD.decl} {FD.tuple square NN 1#NN Square} {FD.distct Square} %% Przekątne {Assert fun {$ I} {Field I I} } {Assert fun {$ I} {Field I N+1-I} } %% Kolumny {For 1 N 1 proc {$ I} {Assert fun {$ J} {Field I J} } } %% Wiersze {For 1 N 1 proc {$ J} {Assert fun {$ I} {Field I J} } } %% Elimacja symetrii {Field 1 1} <: {Field N N} {Field N 1} <: {Field 1 N} {Field 1 1} <: {Field N 1} %% Ogr.nadm.: suma pól = (liczba wierszy) * Sum NN*(NN+1) div 2 =: N*Sum {FD.distribute split Square} 19
Paradygmat CP(FD) (19) Ograniczenia reifikowane ograniczenia reifikowane są przeznaczone do wyrażania więzów, w których wykorzystuje się symbole logiczne, takie jak alternatywa, negacja czy implikacja reifikacją ograniczenia C ze względu na zmienną x nazywa się ograniczenie: (C «x = 1) x Î 0#1 i x nie występuje jako zmienna wolna w C semantyka operacyjna propagatora będącego reifikacją ograniczenia C ze względu na zmienną x: 1) jeżeli ogr. x = 1 jest nadmiarowe w danym składzie więzów, to ogr. reifikowane redukuje się do C; 2) jeżeli ogr. x = 0 jest nadmiarowe w danym składzie więzów, to ogr. reifikowane redukuje się do C; 3) jeżeli propagator dla ogr. reifikowanego jest nadmiarowy w danym składzie więzów, to do składu wprowadza się ogr. x = 1 i propagator zostaje usunięty; 4) jeżeli propagator dla ogr. reifikowanego jest sprzeczny z danym składem więzów, to do składu wprowadza się ogr. x = 0 i propagator zostaje usunięty. 20
Paradygmat CP(FD) (20) Ograniczenia reifikowane (c.d.) ograniczenie będące reifikacją ograniczenia C ze względu na zmienna x tuicyjnie wyraża to, że formuła C jest prawdziwa wtw gdy x ma wartość 1 a fałszywa wtw gdy x ma wartość 0 przykładowo, poniższa formuła wyraża równoważność dwóch ograniczeń X < Y «X < Z formułę tę można wyrazić za pomocą poniższych ograniczeń reifikowanych X <: Y = B X <: Z = B Przykład 3.6 (wg [4], ustawianie do zdjęcia) Sformułowanie problemu Beata, Krzyś, Donald, Franek, Grześ, Maria i Paweł ustawiają się w jednym rzędzie do zdjęcia. Mają przy tym następujące oczekiwania. 1. Beata chce stać między Grzesiem a Marią 2. Krzyś chce stać między Beatą a Grzesiem 3. Franek chce stać między Marią a Donaldem 4. Paweł chce stać między Frankiem a Donaldem Znaleźć ustawienie, spełniające możliwie jak największą liczbę oczekiwań fotografowanych osób. 21
Paradygmat CP(FD) (21) Przykład 3.6 (wg [4], c.d.) Elementy modelu problemu Do reprezentowania położenia osoby p w rzędzie służy zmienna A P Î 1#7. Zmienna S i Î 0#1 ma wartość 1 wtw i-ta preferencja jest spełniona. Ściślej ujmując, ograniczenie wyrażające fakt, że osoba A P chce stać obok A Q osoby ma postać formuły ( A P - A Q = 1 «S = 1) S Î 0#1 Rozwiązanie problemu polega na znalezieniu maksymalnej wartości zmiennej Sat, takiej że Sat = S 1 + + S 8 Implementacja proc {Photo Root} Persons = [beata krzys donald franek grzes maria pawel] Preferences = [beata#grzes beata#maria krzys#beata krzys#grzes franek#maria franek#donald pawel#franek pawel#donald] NbPersons = {Length Persons} Alignment = {FD.record alignment Persons 1#NbPersons} Sat = {FD.decl} proc {Satisfied P#Q S} {FD.reified.distance Alignment.P Alignment.Q '=:' 1 S} Root = Sat#Alignment {FD. distct Alignment} {FD.sum {Map Preferences Satisfied} '=:' Sat} Alignment.franek <: Alignment.beata % elim. symetr. {FD.distribute generic(order:naive value:max) [Sat]} {FD.distribute split Alignment} 22
Paradygmat CP(FD) (22) Przykład 3.7 (wg [4], autoreferencyjny test wyboru) Sformułowanie problemu Dany jest test wyboru składający się z 10-ciu pytań. Na każde z nich formułuje się 5 możliwych odpowiedzi (numerowanych od a do e), z których dokładnie 1 jest poprawna. Znaleźć odpowiedzi poprawne, spełniające wszystkie warunki podane w pytaniach. 1. Pierwszym pytaniem, na które odpowiedź brzmi b jest pytanie: (a) 2, (b) 3, (c) 4, (d) 5, (e) 6. 2. Jedyną parą sąsiadujących ze sobą pytań o identycznym numerze odpowiedzi są pytania: (a) 2-3, (b) 3-4, (c) 4-5, (d) 5-6, (e) 6-7. 3. Odpowiedź na niejsze pytanie jest taka sama jak odpowiedź na pytanie: (a) 1, (b) 2, (c) 4, (d) 7, (e) 6. 4. Liczba pytanie, na które odpowiedź brzmi a wynosi: (a) 0, (b) 1, (c) 2, (d) 3, (e) 4. 5. Odpowiedź na niejsze pytanie jest taka sama jak odpowiedź na pytanie: (a) 10, (b) 9, (c) 8, (d) 7, (e) 6. 6. Liczba pytań, na które odpowiedź brzmi a jest równa liczbie pytań, na które odpowiedź brzmi: (a) b, (b) c, (c) d, (d) e, (e) żadnej z wymienionych. 7. Alfabetyczna odległość odpowiedzi na pytanie niejsze i następne wynosi: (a) 4, (b) 3, (c) 2, (d) 1, (e) 0. 8. Liczba pytań o odpowiedziach oznaczonych samogłoskami wynosi: (a) 2, (b) 3, (c) 4, (d) 5, (e) 6. 9. Liczba odpowiedzi oznaczonych spółgłoskami jest: (a) liczbą pierwszą, (b) silnią pewnej liczby, (c) kwadratem, (d) sześcianem, (e) jest podzielna całkowicie przez 5. 10.Odpowiedzią na niejsze pytanie jest: (a) a, (b) b, (c) c, (d) d, (e) e. 23
Paradygmat CP(FD) (23) Przykład 3.7 (wg [4], c.d.) Uwaga, problem ma tylko 1 następujące rozwiązanie: 1:c 2:d 3:e 4:b 5:e 6:e 7:d 8:c 9:b 10:a Elementy modelu problemu W modelu wykorzystuje się zmienne A i, B i,, E i o dziedzach 0#1 dla i Î 1#10. Każda ze zmiennych ma wartość 1 wtw odpowiedzią na i-te pytanie jest litera będąca nazwą zmiennej. Wiadomo, że A i + B i + + E i = 1. Dodatkowo wprowadza się zmienne Q i dla o dziedzach 1#5 dla i Î 1#10, takie że Q i = 1 «A i =1 Q i = 2 «B i =1 Q i = 3 «C i =1 Q i = 4 «D i =1 Q i = 5 «E i =1 Ograniczenia reprezentujące warunek 1 A 1 = B 2 B 1 = (B 3 (B 2 = 0)) C 1 = (B 4 (B 2 + B 3 = 0)) D 1 = (B 5 (B 2 + B 3 + B 4 = 0)) E 1 = (B 6 (B 2 + B 3 + B 4 + B 5 = 0)) Ograniczenia reprezentujące warunek 2 Q 1 Q 2, Q 7 Q 8, Q 8 Q 9, Q 9 Q 10, A 2 = (Q 2 = Q 3 ), B 2 = (Q 3 = Q 4 ), C 2 = (Q 4 = Q 5 ), D 2 = (Q 5 = Q 6 ), E 2 = (Q 6 = Q 7 ) Ograniczenia reprezentujące warunek 3 A 3 = (Q 1 = Q 3 ), B 3 = (Q 2 = Q 3 ), C 3 = (Q 3 = Q 4 ), D 3 = (Q 7 = Q 3 ), E 3 = (Q 6 = Q 3 ) 24
Paradygmat CP(FD) (24) Przykład 3.7 (wg [4], c.d.) Ograniczenia reprezentujące warunek 4 element(q 4, (0, 1, 2, 3, 4)) = A 1 + A 2 + + A 10 Ograniczenia reprezentujące warunek 9 S = (B 1 + C 1 + D 1 ) + +(B 10 + C 10 + D 10 ) A 9 = (S Î {2, 3, 5, 7}) B 9 = (S Î {1, 2, 6}) C 9 = (S Î {0, 1, 4, 9}) D 9 = (S Î {0, 1, 8}) E 9 = (S Î {0, 5, 10}) Implementacja proc {SRAT Q} proc {Vector V} {FD.tuple v 10 0#1 V} proc {Sum V S} {FD.decl S} {FD.sum V '=:' S} proc {Assert I [U V W X Y]} A.I=U B.I=V C.I=W D.I=X E.I=Y A = {Vector} B = {Vector} C = {Vector} D = {Vector} E = {Vector} SumA ={Sum A} SumB = {Sum B} SumC = {Sum C} SumD = {Sum D} SumE = {Sum E} SumAE = {Sum [SumA SumE]} SumBCD = {Sum [SumB SumC SumD]} {FD.tuple q 10 1#5 Q} {For 1 10 1 proc {$ I} {Assert I [Q.I=:1 Q.I=:2 Q.I=:3 Q.I=:4 Q.I=:5]} } %% 1 {Assert 1 [ B.2 {FD.conj B.3 (B.2=:0)} {FD.conj B.4 (B.2+B.3=:0)} {FD.conj B.5 (B.2+B.3+B.4=:0)} {FD.conj B.6 (B.2+B.3+B.4+B.5=:0)} ]} 25
Paradygmat CP(FD) (25) Przykład 3.7 (wg [4], c.d.) %% 2 {Assert 2 [Q.2=:Q.3 Q.3=:Q.4 Q.4=:Q.5 Q.5=:Q.6 Q.6=:Q.7]} Q.1\=:Q.2 Q.7\=:Q.8 Q.8\=:Q.9 Q.9\=:Q.10 %% 3 {Assert 3 [Q.1=:Q.3 Q.2=:Q.3 Q.4=:Q.3 Q.7=:Q.3 Q.6=:Q.3]} %% 4 {FD.element Q.4 [0 1 2 3 4] SumA} %% 5 {Assert 5 [Q.10=:Q.5 Q.9=:Q.5 Q.8=:Q.5 Q.7=:Q.5 Q.6=:Q.5]} %% 6 {Assert 6 [SumA=:SumB SumA=:SumC SumA=:SumD SumA=:SumE _]} %% 7 {FD.element Q.7 [4 3 2 1 0] {FD.decl}={FD.distance Q.7 Q.8 '=:'}} %% 8 {FD.element Q.8 [2 3 4 5 6] SumAE} %% 9 {Assert 9 [SumBCD::[2 3 5 7] SumBCD::[1 2 6] SumBCD::[0 1 4 9] SumBCD::[0 1 8] SumBCD::[0 5 10] ]} %% 10 skip {FD.distribute ff Q} 26