запрос пролога застревает, даже когда базовые предикаты определены - PullRequest
0 голосов
/ 15 октября 2019

Я создаю Rubiks Cube Solver в прологе . Я реализовал предикаты для решения белых краев . но когда я запрашиваю его, он застревает. это код:

:-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 и т. д.

1 Ответ

1 голос
/ 19 октября 2019

Вы можете найти реализацию в 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 Programs. Последняя строка недавно открытого окна должна быть

Rubiks cube      THe Rubiks Cube Game

. Код довольно сложный, очень компактный, и большая его часть посвящена графической обработке. В редакторе XPCE файла rubikpce.pl щелкните правой кнопкой мыши

:-use_module(rubik).

и осмотрите решатель. Код хорошо прокомментирован, и вы можете использовать отладчик с помощью

?- gtrace,rubikpce.

Удачи ...

...