我正在Prolog中创建一个魔方求解器。我已经实现了解决白边的谓词。 但是当我查询它时,它被卡住了。 这是代码:
:-use_module(library(random)).
print_lis([]).
print_lis([Head|Tail]):-
write(Head),nl,
print_lis(Tail).
cube([[w,w,w,w,w,w,w,w,w],[r,r,r,r,r,r,r,r,r],[b,b,b,b,b,b,b,b,b],[o,o,o,o,o,o,o,o,o],[y,y,y,y,y,y,y,y,y],[g,g,g,g,g,g,g,g,g]]).
m([[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]],
g,
[[O3,O6,O9,W4,w,W6,W7,W8,W9],[W3,R2,R3,W2,r,R6,W1,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,Y9,O4,o,Y8,O7,O8,Y7],[Y1,Y2,Y3,Y4,y,Y6,R1,R4,R7],[G7,G4,G1,G8,g,G2,G9,G6,G3]]).
m([[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]],
o,
[[W1,W2,B3,W4,w,B6,W7,W8,B9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,Y3,B4,b,Y6,B7,B8,Y9],[O7,O4,O1,O8,o,O2,O9,O6,O3],[Y1,Y2,G3,Y4,y,G6,Y7,Y8,G9],[G1,G2,W3,G4,g,W6,G7,G8,W9]]).
m([[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]],
b,
[[W1,W2,W3,W4,w,W6,R9,R6,R3],[R1,R2,Y1,R4,r,Y2,R7,R8,Y3],[B7,B4,B1,B8,b,B2,B9,B6,B3],[W7,O2,O3,W8,o,O6,W9,O8,O9],[O7,O4,O1,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]]).
m([[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]],
r,
[[G1,W2,W3,G4,w,W6,G7,W8,W9],[R7,R4,R1,R8,r,R2,R9,R6,R3],[W1,B2,B3,W4,b,B6,W7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[B1,Y2,Y3,B4,y,Y6,B7,Y8,Y9],[Y1,G2,G3,Y4,g,G6,Y7,G8,G9]]).
m_u([[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]],
[[W7,W4,W1,W8,w,W2,W9,W6,W3],[B1,B2,B3,R4,r,R6,R7,R8,R9],[O1,O2,O3,B4,b,B6,B7,B8,B9],[G9,G8,G7,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,R3,R2,R1]]).
m_d([[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,R7,R8,R9],[B1,B2,B3,B4,b,B6,B7,B8,B9],[O1,O2,O3,O4,o,O6,O7,O8,O9],[Y1,Y2,Y3,Y4,y,Y6,Y7,Y8,Y9],[G1,G2,G3,G4,g,G6,G7,G8,G9]],
[[W1,W2,W3,W4,w,W6,W7,W8,W9],[R1,R2,R3,R4,r,R6,B7,B8,B9],[B1,B2,B3,B4,b,B6,O7,O8,O9],[O1,O2,O3,O4,o,O6,G3,G2,G1],[Y7,Y4,Y1,Y8,y,Y2,Y9,Y6,Y3],[R9,R8,R7,G4,g,G6,G7,G8,G9]]).
right(r,b).
right(b,o).
right(o,g).
right(g,r).
left(X,Y):-right(Y,X).
back(o,r).
back(b,g).
back(X,Y):-back(Y,X).
f(Cube,Col,NewCube):-
write('F'),write(Col),nl,
m(Cube,Col,NewCube).
r(Cube,Col,NewCube):-
write('R'),write(Col),nl,
right(Col,Col2),
m(Cube,Col2,NewCube).
l(Cube,Col,NewCube):-
write('L'),write(Col),nl,
left(Col,Col2),
m(Cube,Col2,NewCube).
b(Cube,Col,NewCube):-
write('B'),write(Col),nl,
back(Col,Col2),
m(Cube,Col2,NewCube).
u(Cube,NewCube):-
write('U'),nl,
m_u(Cube,NewCube).
d(Cube,NewCube):-
write('D'),nl,
m_d(Cube,NewCube).
f_(Cube,Col,NewCube):-
write('F''),write(Col),nl,
m(NewCube,Col,Cube).
r_(Cube,Col,NewCube):-
write('R''),write(Col),nl,
right(Col,Col2),
m(NewCube,Col2,Cube).
l_(Cube,Col,NewCube):-
write('L''),write(Col),nl,
left(Col,Col2),
m(NewCube,Col2,Cube).
b_(Cube,Col,NewCube):-
write('B''),write(Col),nl,
back(Col,Col2),
m(Cube,Col2,NewCube).
u_(Cube,NewCube):-
write('U''),nl,
m_u(NewCube,Cube).
d_(Cube,NewCube):-
write('D''),nl,
m_d(NewCube,Cube).
cube('W','R','B','O','Y','G').
write_face([A,B,C,D,E,F,G,H,I]):-write([A,B,C]),nl,write([D,E,F]),nl,write([G,H,I]),nl.
display([W,R,B,O,Y,G]):-
write('W:'),write_face(W),
write('R:'),write_face(R),
write('B:'),write_face(B),
write('O:'),write_face(O),
write('Y:'),write_face(Y),
write('G:'),write_face(G).
face(w,[F,_,_,_,_,_],F).
face(r,[_,F,_,_,_,_],F).
face(b,[_,_,F,_,_,_],F).
face(o,[_,_,_,F,_,_],F).
face(y,[_,_,_,_,F,_],F).
face(g,[_,_,_,_,_,[A,B,C,D,E,F,G,H,I]],[I,H,G,F,E,D,C,B,A]).
rot(b,Face,Face).
rot(r,[A,B,C,D,E,F,G,H,I],[C,F,I,B,E,H,A,D,G]).
rot(o,[A,B,C,D,E,F,G,H,I],[G,D,A,H,E,B,I,F,C]).
rot(g,[A,B,C,D,E,F,G,H,I],[I,H,G,F,E,D,C,B,A]).
:-op(1000,fx,display).
white_edge(Cube,Col,SolCube):-
back(Col,B),
left(Col,L),
right(Col,R),
face(Col,Cube,Cf),
face(B,Cube,Bf),
face(L,Cube,Lf),
face(R,Cube,Rf),
face(w,Cube,W),
face(y,Cube,Y),
rot(Col,W,Wf),
rot(Col,Y,Yf),
from(edge,Cube,Col,Cf,Bf,Lf,Rf,Wf,Yf,SolCube).
from(edge,Cube,C,
[_,C,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,w,_],
[_,_,_,_,_,_,_,_,_],
Cube).
from(edge,Cube,C,
[_,_,_,C,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,w,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
f(Cube,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,C,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,w,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
f_(Cube,c,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,C,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,w,_,_,_,_,_,_,_],
Solcube):-
f(Cube,C,C1),
f(C1,C,Solcube).
from(edge,Cube,C,
[_,w,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,C,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
f(Cube,C,C1),
f(C1,C,C2),
d(C2,C3),
r(C3,C,C4),
f_(C4,C,C5),
r_(C5,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,w,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,C,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
f(Cube,C,C2),
d(C2,C3),
r(C3,C,C4),
f_(C4,C,C5),
r_(C5,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,w,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,C,_,_,_,_,_,_,_],
Solcube):-
d(Cube,C3),
r(C3,C,C4),
f_(C4,C,C5),
r_(C5,C,Solcube).
from(edge,Cube,C,
[_,_,_,w,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,C,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
f_(Cube,C,C2),
d(C2,C3),
r(C3,C,C4),
f_(C4,C,C5),
r_(C5,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,w,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,C,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
r(Cube,C,C1),
d_(C1,C2),
r_(C2,C,C3),
f_(C3,C,C4),
f_(C4,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,w,_,_,_],
[_,_,_,C,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
l_(Cube,C,C1),
d(C1,C2),
l(C2,C,C3),
f(C3,C,C4),
f(C4,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,C,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,w,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
b_(Cube,C,C1),
d_(C1,C2),
d_(C2,C3),
b(C3,C,C4),
f_(C4,C,C5),
f_(C5,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,C,_,_,_],
[_,_,_,w,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
b(Cube,C,C1),
d(C1,C2),
d(C2,C3),
b_(C3,C,C4),
f(C4,C,C5),
f(C5,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,C,_,_,_,_,_,_,_],
[_,_,_,_,_,w,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
r(Cube,C,C1),
r(C1,C,C2),
d_(C2,C3),
f(C3,C,C4),
f(C4,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,w,_,_,_,_,_,_,_],
[_,_,_,_,_,C,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
r_(Cube,C,C1),
f_(C1,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,w,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,C,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
Solcube):-
l_(Cube,C,C1),
l_(C1,C,C2),
f(C2,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,w,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,C,_,_,_,_,_],
Solcube):-
l(Cube,C,C1),
f(C1,C,C2),
l_(C2,C,Solcube).
from(edge,Cube,C,
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,w,_],
[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,C,_,_,_],
Solcube):-
r(Cube,C,C1),
f_(C1,C,C2),
r_(C2,C,Solcube).
white_edges(Cube,SolCube):-
white_edge(Cube,g,C1),
white_edge(C1,o,C2),
white_edge(C2,b,C3),
white_edge(C3,r,SolCube).
mov(0,w).
mov(1,r).
mov(2,b).
mov(3,o).
mov(4,y).
mov(5,g).
mov(Cube,Col,JumCube):-f(Cube,Col,JumCube).
jumble(0,Cube,Cube).
jumble(X,Cube,JumCube):-
random_between(0,5,C),
write(C),
Y is X-1,
write(Y),nl,
mov(C,Col),
mov(Cube,Col,C1),
jumble(Y,C1,JumCube).
jumble(Cube,JumCube):-
random_between(10,30,S),
write(S),nl,
jumble(S,Cube,JumCube).
当我输入此查询时:-
?-white_edges(X,Y),display(Y).
:(假设X是立方体的任何混乱状态( 它卡住了,没有打印任何东西。 如果您能为我提供任何其他算法的实现或更好的暗示(最好使用我的谓词 f,f',u,r,b 等(,那就更好了。
你可以在SWI-Prolog中找到一个实现。 启动XPCE IDE(例如,在Linux上(:
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.15)
...
?- emacs.
然后打开菜单帮助\Xpce手册 从标题为"XPCE 手册"的小窗口中,打开"文件\演示程序"。新打开的窗口的最后一行应该是
Rubiks cube THe Rubiks Cube Game
代码相当复杂,非常紧凑,其中很多都用于图形处理。从 rubikpce.pl 的XPCE编辑器中,右键单击
:-use_module(rubik).
并检查求解器。代码注释很好,你可以通过以下方式使用调试器
?- gtrace,rubikpce.
祝你好运。。。