Programovani II-zapoctove priklady

Zpatky na stranku Vyuka
Back to
Teaching Page

Zapoctove programy z Prologu (Programování II)

[rozdeleni] [zadani]

zimní semestr 2001/2002
Ut 12.20 - 13.50 T5
Roman Barták

Zápoètové pøíklady je možné posílat jen do pátku 20.9.2002 do 24:00 SEÈ, øešení zaslaná pozdìji už nebudu pøijímat (jen opravy)!!!!!

Kompletni reseni prikladu muzete zasilat elektronicky na adresu bartak@kti.mff.cuni.cz nebo odevzdat osobne v konzultacni hodiny.

Reseni zapoctoveho prikladu se sklada z:

  1. dokumentace obsahujici
    • jmeno autora
    • presne zadani prikladu
    • slovni popis pouziteho algoritmu
    • popis datovych struktur
    • popis spousteni programu vcetne tvaru vstupnich a vystupnich dat
  2. komentovaneho textu programu ve standardním (ISO) Prologu
    • program je resen jako predikat se vstupnimi a vystupnimi argumenty! veskere I/O operace (tisk vysledku) jsou jen jako nadstavba
    • pouzivate-li nadefinovane predikaty (member, append ...), uvedte v samostatnem souboru jejich seznam, vyznam a je-li potreba implementaci; rozhodne nepouzivejte predikaty specificke jen pro danou implementaci Prologu
    • program musi byt spustitelny v prostredi BinProlog, ECLiPSe, Sicstus Prolog nebo Open Prolog!
  3. primerene velkych zkusebnich dat (pripadne generatoru zkusebnich dat, neni-li v zadani specifikovano jinak).

Pokud bude nektera z popsanych nalezitosti chybet, nebude zapoctovy program prijat!!!
Jakekoliv nejasnosti v zadani se mnou okamzite konzultujte, at si vyhnete pripadnemu predelavani programu.


Polynomy

Polynomy lze reprezentovat (nejen v Prologu) nekolika zpusoby, ktere lze rozdelit do nasledujicich skupin:

A) podle mnozstvi uvedenych koeficientu (Pr. x^3+2*x)
A.1) ridky tvar - jsou uvedeny pouze nenulove koeficienty s prislusnou mocninou u promenne/promennych (Pr. [[2,1],[1,3]])
A.2) husty tvar - jsou uvedeny vsechny koeficienty v rostoucim/klesajicim poradi (Pr. [0,2,0,1])
B) podle zpusobu shlukovani promennych
B.1) rekurzivni tvar - polynom vice promennych je vyjadren jako polynom jedne promenne, jehoz koeficienty jsou obdobne polynomy v ostatnich promennych
B.2) distributivni tvar - polynom je zapsan jako soucet termu, z nichz kazdy je tvoren soucinem koeficientu a promennych
 
Ridky rekurzivní zápis
Je dan libovolne uzavorkovany vyraz s celymi cisly, promennymi (reprezentovany atomy), operacemi +, -, *, ^ (mocnina je pouze na prirozena cisla) a seznam promennych urcujici jejich dulezitost (napr. [x,y] znamena, ze hlavni polynom je v promenne x a jeho koeficienty v promenne y). Vytvorte program, ktery prevede polynom do ridkeho rekurzivniho zapisu, a vytvorte program, ktery vraci ridky rekurzivni zapis v "lidskem" tvaru, tj. pomoci operaci +, -, *, ^ bez zbytecnych nul, jednicek apod.
 
Ridky distributivní zápis
dtto, ale prevod do ridkeho distributivniho zapisu
 
Husty rekurzivní zápis
dtto, ale prevod do husteho rekurzivního zápisu
 
Husty distributivní zápis
dtto, ale prevod do hustého distributivního zápisu


Hradlové síte

Hradlova sít je mnozina hradel, kde kazde hradlo ma jediny vystup, sve jedinecne jmeno, operaci a seznam vstupu (v danem poradi). Vstupem jsou bud jmena jinych hradel nebo jmena vstupnich bodu site. Sit je acyklicka, tj. zadne hradlo nezavisi na svem vystupu. Vysledek hradla se posila na vsechny vstupy daneho jmena (muze jich byt i vice).

