0

我正在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 等),那就更好了。

4

1 回答 1

1

您可以在 SWI-Prolog 中找到实现。启动 XPCE IDE(例如,在 Linux 上):

$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.15)
...

?- emacs.

然后打开菜单 Help\Xpce Manual 从标题为 XPCE Manual 的小窗口中,打开 File\Demo 程序。新打开的窗口的最后一行应该是

Rubiks cube      THe Rubiks Cube Game

代码相当复杂,非常紧凑,其中大部分用于图形处理。从 rubikpce.pl 的 XPCE 编辑器中,右键单击

:-use_module(rubik).

并检查求解器。代码注释很好,您可以通过以下方式使用调试器

?- gtrace,rubikpce.

祝你好运...

于 2019-10-19T12:37:59.067 回答