2014-12-13 3 views
3

This is the game내가 무작위로 혼합 및 색 구성표 링크에서 제시하는 다음과 같은 4 가지 색상 4 개 큐브 문제를 생성하기 위해 관리했습니다

CLP와 PROLOG에 즉시 정신을 해결합니다.

그러므로 목표는 clpfd을 사용하여 가능한 문제 해결 방법을 생성하는 것입니다. 기본 원리는 기본이며 모든 4 개의 입방체에 대해 동일한면이 달라야합니다. 4 개의 목록으로 구성된 all_different/2을 사용했습니다. 각 목록에는 4면으로 구성된 "타워"의 각면이 있습니다. 여태까지는 그런대로 잘됐다.

이제 최종 결과는 유효한 동작 구성이며 4 개 큐브의 모양이 변경되지 않아야 함을 보증해야합니다. 그렇게하려면 어떻게해야합니까?

나는 원래의 문제에 대한 가능한 해결책을 얻기 위해 그래프 알고리즘을 구현하는 것에 대해서도 생각해 봤지만 Constraint Logic Programming을 사용하여 어떻게 가능한지 또는 실제로 알 수는 없습니다.

한편,이 프로젝트를 진행하고있는 친구와 이야기를 나누었고 그는 단순히 내가 말한 주된 원칙을 구현하고 있습니다. 충분하니? 페이지에서 해당 자바 스크립트 앱을 사용하여 시간을 보내고 심지어 큐브가 동일하더라도 솔루션의 방향이 다른 큐브가있는 것 같습니다.

답변

2

당신의 기본적인 생각은 소리입니다. 실제로는 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를 사용합니다.