당신의 기본적인 생각은 소리입니다. 실제로는 all_different/1
제약이 필요합니다. 이 퍼즐에 대한 흥미로운 점은 큐브를 나타내는 방법입니다. 나는 당신이 연결 한 페이지에 주어진 것과 거의 똑같은 방식으로 직설적 인 접근 방식을 취하고 큐브를 표현할 것입니다. 지상 프롤로그 용어로
b
r r r g
y
: 예를 들어, 나는 누구의 2D 레이아웃 첫 번째 큐브를 나타냅니다
tmb(b,[r,r,r,g],y)
여기서 "상단, 중간, 하단"에 대한 tmb
스탠드 큐브.
cube(tmb(b,[r,r,r,g],y)).
cube(tmb(r,[g,y,g,b],b)).
cube(tmb(r,[b,g,r,y],y)).
cube(tmb(g,[b,r,y,g],y)).
다음 조건
관심의 측면에 큐브를 관련 :
side_cube(top, tmb(Top,_,_), Top).
side_cube(front, tmb(_,[_,Front|_],_), Front).
side_cube(bottom, tmb(_,_,Bottom), Bottom).
side_cube(back, tmb(_,[_,_,_,Back],_), Back).
주요 포인트는 지금 :
처음에, 우리는 다음과 같은 4 개 큐브를 부여 회전을 무엇 큐브 모양 같아?
cube_rotation(Cube0, Cube) :-
cube_flip(Cube0, Cube1),
cube_rotation_(Cube1, Cube).
cube_rotation_(tmb(Top,[A,B,C,D],Bottom), tmb(Top,[E,F,G,H],Bottom)) :-
append(_, [E,F,G,H|_], [A,B,C,D,A,B,C]).
cube_flip(Cube, Cube).
cube_flip(tmb(Top,[A,B,C,D],Bottom), tmb(A,[Bottom,B,Top,D],C)).
cube_flip(tmb(Top,[A,B,C,D],Bottom), tmb(B,[A,Bottom,C,Top],D)).
연습 : 전체 솔루션에 대한 cube_flip/2
의 3없는 절을 입력합니다.
솔루션을 묘사 심지어 CLP (FD)하지 않고, 이제 쉽게 :
solution(Cs) :-
findall(C, cube(C), Cs0),
same_length(Cs0, Cs),
maplist(side_different(Cs), [top,front,bottom,back]),
maplist(cube_rotation, Cs0, Cs).
side_different(Cubes, Side) :-
maplist(side_cube(Side), Cubes, Colors),
all_dif(Colors).
all_dif([]).
all_dif([D|Ds]) :- maplist(dif(D), Ds), all_dif(Ds).
에도와 (내가 말했듯이, 나는 당신을 위해 운동을 생략 3 절을 부족) 위에 주어진 코드 우리는 이미이 개 솔루션을 찾을 수 :
?- solution(Cubes).
Cubes = [tmb(r,[r,y,r,b],g),tmb(y,[g,b,g,r],b),tmb(b,[y,g,r,y],r),tmb(g,[b,r,y,g],y)] ;
Cubes = [tmb(r,[r,b,r,y],g),tmb(y,[g,r,g,b],b),tmb(b,[r,y,y,g],r),tmb(g,[y,g,b,r],y)] ;
false.
은 CLP (FD)를 사용하기를, 당신은 단순히 정수로 모든 색상을 매핑 할 수 있습니다, 대신 all_dif/1
의 (강한 전파 또는 all_distinct/1
) all_different/1
를 사용합니다.