Logické programování s omezujícími podmínkami Constraint Logic Programming: CLP
CP a programovací jazyk Dosavadní předpoklady (pro CSP) omezení jsou dostupná na začátku prohledávání omezení jsou reprezentována extensionálně jako množina povolených kombinací Programovací jazyk umožní přidávání omezení inkrementálně reprezentace omezení pomocí jazyka Omezení vs. logické programování (LP) omezení jako relace/predikát, konjunkce omezení jako logická spojka AND, backtracking jako základ pro řešení omezení logické programování založeno na predikátech, konjunkcích, prohledávání do hloubky Programování s omezujícími podmínkami I, 5. prosince 2003 2 Logické programování s omezujícími podmínkami
Návrat Prologu? Průmysl začíná používat Prolog Náhrada procedurálního kódu Prologem vede k desetinásobnému zmenšení kódu řádově menšímu času na vývoj, jednodušší údržbě Aplikace (zavedené aplikační oblasti, nutnost přidání inteligence) hypotéky pediatrický sw výroba oken a dveří: konfigurace a pravidla pro stanovení ceny objednávky testovací nástroje, modelové testování Efektivita Prologu? zrychlení počítačů + výrazné zvětšení nároků sw ve prospěch kompaktnosti i rychlosti Prologu Programování s omezujícími podmínkami I, 5. prosince 2003 3 Logické programování s omezujícími podmínkami
Logický program: množina klauzulí Klauzule: je tvaru H :- B H se nazývá hlava, B=B 1,...B m se nazývá tělo B i a H jsou literály Syntaxe LP literál je tvaru p(t 1,..., t n ), kde p je n-ární predikát a t i jsou termy začíná malým písmenem (p) term může být proměnná X konstanta c aplikace n-ární funkce na n termů f(t 1,..., t n ) začíná velkým písmenem (X) začíná malým písmenem (c) začíná malým písmenem (f) Tělo interpretováno jako logická konjunkce literálů, tj. B B 1,...B m :- reprezentuje implikaci z těla na hlavu, tj. H B Programování s omezujícími podmínkami I, 5. prosince 2003 4 Logické programování s omezujícími podmínkami
Syntaxe LP II. Kvantifikace proměnných: S H proměnné v H, S B proměnné v B pro všechny hodnoty proměnných v H existují hodnoty pro proměnné v B tak, že H B Příklad: p(x,y) :- q(x), r(x,y,z). pro hodnoty X,Y ex. hodnota Z tak, že když platí q(x) i r(x,y,z), pak platí p(x,y) Souvislosti s imperativním přístupem hlava jako definice procedury, tělo jako kód procedury Fakt: klauzule bez těla hlava pravdivá pro livovolné hodnoty jejích proměnných Příklad logického programu dosazitelny(x,x). dosazitelny(x,y) :- let(x,y). dosazitelny(x,y) :- let(x,z), dosazitelny(z,y). rekurze Programování s omezujícími podmínkami I, 5. prosince 2003 5 Logické programování s omezujícími podmínkami
Operační sémantika LP Provádění logického programu je dotaz na pravdivostní hodnotu cíle :- G. kde G=A 1,...A m, A i jsou literály existují hodnoty proměnných v G tak, aby všechny A i byly splněny? příklad: :- p(x,y). Unifikace literálů A 1 a A 2 : nalezení takového přiřazení termů proměnným v A 1 a A 2, že se výsledné literály rovnají přiřazení termů proměnným: substituce aplikace substituce σ na literál A vrací nový literál Aσ hledání nejobecnějšího unifikátoru (mgu), tj. minimální substituce A 1 = p(x, a, f (Z)), A 2 = p(b, Y, V ) substituce σ = {X = b, Y = a, V = f (Z)} je nejobecnější unifikátor substituce σ = {X = b, Y = a, V = f (c), Z = c} není nejobecnější unifikátor Programování s omezujícími podmínkami I, 5. prosince 2003 6 Logické programování s omezujícími podmínkami
Operační sémantika LP II. Odpověd na cíl: nalezení hodnot jeho proměnných rekurzivní unifikací aktuálního cíle s hlavou klauzule opakované provádění rezolučních kroků G = A, R H : B σ = mgu(a, H) G = (B, R)σ Posloupnost rezolučních kroků: rezoluční odvození úspěšné: končí prázdným cílem odpověd je složení substitucí z jednotlivých rezolučních kroků nelze pokračovat dalším rezolučním krokem nekonečné rezoluční odvození: cyklení Strom odvození: strom reprezentující množinu všech odvození začínající cílem Programování s omezujícími podmínkami I, 5. prosince 2003 7 Logické programování s omezujícími podmínkami
Strom rezolučního odvození: příklad a(x) : b(x, Y ), c(y ). (1) a(x) : c(x). (2) b(2, 3). (3) b(1, 2). (4) c(2). (5) : a(x). Programování s omezujícími podmínkami I, 5. prosince 2003 8 Logické programování s omezujícími podmínkami
Logické programování vs. Prolog Volba následujícího rezolučního kroku lze vybrat libovolný literál v cíli pro literál lze vybrat různé klauzule Logické programování: teoretická nezávislost na pořadí voleb Programovací jazyk logického programování (Prolog) volby nutné, abychom se vyhnuli nedeterminismu volba nejlevějšího literálu a první klauzule v programu + prohledávání stromu do hloubky (backtracking) důsledek voleb: neúplnost (cíl má řešení, ale Prolog ho nenajde) stupid(x,y) :- stupid(x,y). stupid(x,y) :- stop(x,y). stop(x,y). :- stupid(x,y). Programování s omezujícími podmínkami I, 5. prosince 2003 9 Logické programování s omezujícími podmínkami
Datové struktury Prologu Struktury: n-ární funkce jmeno(osoba(jmeno,prijmeni,vek), jmeno). Seznamy [] prázdný seznam [H T] seznam skládající se z prvního prvku H (hlavy seznamu) a zbývající části seznamu T (tělo seznamu) [X1,X2,...,Xn] seznam n prvků X1,X2,...,Xn Příklad: spojení seznamů append([],y,y). append([f R],Y,[F Z]) :- append(r,y,z). Programování s omezujícími podmínkami I, 5. prosince 2003 10 Logické programování s omezujícími podmínkami
LP jako programovací jazyk pro omezení CSP = logický program složený z množiny faktů bez proměnných + jedna klauzule pro konjunkci omezení příklad: X,Y,Z in {a,b,c}, c1(x,y)={(a,a),(a,b),(b,b)}, c2(y,z)={(b,a)} c1(a,a). c1(a,b). c1(b,b). c2(b,a). csp(x,y,z) :- c1(x,y), c2(y,z). tento logický program nalezne množinu všech řešení CSP Logické programy: umožňují vyjádření složitějších vztahů, rekurze i funkcí c(x,x). c(x,x) :-!, fail. c(x,y). fail vždy neuspěje, omezení pro rovnost dvou proměnných omezení pro nerovnost dvou proměnných! (řez) zajistí, že druhá klauzule není zkoušena po volání fail Modelování a řešení CSP pomocí LP snadné LP používá pouze backtracking: neefektivní pro řešení CSP propagace omezení není zahrnuta do řešícího algoritmu Programování s omezujícími podmínkami I, 5. prosince 2003 11 Logické programování s omezujícími podmínkami
Logické programování s omezujícími podmínkami Omezení jako) formule (místo n-ticspecifického jazyka omezení různé typy omezení: lineární rovnice nad R, nerovnice nad Z,... omezení tohoto typu se vyskytují v těle klauzule specializovaný řešič omezení pro omezení daného typu Gauss-Jordanův eliminační algoritmus: řešič pro lineární aritmetická omezení nad Q hranová konzistence: neúplný řešič pro aritmetická omezení nad konečnými doménami Výhody CLP oproti LP unifikace je rozšířena na řešení omezení unifikace v LP je jedno z omezení unifikační algoritmus lze chápat jako řešič omezení pro rovnost termů vyjadřování omezení vybraným jazykem je kompaktnější př. X#=Y jako nerovnost řešič omezení (obvykle založený na neúplné propagaci omezení) umožní kombinaci backtrackingu a propagace Programování s omezujícími podmínkami I, 5. prosince 2003 12 Logické programování s omezujícími podmínkami
Syntaxe CLP Výběr jazyka omezení CLP klauzule jako LP klauzule, ale její tělo může obsahovat omezení daného jazyka p(x,y) :- X #< Y+1, q(x), r(x,y,z). Rezoluční krok v LP kontrola existence mgu mezi cílem a hlavou Krok odvození v CLP také zahrnuje kontrola konzistence aktuální množiny omezení s omezeními v těle klauzule Vyvolání dvou řešičů: unifikace + řešič omezení Programování s omezujícími podmínkami I, 5. prosince 2003 13 Logické programování s omezujícími podmínkami
Operační sémantika CLP CLP výpočet Stor e množina aktivních omezení prostor omezení (constraint store) Programování s omezujícími podmínkami I, 5. prosince 2003 14 Logické programování s omezujícími podmínkami
Operační sémantika CLP CLP výpočet Stor e množina aktivních omezení prostor omezení (constraint store) inicializace Stor e = Programování s omezujícími podmínkami I, 5. prosince 2003 14 Logické programování s omezujícími podmínkami
Operační sémantika CLP CLP výpočet Stor e množina aktivních omezení prostor omezení (constraint store) inicializace Stor e = seznamy cílů prováděny v obvyklém pořadí Programování s omezujícími podmínkami I, 5. prosince 2003 14 Logické programování s omezujícími podmínkami
Operační sémantika CLP CLP výpočet Stor e množina aktivních omezení prostor omezení (constraint store) inicializace Stor e = seznamy cílů prováděny v obvyklém pořadí pokud narazíme na cíl s omezením c: NewStor e = Stor e {c} Programování s omezujícími podmínkami I, 5. prosince 2003 14 Logické programování s omezujícími podmínkami
Operační sémantika CLP CLP výpočet Stor e množina aktivních omezení prostor omezení (constraint store) inicializace Stor e = seznamy cílů prováděny v obvyklém pořadí pokud narazíme na cíl s omezením c: NewStor e = Stor e {c} snažíme se splnit c vyvoláním jeho řešiče Programování s omezujícími podmínkami I, 5. prosince 2003 14 Logické programování s omezujícími podmínkami
Operační sémantika CLP CLP výpočet Stor e množina aktivních omezení prostor omezení (constraint store) inicializace Stor e = seznamy cílů prováděny v obvyklém pořadí pokud narazíme na cíl s omezením c: NewStor e = Stor e {c} snažíme se splnit c vyvoláním jeho řešiče při neúspěchu se vyvolá backtracking při úspěchu se podmínky v NewStor e zjednoduší propagací omezení zbývající cíle jsou prováděny s upraveným NewStor e CLP výpočet je úspěšný, pokud se dostaneme z iniciálního stavu G, do stavu G, S, kde G je prázdný cíl a S je splnitelná. Programování s omezujícími podmínkami I, 5. prosince 2003 14 Logické programování s omezujícími podmínkami
Strom odvození CLP V LP kumulace substitucí, v CLP navíc kumulace omezení Strom CLP odvození obsahuje navíc v uzlu aktuální stav prostoru omezení fac(0,1). fac(n0,f0) :- N0 #>= 1, F0 #= N0*F, N #= N0-1, fac(n,f). :- fac(2,y). Programování s omezujícími podmínkami I, 5. prosince 2003 15 Logické programování s omezujícími podmínkami
CLP(X) CLP parametrické vzhledem k volbě jazyka omezení X CLP(T r ee) odpovídá LP T r ee identifikuje třídu rovností termů (term je strom) CLP(R): třída aritmetických omezení nad R CLP(F D): třída omezení nad proměnnými s konečnými doménami (CSP) Programování s omezujícími podmínkami I, 5. prosince 2003 16 Logické programování s omezujícími podmínkami
CLP(F D) program základní struktura CLP programu solve( Variables ) :- 1. definice proměnných a jejich domén declare_variables( Variables), 2. definice omezení post_constraints( Variables ), 3. hledání řešení labeling( Variables ). (1) a (2) deklarativní část modelování problému (3) řídící část prohledávání stavového prostoru řešení procedura pro hledání řešení (enumeraci) se nazývá labeling umožní nalézt jedno, všechna nebo optimální řešení Programování s omezujícími podmínkami I, 5. prosince 2003 17 Logické programování s omezujícími podmínkami
Rozvrhování úloh úloha doba trvání A 2 B 3 C 5 D 4 minimální doba trvání všech úloh A B C D F Programování s omezujícími podmínkami I, 5. prosince 2003 18 Logické programování s omezujícími podmínkami
Rozvrhování úloh úloha doba trvání A 2 B 3 C 5 D 4 minimální doba trvání všech úloh A B C D F reseni( [A,B,C,D,F] ) :- domain( [A,B,C,D,F], 0, 14), B #>= A + 2, C #>= A + 2, D #>= B + 3, Programování s omezujícími podmínkami I, 5. prosince 2003 18 Logické programování s omezujícími podmínkami
Rozvrhování úloh úloha doba trvání A 2 B 3 C 5 D 4 minimální doba trvání všech úloh A B C D F reseni( [A,B,C,D,F] ) :- domain( [A,B,C,D,F], 0, 14), B #>= A + 2, C #>= A + 2, D #>= B + 3, F #>= C + 5, F #>= D + 4, Programování s omezujícími podmínkami I, 5. prosince 2003 18 Logické programování s omezujícími podmínkami
Rozvrhování úloh úloha doba trvání A 2 B 3 C 5 D 4 minimální doba trvání všech úloh A B C D F reseni( [A,B,C,D,F] ) :- domain( [A,B,C,D,F], 0, 14), B #>= A + 2, C #>= A + 2, D #>= B + 3, F #>= C + 5, F #>= D + 4, labeling([minimize(f)],[a,b,c,d,f]). Programování s omezujícími podmínkami I, 5. prosince 2003 18 Logické programování s omezujícími podmínkami
Reprezentace domény Konečná doména často reprezentována jako interval celých čísel interval je uspořádaný doménu lze reprezentovat pomocí minimální a maximální hodnoty nebo v případě chybějících hodnot v intervalu: (min 1, max 1 ),..., (min n, max n ), kde (max i + 1) < min i+1 a min 1 max 1 < min 2 min 2 <... < min n max n :-? domain( [A,B], 1,3). domain( Variables, Min, Max) A in 1..3 B in 1..3 :-? A in 1..5, A #\= 4. X in Min..Max, X in Range A in (1..3) \/ (5..8) :-? A in (1..3) \/ (8..15) \/ (5..9) \/ {100}. A in (1..3) \/ (5..15) \/ {100} Programování s omezujícími podmínkami I, 5. prosince 2003 19 Logické programování s omezujícími podmínkami
Aritmetická omezení Intervalová konzistence konzistence mezí pro každý z podintervalů domény Expr RelOp Expr RelOp -> #= #\= #< #=< #> #>= A + B #=< 3, A #\= (C - 4) * ( D - 5), A/2 #= 4 sum(variables,relop,suma) domain([a,b,c,f],1,3), sum([a,b,c],#=,f) Programování s omezujícími podmínkami I, 5. prosince 2003 20 Logické programování s omezujícími podmínkami
Kombinatorická omezení: příklady Globální omezení pro řešení kombinatorických úloh all_distinct(list) všechny proměnné různé Programování s omezujícími podmínkami I, 5. prosince 2003 21 Logické programování s omezujícími podmínkami
Kombinatorická omezení: příklady Globální omezení pro řešení kombinatorických úloh all_distinct(list) všechny proměnné různé global_cardinality(list, KeyCounts) omezení na počet prvků daného typu v seznamu pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou Programování s omezujícími podmínkami I, 5. prosince 2003 21 Logické programování s omezujícími podmínkami
Kombinatorická omezení: příklady Globální omezení pro řešení kombinatorických úloh all_distinct(list) všechny proměnné různé global_cardinality(list, KeyCounts) omezení na počet prvků daného typu v seznamu pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou?- A in 1..3, B in 1..3, global_cardinality( [A,B], [1-N,2-2]). Programování s omezujícími podmínkami I, 5. prosince 2003 21 Logické programování s omezujícími podmínkami
Kombinatorická omezení: příklady Globální omezení pro řešení kombinatorických úloh all_distinct(list) všechny proměnné různé global_cardinality(list, KeyCounts) omezení na počet prvků daného typu v seznamu pro každý prvek Key-Count seznamu KeyCounts platí: Count prvků seznamu List se rovná klíči Key každé Key je celé číslo a vyskytuje se mezi klíči maximálně jednou?- A in 1..3, B in 1..3, global_cardinality( [A,B], [1-N,2-2]). A = 2, B = 2, N = 0 Programování s omezujícími podmínkami I, 5. prosince 2003 21 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... každý den: minimální a maximální počet zaměstnanců každou směnu Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... každý den: minimální a maximální počet zaměstnanců každou směnu R1 in MinRano1..MaxRano1, D1 in MinDen1..MaxDen1,... Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... každý den: minimální a maximální počet zaměstnanců každou směnu R1 in MinRano1..MaxRano1, D1 in MinDen1..MaxDen1,... global_cardinality( [PetrPo,PavelPo,MariePo,...], [1-R1,2-D1,...,5-V1] ) Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... každý den: minimální a maximální počet zaměstnanců každou směnu R1 in MinRano1..MaxRano1, D1 in MinDen1..MaxDen1,... global_cardinality( [PetrPo,PavelPo,MariePo,...], [1-R1,2-D1,...,5-V1] ) pro každého zaměstnance: minimální a maximální počet typu směny za týden Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... každý den: minimální a maximální počet zaměstnanců každou směnu R1 in MinRano1..MaxRano1, D1 in MinDen1..MaxDen1,... global_cardinality( [PetrPo,PavelPo,MariePo,...], [1-R1,2-D1,...,5-V1] ) pro každého zaměstnance: minimální a maximální počet typu směny za týden R2 in MinRano2..MaxRano2, D2 in MinDen2..MaxDen2,... Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Příklad: rozvrhování zaměstnanců vytvoření rozvrhu pro zaměstnance pracující na směny A = {R,D,N,Z,V} = {1,2,3,4,5} ráno, den, noc, záloha, volno P = {Petr,Pavel,Marie,...} W = {Po,Út,St,Čt,...} Po Út St Čt... Petr R N V R Pavel R Z R N Marie N V D D... matice doménových proměnných: PetrPo, PetrUt,..., PavelPo,... každý den: minimální a maximální počet zaměstnanců každou směnu R1 in MinRano1..MaxRano1, D1 in MinDen1..MaxDen1,... global_cardinality( [PetrPo,PavelPo,MariePo,...], [1-R1,2-D1,...,5-V1] ) pro každého zaměstnance: minimální a maximální počet typu směny za týden R2 in MinRano2..MaxRano2, D2 in MinDen2..MaxDen2,... global_cardinality( [PetrPo,PetrUt,...,PetrNe], [1-R2,2-D2,...,5-V2] ) Programování s omezujícími podmínkami I, 5. prosince 2003 22 Logické programování s omezujícími podmínkami
Labeling labeling( [] ). labeling( [Var Rest] ) :- % výběr nejlevější proměnné k instanciaci indomain( Var ), labeling( Rest ). % výběr hodnot ve vzrůstajícím pořadí Programování s omezujícími podmínkami I, 5. prosince 2003 23 Logické programování s omezujícími podmínkami
Labeling labeling( [] ). labeling( [Var Rest] ) :- % výběr nejlevější proměnné k instanciaci indomain( Var ), labeling( Rest ). % výběr hodnot ve vzrůstajícím pořadí?- X in 4..5, indomain(x). X = 4? ; X = 5? Programování s omezujícími podmínkami I, 5. prosince 2003 23 Logické programování s omezujícími podmínkami
Labeling labeling( [] ). labeling( [Var Rest] ) :- % výběr nejlevější proměnné k instanciaci indomain( Var ), labeling( Rest ). % výběr hodnot ve vzrůstajícím pořadí?- X in 4..5, indomain(x). X = 4? ; X = 5??- A in 0..2, B in 0..2, B#< A, labeling([a,b]). Programování s omezujícími podmínkami I, 5. prosince 2003 23 Logické programování s omezujícími podmínkami
Labeling labeling( [] ). labeling( [Var Rest] ) :- % výběr nejlevější proměnné k instanciaci indomain( Var ), labeling( Rest ). % výběr hodnot ve vzrůstajícím pořadí?- X in 4..5, indomain(x). X = 4? ; X = 5??- A in 0..2, B in 0..2, B#< A, labeling([a,b]). labeling( [] ). % MAC algortimus labeling( Variables ) :- select_variable( Variables, Var, Rest ), select_value( Var, Value ), ( Var #= Value, labeling( Rest ) ; Var #\= Value, labeling( Variables ) ). Programování s omezujícími podmínkami I, 5. prosince 2003 23 Logické programování s omezujícími podmínkami
Nejpoužívanější implementace CLP Swedish Institute of Computer Science: SICStus Prolog silná CLP(F D) knihovna http://www.sics.se/sicstus komerční i akademické použití pro širokou škálu platforem příklady v přednášce z této implementace :- use_module(library(clpfd)) IC-PARC, Imperial College London: ECL i PS e http://www.icparc.ic.ac.uk/eclipse široké možnosti kooperace mezi různými řešičemi: konečné domény, reálná čísla, repair akademické použití, komerční použití v rámci IC-PARC, platformy: Windows, Linux, Solaris CHIP http://www.cosytec.com knihovny dostupné pro Prolog i C++ GNU Prolog http://pauillac.inria.fr/~diaz/gnu-prolog/ GNU licence, tj. volně dostupný sw Programování s omezujícími podmínkami I, 5. prosince 2003 24 Logické programování s omezujícími podmínkami