Priklad: Hradlova sit pro vyraz x*y+z+x muze vypadat takto: [h(h(1),plus,[h(2),z,x]),h(h(2),krat,[x,y]), kde h(1) a h(2) jsou jmena hradel a x, y, z jsou jmena vstupnich bodu site.

Prevod vyrazu na hradlovou sít (prilis lehke)
Vstupem programu je dany vyraz v podobe prologovskeho termu s cisly, identifikatory, operacemi +, *, -, / a libovolnymi funkcemi, napr. 2*a+cos(b)/sin(b). Vytvorte k danemu vyrazu hradlovou sit, ktera vyraz pocita stejnym zpusobem, jako je zadan, tj. bez optimalizaci. K dispozici jsou hradla s operacemi plus, times, minus, div a prislusnymi funkcemi. Hradla s operacemi plus a times mohou mit libovolny pocet vstupu a jejich vstupem nesmi byt vysledek stejne operace.
 
Optimalizace hradlove site (hledaní ekvivalencí)
Je dana hradlova sit. Najdete v ni vsechna ekvivalentni hradla a vytvorte novou sit, ve ktere jsou vsechna navzajem ekvivalentni hradla nahrazena jednim z nich.
Def.: Hradla v siti jsou ekvivalentni, pokud maji stejnou operaci a ekvivalentni nebo shodne vstupy.
 
Vypocet hradlove site (s externe zadanymi procedurami)
Je dana hradlova sit a externi procedury pro vypocet vystupu hradel (jejich jmena se shoduji s operacemi v hradlech a maji vzdy dva argumenty: seznam vstupu a vystup, napr. plus([1,2,3],X)). Napiste program, ktery provede vypocet hradlove site, jsou-li znamy hodnoty vstupnich bodu.
 
Kompilace hradlove site (s externe zadanymi procedurami)
Je dana hradlova sit a externi procedury pro vypocet vystupu hradel (jejich jmena se shoduji s operacemi v hradlech a maji vzdy dva argumenty: seznam vstupu a vystup, napr. plus([1,2,3],X)). Napiste program, ktery vygeneruje kód pocitajici hradlovou sit, napr. plus([1,2,3],X),krat([1,2],Y),plus([X,Y],Z]), jsou-li znamy hodnoty vstupnich bodu.
 
Linearizace hradlové síte + lokalizace registru
Je dana hradlova sit. Vytvorte program, ktery:
a) usporada hradla tak, aby se kazde hradlo nachazelo az za hradly, ktera pocitaji jeho vstupy
b) priradi vstupnim bodum site a vystupum hradel co nejmensi pocet "registru CPU". Dany registr je mozne opakovane pouzit, musi byt ale vzdy odlisny od registru prirazenych vstupum hradla.


Barvení grafu (splnovaní podmínek)

Je dan graf, ve kterem vrcholy odpovidaji promennym s domenami (obory hodnot) a hrany jsou oznaceny jmenem podminky mezi promennymi. Obarvete graf, tj. priradte kazde promenne hodnotu z jeji domeny tak, aby byly splneny vsechny podminky. Navrhnete vlastni reprezentaci grafu a vytvorte generator, ktery pripravi graf pro reseni problemu N-dam.

Dopredna kontrola (forward checking)
Po "obarveni" vrcholu se z domen vsech okolnich vrcholu vyradi nekonzistentni hodnoty, viz Constraint Propagation.
 
Pohled dopredu (look ahead)
Po "obarveni" vrcholu se z domen vsech okolnich vrcholu vyradi nekonzistentni hodnoty, viz. Constraint Propagation.
 
Lokalni prohledavani s Tabu seznamem
Nejprve se "nahodne" obarvi vsechny vrcholy. Pokud existuje nejaky vrchol, ktery je v konfliktu se svym okolim (neni splnena podminka na hrane), program najde pro tento vrschol jinou barvu tak, aby se konflikt zmensil. Pro odstraneni lokalniho minima pouzijte techniku Tabu seznamu (viz Heuristics and Stochastic Algorithms).
 
Back-jumping (inteligentní navracení)
Barvení se provádí podobne jako pri backtrackingu, ale program se pri nalezeni nekonzistence nevraci pouze o jednu uroven, ale vraci se az na uroven, ktera nekonzistenci zpusobila.


Hricky

NIM (prilis lehke)
Je dano N hromadek zapalek, ze kterych stridave odebiraji dva hraci tak, ze mohou odebrat libovolny pocet zapalek z jedne hromadky. Vyhrava ten, kdo odebral posledni zapalku. Napiste program, ktery hleda optimalni strategii pro jednoho hrace.
 
NIM (varianta)
Je dano N hromadek zapalek, ze kterych stridave odebiraji dva hraci tak, ze mohou odebrat libovolny pocet zapalek z jedne hromadky pripadne odebrat stejny pocet zapalek ze dvou hromadek. Vyhrava ten, kdo odebral posledni zapalku. Napiste program, ktery hleda optimalni strategii pro jednoho hrace.
 
Prelevani vody
Je dano N nadob, jejich objem, pocatecni naplneni a koncove naplneni. Vytvorte program, ktery najde nejkratsi posloupnost preliti vedouci z pocatecniho stavu do koncoveho stavu.
 
Prelevani vody se zdrojem a kanalem
dtto, ale k dispozici je navic nevycerpatelny zdroj vody a nepreplnitelny kanal.
 
Lloydova 15 (moc lehke na zapoctak)
Ve ctverci N*N je N*N-1 kosticek a jedno volne pole. Vytvorte program, ktery slozi kosticky tak, aby byly usporadane.
 
Vazeni
Je dáno N identickych predmetu. Nejvyse jeden z techto predmetu je vadny, coz se pozna podle jeho mensi resp. vetsi hmotnosti (nevite, ktera varianta plati). Napiste program, ktery pro dane N zjisti nejmensi pocet vazeni na rovnoramennych vahach, tak aby se zjistilo, ktery predmet je vadny a zda je tezsi nebo lehci nez ostatni. Program take vrati doporuceny postup vazeni.
 
Zebra
Napiste program, ktery je schopen resit ulohy typu Zebra (napr. jsou ctyri domy, v kazdem bydli jeden clovek majici nejake zamestnani a auto a jsou dany podminky typu "doktor jezdi v mercedesu" apod., najdete prislusne rozlozeni obyvatel domu).
  
Mastermind (Logik)
Napiste program, ktery resi hru Mastermind (pocet policek a barev je vstupnim parametrem) sofistikovanym zpusobem, tj. ne prohledavanim vsech alternativ. K dispozici by mely byt dve varianty programu, jedna umoznuje zadavat ohodnoceni zvenku (rucne), druha ohodnocuje automaticky podle zadaneho vzoru.
  
Sachova koncovka
Napiste program, ktery resi sachovou koncovku s kralem a vezi.
  
Ortogonalni latinske ctverce (moc lehke na zapoctak)
Latinsky ctverec radu n obsahuje cisla 1 az n, kazde n krat, rozmistene tak, ze v zadnem sloupci ani radku se zadne cislo nevyskytuje dvakrat. Ortogonalni latinsky ctverec obsahuje dvojice cisel <i,j>, 1=<i,j<=n, kazdou jedenkrat, tak, ze v prvni i druhe slozce tvori latinsky ctverec.
Naprogramujte generovani ortogonalniho latinskeho ctverce daneho radu tak, aby se co nejdrive vyloucily nevyhovujici moznosti (tj. ne jednoduchy backtracking, ale napriklad dopredna kontrola).
  
Obecné hledání optimální (herní) strategie
Je dana hra dvou hracu (pri hre se stridaji), ktera je definovana procedurami mozny_tah, vitezna_pozice apod. Napiste program, ktery hraje optimalni hru za jednoho z hracu.


Rozvrhování a plánování

