简体   繁体   English

即使定义了基本谓词,prolog 查询也会卡住

[英]prolog query gets stuck even when base predicates are defined

i am creating a rubiks cube solver in prolog .我正在prolog 中创建一个魔方求解器 i have implemented the predicates for solving white edges .我已经实现了解决白边的谓词 but when i query it, it gets stuck.但是当我查询它时,它会卡住。 this is the code:这是代码:

:-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).

when i input this query:-当我输入此查询时:-

?-white_edges(X,Y),display(Y).

:(assuming X to be any jumbled state of cube) it gets stuck without printing a thing. :(假设 X 是立方体的任何杂乱无章的 state) 它会卡住而没有打印任何东西。 it would be even better if you can provide me with implementation of any other algorithm or a better implememtation of mine (preferrably using my predicates for f,f',u,r,b,etc.如果您可以为我提供任何其他算法的实现或更好的我的实现(最好使用我的谓词 f、f'、u、r、b 等),那就更好了。

You can find an implementation in SWI-Prolog.您可以在 SWI-Prolog 中找到实现。 Start XPCE IDE (for instance, on Linux):启动 XPCE IDE(例如,在 Linux 上):

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

?- emacs.

then open the menu Help \ Xpce Manual From the small window titled XPCE Manual, open File \ Demo programs.然后打开菜单 Help\Xpce Manual 从名为 XPCE Manual 的小 window 中,打开 File\Demo 程序。 The last line of the newly opened window should be新开的window最后一行应该是

Rubiks cube      THe Rubiks Cube Game

The code is fairly sophisticated, being very compact and a lot of it being devoted to the graphical processing.代码相当复杂,非常紧凑,其中大部分用于图形处理。 From the XPCE editor of rubikpce.pl, right click on从 rubikpce.pl 的 XPCE 编辑器中,右键单击

:-use_module(rubik).

and inspect the solver.并检查求解器。 The code is well commented, and you can use the debugger by means of代码注释很好,您可以通过以下方式使用调试器

?- gtrace,rubikpce.

Good luck...祝你好运...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM