オフラインリアルタイムどう書くE13 の問題

ちょっと前の問題です。
問題はこちら->http://nabetani.sakura.ne.jp/hena/orde13hextet/
データ数がそれほど多くないので力づくで解きました。
assertを使いっぱなしにしていますのでご注意を。

```prolog
% 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
からの参照先となるコードが抜けていたので追加。

```Prolog
%:-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    -").
```