ちょっと前の問題です。
問題はこちら->http://nabetani.sakura.ne.jp/hena/orde13hextet/
データ数がそれほど多くないので力づくで解きました。
assertを使いっぱなしにしていますのでご注意を。
% Date: 2017/08/29
%六角形のテトロミノ(へなちょこ)
solve:-data(D),rot0,solve(D),!.
solve([]).
solve([H|T]):-p(P,[P1,P2,P3]),member(A,H),delete(H,A,L1),member(B,L1),
ok(A,P1,B),delete(L1,B,L2),member(C,L2),
ok(A,P2,C),delete(L2,C,[D]),ok(A,P3,D),
R=[P,A,B,C,D],write(P),solve(T).
solve([_|T]):-write("-"),solve(T).
ok(A,[T],B):-l(A,T,B). %相互の関係を満たすピースがあるか
ok(A,[H|T],B):-l(A,H,C),ok(C,T,B).
rot0:-p(P,[P1,P2,P3]),rot(P,P1,P2,P3,5),fail. %回転した図形をassert
rot0. %問題が存在の有無なので重複はチェックしない
rot(_,_,_,_,0):-!.
rot(P,P1,P2,P3,N):-rot1(P1,PN1),rot1(P2,PN2),rot1(P3,PN3),
B=p(P,[PN1,PN2,PN3]),assert(B),
N1 is N-1,rot(P,PN1,PN2,PN3,N1).
rot1([],[]).
rot1([H|L],NL):-m(H,H1),rot1(L,L1),NL=[H1|L1] .
p(b,[[lu],[rd],[r]]). %元の図形のピース相互の関係
p(d,[[ld],[l],[ru]]).
p(i,[[l],[r],[r,r]]).
p(j,[[l],[ru],[ru,ru]]).
p(l,[[r],[lu],[lu,lu]]).
p(n,[[ld],[r],[r,rd]]).
p(o,[[ru],[r],[rd]]).
p(s,[[lu],[r],[r,rd]]).
p(y,[[lu],[r],[ld]]).
p(z,[[ld],[r],[r,ru]]).
m(r,ru). % 60度反時計回りのmove
m(ru,lu).
m(lu,l).
m(l,ld).
m(ld,rd).
m(rd,r).
l(X,l,Y):-l(Y,r,X). %経路
l(X,ld,Y):-l(Y,ru,X).
l(X,lu,Y):-l(Y,rd,X) .
l(X,r,Z):-l(X,ru,Y),l(Y,rd,Z).
l(X,r,Z):-l(X,rd,Y),l(Y,ru,Z) .
l(a,rd,f).
l(f,ru,b).
l(b,rd,g) .
l(g,ru,c).
l(c,rd,h).
l(h,ru,d) .
l(d,rd,i).
l(i,ru,e).
l(j,ru,f) .
l(f,rd,k).
l(k,ru,g).
l(g,rd,l).
l(l,ru,h).
l(h,rd,m).
l(m,ru,i).
l(i,rd,n).
l(j,rd,o).
l(o,ru,k).
l(k,rd,p).
l(p,ru,l).
l(l,rd,q).
l(q,ru,m).
l(m,rd,r).
l(r,ru,n).
l(s,ru,o).
l(o,rd,t).
l(t,ru,p).
l(p,rd,u).
l(u,ru,q).
l(q,rd,v).
l(v,ru,r).
l(r,rd,w).
data([[g,m,l,q],[f,h,o,q],[h,k,l,p],[h,k,l,m],[e,i,m,q],[g,l,q,r],[k,p,q,u],
[u,t,s,v],[q,r,v,w],[n,q,r,w],[c,g,l,p],[c,h,l,q],[l,m,p,r],[d,h,k,l]]).
2021.02.18今更ですが
https://qiita.com/smallbigcats/items/77ee33dd8d4ebe37d025
からの参照先となるコードが抜けていたので追加。
%:-initialization(start). %ideone
% start.
ston([X],X):-X<102,!.
ston([X],Y):-X<106,!,Y is X+10.
ston([X],Y):-X<111,!,Y is X+20.
ston([X],Y):-X<115,!,Y is X+30.
ston([X],Y):-Y is X+40.
l(X,N,Y):-Y is X+N. %経路
rot(P1,P2,P3,PN1,PN2,PN3):-rot1(P1,PN1),rot1(P2,PN2),rot1(P3,PN3),!.
rot1([],[]):-!.
rot1([H|L],NL):-m(H,H1),rot1(L,L1),NL=[H1|L1] .
ok(A,[T],B):-l(A,T,B),!. %相互の関係を満たすピースがあるか
ok(A,[H|T],B):-l(A,H,C),ok(C,T,B).
solve2(H,P1,P2,P3):-select(A,H,L1),select(B,L1,L2),ok(A,P1,B),
select(C,L2,[D]),ok(A,P2,C),ok(A,P3,D),!.
solve1(_,_,_,_,0):-!,fail.
solve1(H,P1,P2,P3,N):-
solve2(H,P1,P2,P3);
(rot(P1,P2,P3,PN1,PN2,PN3),N1 is N-1,solve1(H,PN1,PN2,PN3,N1)).
solve(H,P):-p(P,[P1,P2,P3]),solve1(H,P1,P2,P3,6),!.
solve(_,"-"):-!.
solve0(B3,C,R):-solve(B3,R),(R==C->write("pass ");write(" fail ")),writeln(R),!.
pre([]):-!.
pre([_,B,C|T]):-
atom_chars(B,B1),maplist(atom_codes,B1,B2),maplist(ston,B2,B3),solve0(B3,C,R),pre(T).
start:-str(S),split_string(S,"\s,\n","\s",L),pre(L),!.
p("B",[[-15],[15],[1]]). %基本の図形のピース相互の関係
p("D",[[14],[-1],[-14]]).
p("I",[[-1],[1],[1,1]]).
p("J",[[-1],[-14],[-14,-14]]).
p("L",[[1],[-15],[-15,-15]]).
p("N",[[14],[1],[1,15]]).
p("O",[[-14],[1],[15]]).
p("S",[[-15],[1],[1,15]]).
p("Y",[[-15],[1],[14]]).
p("Z",[[14],[1],[1,-14]]).
m(1,-14). % 60度反時計回りのmove
m(-14,-15).
m(-15,-1).
m(-1,14).
m(14,15).
m(15,1).
str("0 glmq B
1 fhoq -
2 lmpr N
3 glmp Y
4 dhkl J
5 glpq D
6 hlmq O
7 eimq I
8 cglp S
9 chlq Z
10 glqr L
11 cdef -
12 hijk -
13 kpqu B
14 hklm B
15 mqrw B
16 nrvw B
17 abfj B
18 abcf B
19 mrvw D
20 ptuv D
21 lmnr D
22 hklp D
23 himr D
24 dhil D
25 hlpt I
26 stuv I
27 bglq I
28 glmn J
29 fghm J
30 cdgk J
31 lpst J
32 imrw J
33 dinr J
34 cdin L
35 eghi L
36 cdeg L
37 bgko L
38 eimr L
39 jotu L
40 kotu N
41 lqtu N
42 cdim N
43 klot N
44 kloq N
45 kmpq N
46 qrvw O
47 mnqr O
48 kopt O
49 mnpq S
50 bfko S
51 chin S
52 hmnq Y
53 nqrw Y
54 bchi Z
55 inrw Z
56 cfgj Z
57 jnpv -
58 flmp -
59 adpw -
60 eilr -
61 bejv -
62 enot -
63 fghq -
64 cjms -
65 elov -
66 chlm D
67 acop -
68 finr -
69 qstu L
70 abdq -
71 jkln -
72 fjkn -
73 ijmn -
74 flqr -").