14





Kontrolltöö 11.12.98

Lahendused

Lahendaja Märkused Hinne I töö Kursuse hinne
Tanel Alumäe Lahendus töötab hästi, kuid lao ja transporditavate kaupade parameetrid on programmi tekstis "kinni tinutatud" (s.t. nende muutmiseks peab kasutaja hakkama muutma programmi teksti - see ei ole talle tavaliselt kätte saadav/arusaadav ). Tee väljastamisel peaks kahe koordinaadi vahel olema mingi eraldaja, muidu muutub >10 mõõtmete korral positsioon arusaamatuks. 5 5 5
Rain Aarna Lahendus on poolik ja ei tööta. Muutujaid Olemasolevad, Lahendus kusagil ei kasutata (need ei saa kusagil väärtust), sellepärast annab append(Kaidudkohad,Lahendus,Lahendus1) alati vea. 2 33
Elken Sven Lahenduse kasutajaliides on ei ole hea, (lao möötmed ja takistused on määratud programmi koodis, nö. "kinni tinutatud"), arusaamatuks jääb muutujate X,Y tähendust käivituspredikaadis start(X,Y) ei selg itata (enne peaks ekraanile tulema mingi selgitus; programmi tekstis oleks võinud olla vähemalt kommentaarid); predikaat valjas(X,Y):-X<0,X>14, Y>0,Y<10. on arusaamatu (kas tingimused X jaoks ei peaks olema vastupidi?), mõtetu on samade muutujate kordamine predikaadi peas: movestep(DX,DY,DX,DY) :- ... 1 5 3
Urmas Lipso Töötab, ja on ka kasutajaliides (veidi kummaline), kuid kasutaja ei saa lao suurust muuta ega kaste eemaldada, ka argumendi Nr kasutamine on arusaamatu, kui seda nagunii ei kontrollita. Andmebaasipr edikaate votta, panna peaks alati kasutama ainult prediaaktide assert, retract, clause vahendusel, kuid predikaadi do_it kirjelduses on neid kasutatud ka "otse", s.t. ilma predikaadita clause - see an nab vea, kui neid yldse pole kirjeldatud; kuna predikaadi asjad mõttest sain aru alles teksti uurides, siis võib kasutaja kergesti käivitada predikaadi pane_edasi ilma, et transporditavaid kaste yldse oleks ma"a"ratud. Milleks o n predikaat nstart kui seda kusagil ei kasutata (v.a. kasutajale antavas help-is?) 5 5 5
Ants Torim Lahenduses: on hea süsteemipredikaadi random kasutamine juhusliku suuna valikuks! 555
Valeri Putskov Lahendused: It works, but not with every kind of obstacles. Instead of hard-coding obstacles into the text of predicates and repeating the same coordinates twise: go(RX,RY,SX,SY,[[3,3],[4,3]],[]), ..., go(R X,RY,SX,SY,[[3,3],[4,3]],[]), (in programming, NEVER enter the same information in two places!), a separate predicate, e.g. obstacles([[3,3],[4,3]]) should have been used, so that the above go-statement goes obstacles(Obst),..., go(RX,RY,SX,SY,Obst,[]) (there are also some other improvements to your text 3 5 4
Kalev Sullakatko Lahenduses on lao parameetrid ja transporditava kauba asukoht määratud programmi tekstis, kasutaja saab muuta vaid roboti stardipositsiooni; kuna kasutaja suunast nagunii midagi ei tea, pole mõtet seda talt ka kü sida, vaid määrata esimene suund ise, s.t. kasutaja käivitaks vaid predikaadi pane_lattu(X,Y), mis on määratud lausega pane_lattu(X,Y):-pane_lattu(X,Y,paremale).. Kauba lähte- ja lõppseisu kirjeldavad predikaadid peaks kysima k asutajalt ja need peaks pärast kauba siirdamist kustutama (predikaadiga retract) nagunii teist korda seda seisu käivitada ei saa, sest lõpp-positsioon on nüüd hõivatud - tuleb teade 'Kaup jäi lattu panemata' (ja kasutaja jääb mõ istatama - miks?) 4 34
Jaanus Vapper Lahenduses on viga: predikaadis loe(N,A,L,A,L) peaks olema kontroll, mis ei võimalda Prologil N = 0 korral minna kasutama predikaadi määritluse teist lauset - kas esimeses lause kehas ! (cut) või teises lauses kontroll N > 0 . Kui paigutamine mingil põhjusel ei õnnestu (näiteks: kasutaja annab lähtekohtadena ruudud, kus EI ole kaste), sunnib Prologi backtracking kasutama predikaadi teist lauset ja kasutajalt hakatakse lõpmatuseni küsima uusi trasporditavaid kaste (mul juhtus nii, mingit teadet vea kohta ei tule). Kontroll kasutaja antud andmete õigsuse kohat (lähtekohana antakse ruut, kus kasti ei ole) peaks olema kohe vastava data sisestamise järel, predikaat kontroll praegusel kujul isegi ei teata, mille s on viga (kas lähtekohana ilma kastita ruut või sihtkoht juba hõivatud); teatest, et andmed on korras, on vähe abi. 545
Sven Süld _ 3 2 3
Dmitri Tselovalnikov Lahenduse robot liigub nagu tank, s.t. olemasolevast kaubast (takistustest) üle; see juhtub sellepärast, et Amzi-Prolog 3.3 süsteemipredikaadiga member ei saa kontrollida nimistu liikmeid, kui nende süntaktiline struktuur on keerulisem kui aatom (küsige Listener'i aknas member([3,4],[[2,3],[3,4]]). - vastuseks on no; sellise kontrolli jaoks oleks pidanud kirjutama oma kontrolliva predikaadi (lisasin sellise predikaadi is_member Teie teksti lõppu). Läbitud teed ei salvestata, see võib (kui takistuste kontroll töötaks) tekitada tsüklis liikumise. 3    
Anton Safonov In your solution obstacles (clauses block) are defined in program text (user can not change them without editing the text) and remain there, so after 2-3 runs user does not know any more, what is the re and where; it is also not possible to run it with larger warehouse - the block clauses from previous run do not allow to use added space. The member_is predicate is easy to define (I added this to your solution), and (at least in Amzi 3.3) it is not safe wo write assert(block(N+1,_)) - the Amzi interpreter does not calculate the value N+1, but writes N+1 as a string (i.e. if N=3, there appears clause block(3+1,_), not block(4,_) (I made a change here too). There is a check for cycles, but the program quite easily gets jammed because of !-s at the end of your move clauses - they enable backtracking, i.e. moving in another direction if the original proved later w rong. 3 5 4


Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde