Cvičení 7 SEMESTRÁLNÍ ÚLOHY S PROGRAMY V PROLOGU (zadání úloh) 1. Polynomy Návod: Polynomy lze reprezentovat (nejen v Prologu) několika způsoby, které lze rozdělit do následujících skupin: A) podle množství uvedených koeficientů (př. x^3+2*x) A.1) řídký tvar jsou uvedeny pouze nenulové koeficienty s příslušnou mocninou u proměnné/proměnných (př. [[2,1],[1,3]]) A.2) hustý tvar jsou uvedeny všechny koeficienty v rostoucím/klesajícím pořadí (př. [0,2,0,1]) B) podle způsobu shlukování proměnných B.1) rekurzivní tvar polynom více proměnných je vyjádřen jako polynom jedné proměnné, jehož koeficienty jsou obdobné polynomy v ostatních proměnných B.2) distributivní tvar polynom je zapsán jako součet termů, z nichž každý je tvořen součinem koeficientů a proměnných Úloha 1a: Řídký rekurzivní zápis Je dán libovolně uzávorkovaný výraz s celými čísly, proměnnými (reprezentovány atomy), operacemi +, -, *, ^ (mocnina je pouze na přirozená čísla) a seznam proměnných určující jejich důležitost (např. [x,y] znamená, že hlavní polynom je v proměnné x a jeho koeficienty v proměnné y ). Vytvořte program, který převede polynom do řídkého rekurzivního zápisu, a vytvořte program, který vrací řídký rekurzivní zápis v "lidském" tvaru, tj. operacemi +, -, *, ^ bez zbytečných nul, jedniček apod. Úloha 1b: Řídký distributivní zápis dtto, ale převod do řídkého distributivního zápisu Úloha 1c: Hustý rekurzivní zápis dtto, ale převod do hustého rekurzivního zápisu Úloha 1d: Hustý distributivní zápis dtto, ale převod do hustého distributivního zápisu 2. Barvení grafu (splňování podmínek) Je dán graf, ve kterém vrcholy odpovídají proměnným s doménami (obory hodnot) a hrany jsou označeny jménem podmínky mezi proměnnými. Obarvěte graf, tj. přiřaďte každé proměnné hodnotu z její domény tak, aby byly splněny všechny podmínky. Navrhněte vlastní reprezentaci grafu a vytvořte generátor, který připraví graf pro řešení problému N-dam. Úloha 2a: Dopředná kontrola (forward checking) Po "obarvení" vrcholu se z domén všech okolních vrcholů vyřadí nekonzistentní hodnoty, viz Constraint Propagation.
Úloha 2b: Pohled dopředu (look ahead) Po "obarvení" vrcholu se z domén všech okolních vrcholů vyřadí nekonzistentní hodnoty, viz Constraint Propagation. Úloha 2c: Lokální prohledávání s Tabu seznamem Nejprve se "náhodně" obarví všechny vrcholy. Pokud existuje nějaký vrchol, který je v konfliktu se svým okolím (není splněna podmínka na hraně), program najde pro tento vrchol jinou barvu tak, aby se konflikt zmenšil. Pro odstranění lokálního minima použijte techniku Tabu seznamu (viz Heuristics and Stochastic Algorithms). Úloha 2d: Back-jumping (inteligentní navracení) Barvení se provádí podobně jako při backtrackingu, ale program se při nalezení nekonzistence nevrací pouze o jednu úroveň, ale vrací se až na úroveň, která nekonzistenci způsobila. 3. Hříčky Úloha 3a: NIM (lehká varianta) Je dáno N hromádek zápalek, ze kterých střídavě odebírají dva hráči tak, že mohou odebrat libovolný počet zápalek z jedné hromádky. Vyhrává ten, kdo odebral poslední zápalku. Napište program, který hledá optimální strategii pro jednoho hráče. Úloha 3b: NIM (těžší varianta) Je dáno N hromádek zápalek, ze kterých střídavě odebírají dva hráči tak, že mohou odebrat libovolný počet zápalek z jedné hromádky, případně odebrat stejný počet zápalek ze dvou hromádek. Vyhrává ten, kdo odebral poslední zápalku. Napište program, který hledá optimální strategii pro jednoho hráče. Úloha 3c: Přelévání vody Je dáno N nádob, jejich objem, počáteční naplnění a koncové naplnění. Vytvořte program, který najde nejkratší posloupnost přelití vedoucí z počátečního stavu do koncového stavu. Úloha 3d: Přelévání vody se zdrojem a kanálem dtto, ale k dispozici je navíc nevyčerpatelný zdroj vody a nepřeplnitelný kanál. Úloha 3e: Lloydova 15 Ve čtverci N*N je N*N-1 kostiček a jedno volné pole. Vytvořte program, který složí kostičky tak, aby byly uspořádané. Uspořádání vhodně zvolte. Úloha 3f: Vážení Je dáno N identických předmětů. Nejvýše jeden z těchto předmětů je vadný, což se pozná podle jeho menší, resp. větší, hmotnosti (nevíte, která varianta platí). Napište program, který pro dané N zjistí nejmenší počet vážení na rovnoramenných vahách tak, aby se zjistilo, který předmět je vadný a zda je těžší nebo lehčí než ostatní. Program také vrátí doporučený postup vážení.
Úloha 3g: Zebra Napište program, který je schopen řešit úlohy typu Zebra (např. jsou čtyři domy, v každém bydlí jeden člověk mající nějaké zaměstnání a auto a jsou dány podmínky typu "doktor jezdí v mercedesu" apod.; najděte příslušné rozložení obyvatel domu). Úloha 3h: Mastermind (Logik) Napište program, který řeší hru Mastermind (počet políček a barev je vstupním parametrem) sofistikovaným způsobem, tj. ne prohledáváním všech alternativ. K dispozici by měly být dvě varianty programu; jedna umožní zadávat ohodnocení zvenku (ručně), druhá ohodnocuje automaticky podle zadaného vzoru. Úloha 3i: Ortogonální latinské čtverce Latinský čtverec řádu n obsahuje čísla 1 až n, každé n krát, rozmístěné tak, že v žádném sloupci ani řádku se žádné číslo nevyskytuje dvakrát. Ortogonální latinský čtverec obsahuje dvojice čísel <i, j>, 1=<i, j<=n, každou jedenkrát, tak, že v první i druhé složce tvoří latinský čtverec. Naprogramujte generování ortogonálního latinského čtverce daného řádu tak, aby se co nejdříve vyloučily nevyhovující možnosti (tj. ne jednoduchý backtracking, ale například dopředná kontrola). Úloha 3j: Obecné hledání optimální (herní) strategie Je dána hra dvou hráčů (při hře se střídají), která je definována procedurami mozny_tah, vitezna_pozice apod. Napište program, který hraje optimální hru za jednoho z hráčů. 4. Rozvrhování a plánování Úloha 4a: Letiště Je dána množina typu letadel a pro každý typ letadla je dán seznam stojánek, u kterých může stát. Na každé stojánce může v daný čas stát pouze jedno letadlo, s výjimkou stojánky "volná plocha", na které může stát libovolně mnoho letadel (existují ale letadla, která nemohou stát na volné ploše např. Concorde). Dále je dán letový plán, tj. seznam letadel s určením jejich typu, doby příletu a odletu. Napište program, který rozvrhne letadla na jednotlivé stojánky tak, aby co nejvíce letadel bylo obhospodařeno stojánkami (tj. ne na volné ploše). Letiště je definováno množinou všech stojánek. Úloha 4b: Alokace pultu (odbavovací přepážky) na letišti Odbavovací přepážky na letišti jsou popsány jako množina pultů, které jsou po několika sdruženy do "ostrovů". Dále je dán letový řád, kde je u každého letu zadán čas odbavení (interval od-do) a počet pultů, které jsou potřeba. Napište program, který provede rozmístění pultů pro lety tak, že všechny pulty daného letu se nacházejí ve stejném ostrově. Úloha 4c: Nemocnice Je dána množina sester, každá sestra má přiřazenu množinu činnosti, které může vykonávat (kvalifikaci). Dále je dán rozvrh požadavků na činnosti v daném časovém období. Napište program, který vytvoří rozvrh pro konkrétní sestry tak, aby požadavky byly naplněny a přitom žádná sestra nesloužila déle jak tři směny za sebou.
Úloha 4d: Výrobní podnik Je dána množina strojů a množina produktů. Každému produktu je přiřazena množina strojů a doba, za kterou daný stroj produkt vyrobí. Dále je dána množina preferenci říkajících, jaký produkt musí být vyroben před jiným produktem. Napište program, který naplánuje výrobu tak, aby trvala co nejkratší dobu. Úloha 4e: Reklamy Je dána sada reklam a u každé reklamy je zadán interval, ve kterém musí být vysílána. Spojitě za sebou smi byt promítnuto jen M reklam a mezi reklamními bloky musí být minimálně N volných časových jednotek. Napište program, který provede rozvržení reklam. Úloha 4f: Obchodní cestující Je dán graf, ve kterém vrcholy představují města a hrany jsou ohodnoceny časem nutným pro cestu mezi dvěma městy. Každému městu/vrcholu je přiřazena dvojice: délka jednání/obsluhy a interval, ve kterém musí jednání/obsluha proběhnout. Vytvořte program, který najde cestu obchodního cestujícího začínající a končící v daném městě tak, že se zúčastní všech jednání. 5. Omezující podmínky Úloha 5a: Řešení aritmetických podmínek Je dána množina proměnných a jejich domén ve tvaru a::[1, 5..10] (definujte příslušné operátory). Dále je dán seznam lineárních aritmetických podmínek s rovnostmi (=) a nerovnostmi (\=), např. a+2*b = c. Vytvořte program, který nejprve zredukuje domény proměnných propagací přes podmínky (např. a::[1..5], b::[1..5], a+1=b přejde na a::[1..4], b::[2..5]) a následně najde řešení podmínek, tj. omezí všechny domény na jeden prvek (další řešení metoda vydá backtrackingem). Úloha 5b: Řešení aritmetických podmínek 2 (algebrogramy) Je dána množina proměnných a jejich domén ve tvaru a::[1, 5..10] (definujte příslušné operátory). Dále je dán seznam aritmetických podmínek s rovnostmi (=) a operacemi +, -, *, např. a+a*b = c, a podmínky ve tvaru alldiff([a,b,c]) zaručující různost proměnných. Vytvořte program, který nejprve zredukuje domény proměnných propagací přes podmínky (např. a::[1..5], b::[1..5], a+1=b přejde na a::[1..4], b::[2..5]) a následně najde řešení podmínek, tj. omezí všechny domény na jeden prvek (další řešení metoda vydá backtrackingem). Úloha 5c: Obecné řešení podmínek Je dána množina proměnných a jejich domén (např. jako v předchozím příkladu). Dále buď dán seznam podmínek ve tvaru constr(seznampromennych,reductor), kde Reductor je název predikátu sloužícího pro redukci domén proměnných při změně domény některé proměnné ze SeznamuPromennych. Každý Reductor má dva argumenty, první je seznam vstupních domén proměnných (v daném pořadí) a druhý (ten se počítá) je seznam redukovaných domén (mohou byt i prázdné). Napište program, který nejprve maximálně zredukuje domény proměnných pomocí reduktoru a potom najde řešení podmínek, tj. omezí všechny domény na jeden prvek, případně zjistí, že podmínky nelze vyřešit. Pro vyzkoušení navrhněte vlastní reduktory.
Úloha 5d: Binarizace podmínek Je dána množina proměnných a jejich konečných domén (např. jako v předchozích příkladech). Dále je dán seznam podmínek ve tvaru constr(seznampromennych,podminka), kde Podminka je predikát, který testuje, zda je podmínka splněna při daných hodnotách proměnných, např. constr([x,y],'=') používá test x a = y b (x a je konkrétní hodnota proměnné x, y b je konkrétní hodnota y). Navrhněte program, který danou sadu podmínek převede na ekvivalentní seznam binárních podmínek. Úloha 5e: Kompilace podmínek Je dána sada podmínek ve tvaru constr(seznampromennych,popiszavislosti), kde PopisZavislosti je seznam trojic: název převodní funkce, vstupní proměnné, výstupní proměnné. Převodní funkce má dva argumenty, první argument je vstupní a obsahuje seznam hodnot vstupních proměnných, druhý argument je výstupní (je počítán) a obsahuje seznam hodnot výstupních proměnných (např.: constr([a,b,c],[[plus,[a,b],[c]],[minus,[c,a],[b]],[minus,[c,b],[a]]]) je zachycením podmínky a+b = c). Vytvořte program, který jako vstup dostane seznam podmínek a seznam vstupních proměnných a jako výstup vydá prologovský cíl skládající se z volání převodních funkcí, který řeší danou soustavu podmínek. Úloha 5f: Řešení lineárních podmínek eliminací Je dána množina proměnných a množina lineárních rovností a nerovností nad těmito proměnnými. Napište program, který řeší podmínky postupnou eliminací proměnných (podobně jako při symbolickém řešení soustav rovnic a nerovnic pomocí Gaussovy a Fourierovy eliminace). 6. Ostatní Úloha 6a: Přepisovací pravidla Je dána sada přepisovacích pravidel tvaru Vzor => Prepis Straz a Vzor => Pridej Straz, kde Vzor a Prepis jsou seznamy termu a Straz je prologovský cíl, který může případně chybět (př.: [X <= Y, Y <= Z] => [X <= Z] nebo [X <= X] <=> [] ). Interpretace pravidel je následující: je-li vzor nalezen ve vstupním seznamu predikátů a je-li splněna Straz, potom a) v případě <=> je vzor nahrazen seznamem Prepis b) v případě => je přidán seznam Pridej. Napište program, který převede seznam termů na redukovaný seznam termů aplikací všech možných přepisovacích pravidel. Úloha 6b: Analýza výrazů s operátory Vstupem programu je seznam definic operátorů ve tvaru op(priorita,asoc,nazev) a seznam tokenů (atomy, čísla a závorky). Analyzujte posloupnost tokenů podle operátorů a převeďte ji do struktury prologovského termu. Např.:?-analyzuj([op(4,yfx,plus),op(2,yfx,times)],[a,plus,b,times,c],X). vrací: X = plus(a,times(b,c)).
Úloha 6c: Splnitelnost logického výrazu Je dán logický výraz se spojkami and, or, not, xor, impl, equiv (definujte pomocí operátorů) obsahující logické konstanty true, false a proměnné (reprezentované atomy). Vytvořte program, který rozhodne, zda je zadaný výraz pravdivý, resp. splnitelný, případně vydá nutné ohodnoceni proměnných tak, aby byl výraz splněn. Např.:?-sat((x or not x) and y, R). vrací R=[y/true]