domains
i = integer
s = o;x
кубик = куб(s Left,s Right,s Up,s Down,s Front,s Back)
клетка = кл(i X,i Y,s)
коор = к(i X,i Y)
поле = клетка*
кооры = коор*
траектория = string*
facts
single d(i X,i Y)
predicates
ход_кубика(string,кубик,кубик)
создать(i,i,i,i,поле)
пометить(поле,i,i,поле)
заполнено(поле)
ход(i,i,кубик,поле,траектория,траектория,кооры)
цель(i,i,поле,i,i,i,i,i)
nondeterm координаты(string,i,i,i,i,i,i,i,i)
след(string,траектория)
nondeterm обратно(string,i,i,i,i,i,i,i,i)
nondeterm вбок(string,i,i,i,i,i,i,i,i)
goal
write("Ширина поля:"),readint(L), write("Высота поля:"),readint(W),
assert(d(L,W)),создать(1,L,1,W,P),пометить(P,1,1,P1),
ход(1,1,куб(o,o,o,x,o,o),P1,[],Траектория,Координаты),
write(Траектория,"\n",Координаты),exit.
clauses
d(255,255).
ход_кубика("вперёд",куб(L,R,U,D,F,B),куб(L,R,B,F,U,D)):- not(B=x).
ход_кубика("назад",куб(L,R,U,D,F,B),куб(L,R,F,B,D,U)):- not(F=x).
ход_кубика("вправо",куб(L,R,U,D,F,B),куб(D,U,L,R,F,B)):- not(L=x).
ход_кубика("влево",куб(L,R,U,D,F,B),куб(U,D,R,L,F,B)):- not(R=x).
создать(L,L,W,W,[кл(L,W,o)]):-!.
создать(L,L,Y,W,[кл(L,Y,o)|P]):-Y1=Y+1,!,создать(1,L,Y1,W,P).
создать(X,L,Y,W,[кл(X,Y,o)|P]):-X1=X+1,!,создать(X1,L,Y,W,P).
пометить([кл(X,Y,_)|P],X,Y,[кл(X,Y,x)|P]):-!.
пометить([Кл|P],X,Y,[Кл|P1]):-пометить(P,X,Y,P1).
заполнено([кл(_,_,x)|P]):-заполнено(P).
заполнено([]).
ход(_,_,_,P,_,[],[]):-заполнено(P),!.
ход(X,Y,Куб,P,Т,[Н|Траек],[к(X1,Y1)|Коор]):- d(L,W),D=L+W, цель(X,Y,P,D,L,W,X0,Y0),
координаты(Н,X,Y,X0,Y0,L,W,X1,Y1), not(след(Н,Т)),
ход_кубика(Н,Куб,Куб1), пометить(P,X1,Y1,P1),!,
ход(X1,Y1,Куб1,P1,[Н|Т],Траек,Коор).
ход(X,Y,Куб,P,Т,[Н|Траек],[к(X1,Y1)|Коор]):- d(L,W),D=L+W, цель(X,Y,P,D,L,W,X0,Y0),
координаты(Н,X,Y,X0,Y0,L,W,X1,Y1),
ход_кубика(Н,Куб,Куб1), пометить(P,X1,Y1,P1),!,
ход(X1,Y1,Куб1,P1,[Н|Т],Траек,Коор).
ход(X,Y,Куб,P,Т,[Н1,Н2|Траек],[к(X2,Y2),к(X3,Y3)|Коор]):- d(L,W),D=L+W, цель(X,Y,P,D,L,W,X0,Y0),
обратно(Н1,X,Y,L,W,X0,Y0,X2,Y2),
ход_кубика(Н1,Куб,Куб1), пометить(P,X2,Y2,P1),
вбок(Н2,X2,Y2,L,W,X0,Y0,X3,Y3),
ход_кубика(Н2,Куб1,Куб2), пометить(P1,X3,Y3,P2),!,
ход(X3,Y3,Куб2,P2,[Н2,Н1|Т],Траек,Коор).
цель(X,Y,[кл(X1,Y1,o)|P],D,_,_,X0,Y0):- D1=abs(X-X1)+abs(Y-Y1),D>D1,!,
цель(X,Y,P,D1,X1,Y1,X0,Y0).
цель(X,Y,[_|P],D,X1,Y1,X0,Y0):- цель(X,Y,P,D,X1,Y1,X0,Y0).
цель(_,_,[],_,X0,Y0,X0,Y0).
обратно("назад",X,Y,_,_,_,Y0,X,Y1):- Y0>Y,Y1=Y-1,Y1>=1.
обратно("вперёд",X,Y,_,W,_,Y0,X,Y1):- Y0<Y,Y1=Y+1,Y1<=W.
обратно("влево",X,Y,_,_,X0,_,X1,Y):- X0>X,X1=X-1,X1>=1.
обратно("вправо",X,Y,L,_,X0,_,X1,Y):- X0<X,X1=X+1,X1<=L.
вбок("вправо",X,Y,L,_,_,Y0,X1,Y):- Y0<>Y,X1=X+1,X1<=L.
вбок("влево",X,Y,_,_,_,Y0,X1,Y):- Y0<>Y,X1=X-1,X1>=1.
вбок("вперёд",X,Y,_,W,X0,_,X,Y1):- X0<>X,Y1=Y+1,Y1<=W.
вбок("назад",X,Y,_,_,X0,_,X,Y1):- X0<>X,Y1=Y-1,Y1>=1.
координаты("вперёд",X,Y,_,Y0,_,W,X,Y1):- Y0>Y,Y1=Y+1,Y1<=W.
координаты("назад",X,Y,_,Y0,_,_,X,Y1):- Y0<Y,Y1=Y-1,Y1>=1.
координаты("вправо",X,Y,X0,_,L,_,X1,Y):- X0>X,X1=X+1,X1<=L.
координаты("влево",X,Y,X0,_,_,_,X1,Y):- X0<X,X1=X-1,X1>=1.
след("вперёд",["назад"|_]).
след("назад",["вперёд"|_]).
след("вправо",["влево"|_]).
след("влево",["вправо"|_]).