3. kodused ülesanded

Üldinfo

Lahenduste esitamise tähtaeg on 19.12. Lahendused saata mailiga aadressil varmo@cs.ut.ee või nestra@cs.ut.ee (vastavalt sellele, kelle praktikumirühmas olete); kirja teemaks peab olema fpkodu3.

Seekord on ainult üks ülesanne, mille eest on võimalik saada kuni 10 punkti. Hilinenud lahenduste korral väheneb punktisumma 20% iga hilinenud nädala kohta. Näiteks kui lahendus on väärt 10 punkti, aga jõuab meieni 21.12 (s.o kaks päeva hiljem), siis on tegelik punktisumma 10 * 0.8 = 8.

Vormistamisest

Lahendus tuleb vormistada ühe Haskelli failina. Faili nimi peab olema FPKodu3.hs ning seal defineeritava mooduli nimi FPKodu3. Faili algusse tuleb lisada kommentaaridena kõigi rühmaliikmete nimed (rühmas võib olla maksimaalselt 4 liiget, kusjuures kõigil peab olema sama praktikumijuhendaja) ja meiliaadressid. Kõigi alamülesannete puhul peavad muutujanimed ja nende tüübid vastama täpselt ülesandes nõutule. Lahendused peavad olema loetavad ja piisavalt kommenteeritud (sh abifunktsioonide mõte peab olema selgelt välja toodud).

Näiteks (FPKodu3.hs):

module FPKodu3 (
         Player (..),
         showMove, readMove, initPosition, getPlayer,
         Move (), Position,
         move, allMoves, value
       ) where

---------------------------------------------------------------------
-- FPKodu3.hs
-- Funktsionaalprogrammeerimise meetod - 3. koduülesande lahendus
--
-- Autorid:
--          Jaan    Tatikas   (tatikas@ut.ee)
--          Salomon Vesipruul (salomon@ut.ee)
---------------------------------------------------------------------

Ülesanne

Eesmärgiks on kirjutada Haskellis maleprogramm, mis suudaks mängida malet nii suvalisest etteantud korrektsest maleseisust alates kui ka standardsest algseisust alates.

Kellel vaja, võib veebist leida täieliku malereeglite kogu. Meie juhul puutuvad asjasse käigureeglid ja reeglid mängu tulemuse üle otsustamiseks lõppseisu põhjal. Arvesse pole vaja võtta reeglit kolmekäigulise seisukorduse kohta ja 50 käigu reeglit.

Kasutajaga suhtlemine käib Xboardi/Winboardi abil. Xboard tuleb konfigureerida nii, et algseisu määramiseks kasutaks ta setboard-käsku. Miniversioonis on Xboardi konfigureerimine ja temaga suhtlemine juba realiseeritud peamoodulis Main; sellest tasemest põhimõtteliselt piisab ja seda moodulit pole vaja täiendada (aga võib, kui on soovi; vajadusel tutvuge veebis Xboardiga suhtlemise protokolliga).

Mooduli FPKodu3 skelett on ette antud ja seda tuleb järgida; seal on ka täpsemalt kirjas, mida tuleb teha. Lisaks juba eelpool kirjeldatud moodulile Main on ette antud moodulid Sort, Square, PiecesAndPlayers, Position, Result, Minimax, ListBoard, ArrayBoard, FunBoard, mille sisu kohta leiate täpsemat infot neis failides olevatest kommentaaridest.

Seega on Teie ülesandeks ainult malekäikude ja seisuhinnangu defineerimine. See tuleks teha nii, et programm käike meeletult kaua ei mõtleks; normiks võiks olla, et kiirel arvutil peab olema võimalik GHC-ga kompileerimisel saadud programmiga ajaviiteks malet mängida, kui ta vaatab 2 täiskäiku (st kummagi mängija 2 käiku ehk 4 poolkäiku) ette. See poolkäikude arv antakse parameetrina funktsiooni analyze argumendiks moodulis Main.

Xboardi all käivitamiseks ongi peamoodul Main failis Chess.hs. Kui soovite, et Xboard Teie programmi runhugsiga jooksutaks, tuleb avada selle faili alguses välja kommenteeritud rida ning anda käsurealt käsk

xboard -fcp ./Chess.hs

GHC-ga jooksutamiseks tuleb programm kompileerida käsuga

ghc -fglasgow-exts --make -o Chess Chess

(eelpoolmainitud rida peab olema välja kommenteeritud), ja tulemuseks olev masinkoodis programm Chess Xboardiga välja kutsuda samamoodi kui enne (Chess.hs asemel tuleb panna muidugi Chess). Kui soovite teminaliaknast näha, milliseid käske Xboardi ja Teie programmi vahel saadetakse, siis andke lisaks -debug-võti:

xboard -fcp ./Chess -debug

Xboard saadab algseisud programmile FEN-notatsioonis (Forsythe-Edwards Notation). Kui teil on olemas FEN-kujul algseisude fail (nt examples.fen), siis saate koheselt sealt laadida esimese seisu kasutades -lpf võtit:

xboard -fcp ./Chess -lpf examples.fen

Selles failis on kuus seisu, millest esimeses kolmes on valgel 2-käiguline, viimases kolmes aga 3-käiguline matt. Nende ülesleidmine võiks olla Teie töö teetähisteks.

Kuigi moodul FPKodu3 peaks kasutama ainult standard-Haskelli ja kompileeruma nii Hugsi kui GHC-ga ilma realisatsioonilaiendusi kasutamata, tuleb kogu süsteemi tervikuna kompileerimiseks lisada Hugsi puhul lipp -98 ja GHC puhul lipp -fglasgow-exts, kui Te baseerute etteantud moodulitel Main ja Minimax, sest need kasutavad võtteid, mis standard-Haskelli ei kuulu (see Minimax pole sama mis samanimeline loengus käsitletu).

Loomulikult võite töös kasutada kõiki Haskelli standardteeke. Töö esitamisel saatke aga palun ainult fail FPKodu3.hs. Kõik siianiviidatud failid saate tõmmata endale korraga zip-kujul.

Windowsi all tundub, et runhugs ja Winboard ei saa omavahel suhtlemisega hakkama ja kogu standardsisend programmile on ilma reavahetussümboliteta. Parimaks lahenduseks on kasutada Hugsi asemel GHC-d. Kompileerimiseks sobib näiteks käsurida:

ghc.exe -fglasgow-exts -o chess.exe Chess.hs

Varmo Vene