Letiste
Je dana mnozina typu letadel a pro kazdy typ letadla je dan seznam stojanek, u kterych muze stat. Na kazde stojance muze v dany cas stat pouze jedno letadlo, s vyjimkou stojanky "volna plocha", na ktere muze stat libovolne mnoho letadal (existuji ale letadla, ktere nemohou stat na volne plose - napr. Concorde). Dale je dan letovy plan, tj. seznam letadal s urcenim jejich typu, doby priletu a odletu. Napiste program, ktery rozvrhne letadla na jednotlive stojanky tak, aby co nejvice letadel bylo obhospodareno stojankami (tj. ne na volne plose). Letiste je definovano mnozinou vsech stojanek.
 
Alokace pultu na letisti
Letiste je popsano jako mnozina pultu, ktere jsou po nekolika sdruzeny do "ostrovu". Dale je dan letovy rad, kde je u kazdeho letu zadan cas odbaveni (iterval od-do) a pocet pultu, ktere jsou potreba. Napiste program, ktery provede rozmisteni pultu pro lety tak, ze vsechny pulty daneho letu se nachazeji ve stejnem ostrove.
 
Nemocnice
Je dana mnozina sester, kazda sestra ma prirazenu mnozinu cinnosti, ktere muze vykonavat (kvalifikaci). Dale je dan rozvrh pozadavku na cinnosti v danem casovem obdobi. Napiste program, ktery vytvori rozvrh pro konkretni sestry tak, aby pozadavky byly naplneny a pritom zadna sestra neslouzila dele jak tri smeny za sebou.
 
Vyrobni podnik
Je dana mnozina stroju a mnozina produktu. Kazdemu produktu je prirazena mnozina stroju a doba, za kterou dany stroj produkt vyrobi. Dale je dana mnozina preferenci rikajicich, jaky produkt musi byt vyroben pred jinym produktem. Napiste program, ktery naplanuje vyrobu tak, aby trvala co nejkratsi dobu.
 
Reklamy
Je dana sada reklam a u kazde reklamy je zadan interval, ve kterem musi byt vysilana. Spojite za sebou smi byt promitnuto jen M reklam a mezi reklamnimi bloky musi byt minimalne N volnych casovych jednotek. Napiste program, ktery provede rozvrzeni reklam.
 
Obchodní cestující
Je dán graf, ve kterem vrcholy predstavuji mesta a hrany jsou ohodnoceny casem nutnym pro cestu mezi dvema mesty. Kazdemu mestu/vrcholu je prirazena dvojice: delka jednani a interval, ve kterem musi jednani probehnout. Vytvorte program, ktery najde cestu obchodniho cestujiciho zacinajici a koncici v danem meste tak, ze se zucastni vsech jednani.


Omezující podmínky

Reseni aritmetickych podmínek
Je dana mnozina promennych a jejich domen ve tvaru a::[1, 5..10] (definujte prislusne operatory). Dale je dan seznam linearnich aritmetickych podminek s rovnostmi (=) a nerovnostmi (\=) napr. a+2*b=c. Vytvorte program, ktery nejprve zredukuje domeny promennych propagaci pres podminky (napr. a::[1..5], b::[1..5], a+1=b prejde na a::[1..4], b::[2..5]) a nasledne najde reseni podminek, tj. omezi vsechny domeny na jeden prvek (dalsi reseni vyda pomoci backtrackingu).
 
Reseni aritmetickych podmínek 2 (algebrogramy)
Je dana mnozina promennych a jejich domen ve tvaru a::[1, 5..10] (definujte prislusne operatory). Dale je dan seznam aritmetickych podminek s rovnostmi (=) a operacemi +, -, *, napr. a+a*b=c, a podminky ve tvaru alldiff([a,b,c]) zarucujici ruznost promennych. Vytvorte program, ktery nejprve zredukuje domeny promennych propagaci pres podminky (napr. a::[1..5], b::[1..5], a+1=b prejde na a::[1..4], b::[2..5]) a nasledne najde reseni podminek, tj. omezi vsechny domeny na jeden prvek (dalsi reseni vyda pomoci backtrackingu).
 
