Zadání:
Dobrovolně vybrané originální řešení programu pro luštění hlavolamu Rubikova kostka
Zadání jsem si ještě přesněji stanovil tak, že vytvořím program, který se spustí s predikátem,který přímo očekává zadání rozházené Rubikovy kostky, poté mi program vrátí postup tah po tahu jak mám hlavolam složit, a vlastně mi tím povede ruku při skládání. Věcí která je na první zamyšlení patrná je to, že ono zadávání rozložení kostky bude velmi nepříjemné a neelegantní, proto jsem již přemýšlel o propojení prologu s nějakým obvyklým jazykem, např. C#, který by vlastně obstaral příjemné rozhraní pro komunikaci s programem, ale dočetl jsem se, že žádná dobře funkční, spolehlivá cesta k tomuto cíli nevede… Takže jsem to nakonec vzdal..
Řešení:
Již na začátku psaní programu jsem přišel na to, že na rychlosti výpočtu téměř nejsem schopen nic změnit. Původní myšlenkou totiž bylo, že bych použil kompletní možné značitelné tahy, ale jak říkám rychlosti by to nepřidalo, a navíc je to pro programátora velmi nepříjemná práce definovat pohyby kostky, vyžaduje to volkou trpělivost a prostorovou představivost. Takže jsem tedy zvolil přístup, „ať Prolog počítá za mě“. A nadefinoval jsem mu jen ty nejzákladnější moznosti otáčení stran.
Dlouho jsem vybíral mezi několika moznostmi jak bude kostka reprezentovaná, nejprve jsem její rozložení chtěl ukládat ve formě seznamu hran a vrcholů, které by uchovávaly sve 2 resp. 3 barvy, protože mi přišlo, že právě manipulace s takovouto kostkou a definování otáčení tak bude snažší. S tímto přístupem jsem ale narazil na problémy, po kterých jsem ho zavrhl a obrátil jsem se k hloupějšímu způsobu uchovávání stavu kostky, je tedy reprezentována seznamem obsahujícím 6 dalších 9ti místných seznamů, kde každý reprezentuje jakoby jednu nálepku na kostce. Byl jsem si vědom, jak nešťastné řešení to je, a jeho hlavní nevýhodu a to jeho velkého množství kombinací představující nesmyslné stavy. To jsem eliminoval tzv. validační funkcí, která důsledně kontroluje, jestli kostka která byla zadána může existovat.
Největším oříškem nakonec bylo ono očekávané definování pohybů, u kterého mám obavy, že nefunguje úplně korektně stále…Ve zbytku programu mě potrápila pouze absence veškerého programátorského vybavení v Prologu, nepoužitelný debuger spíše k smíchu než k práci a mnoho nesmyslných hlášek kompilátoru a řádkověho interpretu, díky kterým se stává i hledání obyčejného překlepu naprostým peklem, ale na to si už asi u Prologu většina lidí zvykla.
Velmi vydatně mi pomohla stránka cubemania.cz, kde jsem získal mnoho cenných informací. A také má vlastní Rubikova kostka, která mi pomáhala dokreslit mou chabou prostorovou představivost.
Predikáty:
Popis predikátu je myslím dostatečně zpracován ve zdrojovém kódu formou komentářů.
Stažení:
Rubikovka.zip
Zhodnocení:
Program mi v mnohém připoměl hříčku ze skript z Prologu jménem opice a banán, a také
pro mě byla inspirací při návrhu.
Nemyslím si, že by tento program měl větší význam než tato hříčka… pravděpodobně jej nikdy nepoužiji už jen pro to, že než bych rozložení kostky napsal do predikátu, a než by to počítač spočítal, tak jí budu mít složenou několikrát… Teoreticky by bylo možné tento program využít pro hledání nových metod, triku a postupů pro skládání kostky, ale nic takového neplánuji.
neproceduralne programovani @ mff? :)
je fakt ze debugovanie atd. napr. v swi prologu je peklo - na druhej strane ked clovek napise 20 riadkov ozajstneho kodu, a vie to vyriesit rubikovu kocku - nemyslim ze to je az take zle :-) a najst sytakticku chybu tiez zase take hrozne (na tych par riadkoch) nie je...
jestli ma byt tenhle blog ta dokumentace na webu a jestli to delas na te spravne skole u toho spravneho ucitele, tak nemas sanci
okamzite oprav preklepy a davej bacha jestli je to uplne dokonala spisovna cestina i s diakritikou, to je totiz dulezitejsi nez samotny program (u toho ucitele)
ja si zazil sve, kdyz 2 kamaradi (studenti cestiny ve 4. rocniku) se slovnikem v ruce hledali co se mu tam nelibi a pak mi rekli ze tam zadnou chybu ani slohovou nemam
| potrápila pouze absence veškerého
| programátorského vybavení v Prologu,
| nepoužitelný debuger spíše k smíchu
| než k práci
Nechapu, jak muzes mluvit o debugeru Prologu, kdyz Prolog je jen formalni jazyk. Debuger muze mit az nejaky interpret Prologu (pravdepodobne v kombinaci s nejakym IDEckem). Ten graficky v SWI Prologu je celkem nice.
[5] a [9]
To zadani moc dobre znam a po precteni mi bylo jasne ze zapocet nemuze dostat, proto jsem mu chtel poradit aby mel sanci, pokud to ucitel jeste nevidel, dostat zapocet na prvni pokus.
Pomlouvat jsem nikoho nechtel, myslim ze to dokazuje, ze jsem nikoho nejmenoval (ani skolu ani ucitele)
Posledni vec a to odpoved pro tebe:
On mi do mailu napsal vety co se mu nelibi, byly dobre, jen napsane trochu jinak. Take jsem se ho nebal, kdyby jo tak mu odkyvam, ze ma pravdu a ze ja jsem debil, ja se ale hajil, cimz jsem si nabehnul na obvineni z "manipulacniho jednani" (ve skutecnosti to bylo zoufalstvi, protoze jsem nechapal co po me chce) a pohovor u nej v praci, kde uz jsem jen kyval hlavou a dostal zapocet.
A ted bych tohle ukoncil, ja se nechtel bavit o mych studentskych letech ale jen poradit jednomu studentovi.