Kedysi som si robil pre zabavu program, ktory skusa "klasicku" ulohu:
Preskakat konom celu sachovnicu, pricom nesmies na ziadnu poziciu skocit 2x.
Ale vysvetlovat Ti to nebudem, bolo to asi pred 15 rokmi, tak si z toho uz prd pamatam
Kód:
:- public main/0.
/*
:- visible pocet/1.
:- visible pole/2.
:- visible suradnice/2.
*/
main :- abolish(pole/2), abolish(pocet/1), abolish(suradnice/2),
asserta(pocet(1)), asserta(pole(1,1)),
cls,
time(Y), write(Y),
tmove(17,42), put(`o),
tmove(2,55), write(5678), write(901), write(234),
tmove(3,1), write(1), tmove(4,1), write(1),
go,
tmove(1,0),time(X), write(X), write(ok),
preusporiadaj,
zobrazuj.
main :- tmove(1,0),
time(X), write(X), write(nak).
go :- call(pocet(61)).
go :- posun,
go.
posun :- [! call(pole(X,Y)) !] , p(X,Y,X1,Y1), dobre(X1,Y1).
posun :- retract(pole(X,Y)), retract(pocet(P)), dec(P,P1), asserta(pocet(P1)),
R is 18-X, S is 40+2*Y, tmove(R,S), put(32),
tmove(3,P), put(32), tmove(4,P), put(32),
!, fail.
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X+1, Y1 is Y+2, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X-1, Y1 is Y+2, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X+1, Y1 is Y-2, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X-1, Y1 is Y-2, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X+2, Y1 is Y+1, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X-2, Y1 is Y+1, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X+2, Y1 is Y-1, asserta(pole(X1,Y1)) !].
p(X,Y,X1,Y1) :- [! retract(pocet(P)), inc(P,P1), asserta(pocet(P1)),
X1 is X-2, Y1 is Y-1, asserta(pole(X1,Y1)) !].
dobre(X,Y) :- retract(pole(X,Y)),
( call(pole(X,Y)) ; X<1 ; X>8 ; Y<1 ; Y>8 ),
retract(pocet(P)), dec(P,P1), asserta(pocet(P1)),
!, fail.
dobre(X,Y) :- asserta(pole(X,Y)),
R is 18-X, S is 40+2*Y, tmove(R,S), put(`o),
call(pocet(P1)), tmove(3,P1), write(X), tmove(4,P1), write(Y),
!.
preusporiadaj :- call(pole(X,Y)), asserta(suradnice(X,Y)), fail.
preusporiadaj :- !.
zobrazuj :- call(suradnice(X,Y)),
R is 18-X, S is 40+2*Y,
tmove(R,S), put(`x),
keyb(_,_),
fail.
zobrazuj.
e :- edit(kuon).
/*
l :- listing.
l(X) :- listing(X).
pole(0,0).
pocet(58).
*/