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

問題はこちら->http://nabetani.sakura.ne.jp/hena/ordf07chairs/

Prologで解きました。
隣接関係はデータが少ないので手抜きして手入力です。

```Prolog
r(1,2).
r(2,4).
r(4,6).
r(6,8).
r(8,9).
r(9,7).
r(7,5).
r(5,3).
r(3,1).
l(A,B):-r(B,A).

sit?(X,L):-member(X,L),r(X,B),member(B,L),l(X,C),member(C,L),!.
sit?(X,L):-member(X,L),((l(X,B),member(B,L));(r(X,C),member(C,L))),!.
sit?(X,[H|T]):-X=H.

sit(M,LF,LF1,LT,LT1):-
        char_code(M,NM),(NM>77->reverse(LF,LF0);LF0=LF),sit?(X,LF0),delete(LF,X,LF1),append(LT,[X:M],LT1).

left(M,LF,LF1,LT,LT1):-
        upcase_atom(M,M1),select(X:M1,LT,LT1),append(LF,[X],LF0),sort(LF0,LF1).   %select->append deha dame

start:-str(S),split_string(S,"\n,\s","\s",L0),pre(L0).

pre([]).
pre([_,A,B|T]):-atom_chars(A,L0),solve(L0,RF,RT),disp(B,RF,RT,RL),pre(T).
         
solve(PL,RF,RT):-numlist(1,9,LF),solve(PL,LF,[],RF,RT).
solve([],LF,LT,LF,LT):-!.
solve([H|T],LF,LT,RF,RT):-char_type(H,upper),!,sit(H,LF,LF1,LT,LT1),solve(T,LF1,LT1,RF,RT).
solve([H|T],LF,LT,RF,RT):-left(H,LF,LF1,LT,LT1),solve(T,LF1,LT1,RF,RT).

disp(B,[],RT,RT):-
        disp1(2,RT,'',S),atomics_to_string([S],"",S1),(S1==B->write("yes ");write(" no ")),write(S),write("\n").
disp(B,[H|T],RT,RL):-
        append([H:'-'],RT,RT1),disp(B,T,RT1,RL).
        
disp1(_,[],S,S).
disp1(X,RT,S1,S):-select(X:Y,RT,RT1),atom_concat(Y,S1,S2),r(X,X1),disp1(X1,RT1,S2,S).

%start.

str("0       NABETanI        I-E--T-B-
1       A       A--------
2       Aa      ---------
3       Z       ----Z----
4       Zz      ---------
5       AaB     B--------
6       ABa     -------B-
7       ABCDEFGHI       AGCEIDHBF
8       OPQRSTUVW       WSQUOTPVR
9       F       F--------
10      L       L--------
11      Mm      ---------
12      JQ      J---Q----
13      ACP     A---P--C-
14      GgS     ----S----
15      USLE    L-E-U-S--
16      XJZY    J-Y-X-Z--
17      NnJXx   J--------
18      AJjQa   ----Q----
19      HGThgQ  ----T-Q--
20      NJRErI  J-E-N--I-
21      ZzWwDYG         D---Y--G-
22      ZGgKQHM         K-H-Z-Q-M
23      OZYSAsHP        A-Y-OPZ-H
24      VNnEISAW        E-S-VWAI-
25      HhYAKkCOE       A-O-Y-EC-
26      KAkHJTSWV       H-JWTSVA-
27      WNTYKHZhMQ      KMTQWZN-Y
28      YyJHFGfgTh      J---T----
29      NRWPLBZAOpC     LBWONZRAC
30      IORiTMXHUCF     MCTFOURXH
31      AEeHGBEJUNZn    AZGEUB-HJ
32      GgKGSOsZTLYS    K-OYZTSGL
33      VZvPOpWPMzHGF   MGO-W-HFP
34      CMmcUuLTWADFQ   LFA-TQW-D
35      HUGZMLzlNgTLDd  H-N-U-MTL
36      CFKEkHeJShUDTf  C-UTSJ--D
37      QJjGPMAICHKqWcY         GIMHWKPYA
38      HhIiQCIBiUMZcVv         --B-QZU-M
39      VMvEmFOPANIBUiVb        F-PUONAEV
40      EDCJUINdLPVnFpGe        -VCFUJGLI
41      FGQINTEnLMAlBbPpV       FMITQAVGE
42      WSVCORUMXsvNBuTtT       CXBTWRNOM
43      HJTjRVIQAXqDGxCtUh      -AVCUGRDI
44      ZzHXIEKQYUuBTxLlCq      HTEYC-KIB
45      RGDCAEBVrgFbTJUePjc     -T-FUVADP
46      WBIRSALCVvsbwalYBJP     B-R-YPCIJ
47      HKFZGEPAIphLRarAOaHo    LHFIZ-GKE
48      WFNwBfbSAXCZzMDJUcKx    AM-JSUNDK").
```

2017.11.24追加
上のは、問題の条件を素直にプログラムにしたものですが、
sit?/2　の二行目で行っていることが一行目と重複しています。
重複しないようにしたものを変更部分だけ下に載せます。
ただ、データ量が少ないせいか速度の差は出ません。

```prolog
sit?([H|_],[],X,X):-
        !,var(X)->X=H;true.
sit?(L,[H|T],X,R):-
        r(H,B),member(B,L),!,((l(H,C),member(C,L))->sit?(L,[],H,R);(var(X)->sit?(L,T,H,R);sit?(L,T,X,R))).
sit?(L,[H|T],X,R):-
        var(X),l(H,B),member(B,L),!,sit?(L,T,H,R).
sit?(L,[_|T],X,R):-
        sit?(L,T,X,R).

sit(M,LF,LF1,LT,LT1):-
        char_code(M,NM),(NM>77->reverse(LF,LF0);LF0=LF),sit?(LF0,LF0,_,X),delete(LF,X,LF1),append(LT,[X:M],LT1).
```