Rubikova kostka v Prologu

12. 2. 2008 2:35 (aktualizováno) pita601

Zadání:

  • originální řešení
  • vlastní zadání
  • použití rekurzí
  • délka min 3–5kB
  • přehledný kód s komentářem
  • dokumentace na WEBu
    1. zadání
    2. popis problematiky zadání
    3. popis řešení
    4. popis predikátů
    5. ukázka volání s konkrétními hodnotami a výsledky
    6. zhodnocení pracnosti, efektivity výpočtu, elegance programu, použitého řešení atp.

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.

Co si myslíte o programovacím jazyce Prolog má nějaký smysl se ho učit, nebo se ho snažit protlačit do praxe?

Sdílet