Obecne reseni podminek
Je dana mnozina promennych a jejich domen (napr. jako v predchozim priklade). Dale je dan seznam podminek ve tvaru constr(SeznamPromennych,Reduktor), kde Reductor je nazev predikatu slouziciho pro redukci domen promennych pri zmene domeny nektere promenne ze SeznamuPromennych. Kazdy Reduktor ma dva argumenty, prvni je seznam vstupnich domen promennych (v danem poradi) a druhy (ten se pocita) je seznam redukovanych domen (mohou byt i prazdne). Napiste program, ktery nejprve maximalne zredukuje domeny promennych pomoci reduktoru a potom najde reseni podminek, tj. omezi vsechny domeny na jeden prvek, pripadne zjisti, ze podminky nelze vyresit. Pro vyzkouseni navrhnete vlastni reduktory.
 
Binarizace podmínek
Je dana mnozina promennych a jejich konecnych domen (napr. jako v predchozich prikladech). Dale je dan seznam podminek ve tvaru constr(SeznamPromennych,Podminka), kde Podminka je predikat, ktery testuje, zda je podminka splnena pri danych hodnotach promennych, napr. constr([x,y],'=') pouziva test xa=yb (xa je hodnota promenne x, yb hodnota y). Navrhnete program, ktery danou sadu podminek prevede na ekvivalentni seznam binarnich podminek.
 
Kompilace podminek
Je dana sada podmínek ve tvaru constr(SeznamPromennych,PopisZavislosti), kde PopisZavislosti je seznam trojic: nazev prevodni funkce, vstupni promenne, vystupni promenne. Prevodni funkce ma dva argumenty, prvni argument je vstupni a obsahuje seznam hodnot vstupnich promennych, druhy argument je vystupni (je pocitan) a obsahuje seznam hodnot vystupnich promennych (napr.: constr([a,b,c],[[plus,[a,b],[c]],[minus,[c,a],[b]],[minus,[c,b],[a]]]) je zachycenim podminky a+b=c). Vytvorte program, ktery jako vstup dostane seznam podmínek a seznam vstupnich promennych a jako vystup vyda prologovsky cil skladajici se z volani prevodnich funkci, ktery resi danou soustavu podminek.
 
Reseni linearnich podminek eliminaci
Je dana mnozina promennych a mnozina linearnich rovnosti a nerovnosti nad temito promennymi. Napiste program, ktery resi podminky postupnou eliminaci promennych (podobne jako pri symbolickem reseni soustav rovnic a nerovnic pomoci Gaussovy a Fourierovy eliminace).


Ostatní

Prepisovaci pravidla
Je dana sada prepisovacich pravidel tvaru Vzor<=>Prepis|Straz a Vzor=>Pridej|Straz, kde Vzor a Prepis jsou seznamy termu a Straz je prologovsky cil, ktery muze pripadne chybet (pr.: [X<=Y,Y<=Z]=>[X<=Z] nebo [X<=X]<=>[]). Interpretace pravidel je nasledujici: je-li vzor nalezen ve vstupnim seznamu predikatu a je-li splnena Straz, potom
a) v pripade <=> je vzor nahrazen seznamem Prepis
b) v pripade => je pridan seznam Pridej.
Napiste program, ktery prevede seznam termu na redukovany seznam termu aplikaci vsech moznych prepisovacich pravidel.
 
Analyza vyrazu s operatory
Vstupem programu je seznam definic operatoru ve tvaru op(Priorita,Asoc,Nazev) a seznam tokenu (atomy, cisla a zavorky). Analyzujte posloupnost tokenu podle operatoru a prevedte ji do struktury prologovskeho termu.
Napr.: ?-analyzuj([op(4,yfx,plus),op(2,yfx,times)],[a,plus,b,times,c],X).
vraci: X = plus(a,times(b,c))
 
Splnitelnost logickeho vyrazu
Je dan logicky vyraz se spojkami and, or, not, xor, impl, equiv (definujte pomoci operatoru) obsahujici logicke konstanty true, false a promenne (reprezentovane atomy). Vytvorte program, ktery rozhodne, zda je zadany vyraz pravdivy resp. splnitelny, pripadne vyda nutne ohodnoceni promennych tak, aby byl vyraz splnen.
Napr.: ?-sat((x or not x) and y, R). vraci R=[y/true]


[rozdeleni] [zadani]