問題はこちら->http://nabetani.sakura.ne.jp/hena/orde27cardgame/
枚数の多いほうから幅優先探索して、得られた最初の値を答えにすれば早いと思いましたが、
コードがおかしいのか、かえって遅くなりましたので、
深さ優先で、findall/3ですべての値を得、その中の最大値を答えとしています。
まずスートを数字に変換しておいて、ストーリーではランクをソートした後でスートをソート、
カインドではその逆の準備をします。
n枚の役を抽出するには、ストーリーでは、n-1離れた二つの札のスートが同じで、
ランクがn-1違うものを選びます。
カインドではスートとトランクが逆になります。
後は順に残りの札から同様に役を抽出し、得点を合計していきます。
%swi-Prolog version 7.4.2
%start.
%:-initialization(start). %ideone
point([2:1,3:4,4:9,5:16,6:25,8:49]).
hand([],R,R):-!.
hand(L,S,R):-
length(L,N),(story(L,N,N1,L1);kind(L,N,N1,L1)),
point(P),member(N1:N2,P),S1 is N2+S,hand(L1,S1,R).
story(L,N,N,L1):-story1(L,N,L1).
story(L,N,M,L1):-N1 is N-1,N1>=2,story(L,N1,M,L1).
story1(L,N,R):-
length(L,M),sort(2,@=<,L,L1),sort(1,@=<,L1,L2),N1 is M-N+1,between(1,N1,X),
N2 is X+N-1,nth1(X,L2,V-Y1),nth1(N2,L2,V-Y2),Y2=:=Y1+N-1,del(L2,X,N,R).
kind(L,N,N,L1):-kind1(L,N,L1).
kind(L,N,M,L1):-N1 is N-1,N1>=2,kind(L,N1,M,L1).
kind1(L,N,R):-
length(L,M),sort(1,@=<,L,L1),sort(2,@=<,L1,L2),N1 is M-N+1,between(1,N1,X),
N2 is X+N-1,nth1(X,L2,Y1-V),nth1(N2,L2,Y2-V),Y2=:=Y1+N-1,del(L2,X,N,R).
del(R,_,0,R):-!.
del(L,X,N,R):-Y is X+N-1,nth1(Y,L,_,L1),N1 is N-1,del(L1,X,N1,R).
solve(L,R):-findall(R1,hand(L,0,R1),R2),(R2=[]->R=0;max_list(R2,R)).
start:-str(S),split_string(S,"\s\n","\s",L),maplist(split,L,L1),pre(L1).
split(S,L):-atomics_to_string(L,",",S).
pre([]).
pre([_,B,[C]|T]):-maplist(atom_chars,B,L),maplist(conv,L,L1),flatten(L1,L2),
solve(L2,R),disp(R,C),pre(T).
conv([A,B],L):-atom_codes(A,X),X1 is X-65,atom_number(B,B1),L=[X1-B1].
disp(0,A):-!,S='-',disp1(S,A).
disp(R,A):-atom_number(S,R),disp1(S,A).
disp1(S,A):-(A==S->Str=" pass ";Str=" fail "),write(Str),writeln(S).
str("0 A1,A2,A3,A4,B3,C3,D5,E5 11
1 A1,B2,C3,D4,E5,F6,G7,A8 -
2 A3,A5,A4,A6,A7,A1,A2,A8 49
3 G2,G1,A1,F1,C1,E1,B1,D1 26
4 E3,G3,D4,F3,D3,C3,B3,A3 9
5 A1,C1,C2,E3,B1,B2,A2,D3 9
6 D2,E2,C1,B2,C2,B1,A2,A1 20
7 C2,B3,B4,A1,A2,B2,B1,C1 11
8 D1,B1,D3,C3,D2,B2,C1,B3 4
9 C1,F5,F6,B2,C2,D2,F4,C3 -
10 D2,A2,C2,E2,F2,B2,C3,C1 9
11 D6,E7,D8,F7,C7,G7,D7,D5 -
12 B2,B3,B4,D5,D2,D4,D3,C3 -
13 C3,D3,B2,B1,E4,E5,D4,C2 4
14 D3,E4,E2,C1,F4,D2,E3,C2 4
15 B4,C3,D5,C4,A4,C5,B5,B6 4
16 E9,D8,D9,D7,F8,F9,E8,E7 9
17 F9,C9,D7,D9,D8,E7,E9,F8 -
18 D4,C5,B5,B6,D3,D2,D5,B7 11
19 B8,D8,D7,A7,A8,D9,C8,A9 9
20 F3,E3,F7,E5,E6,E4,E7,F6 11
21 A9,G9,B8,A7,G7,C8,A8,G8 9
22 G8,G2,G3,G9,G6,G4,G5,G7 49
23 E9,E1,B9,D1,C9,G9,D9,F9 26
24 B9,B7,G3,A7,G4,B1,B8,B2 4
25 A1,B4,B3,A4,A2,B5,A3,A5 20
26 B3,D3,F3,G2,C3,A3,E3,G3 26
27 E8,D8,E7,D7,G8,G7,F7,F8 18
28 D4,B3,E4,A3,C4,E3,D3,C3 20
29 B7,B5,E4,B6,D4,A4,B4,C4 20
30 B2,B1,B7,C8,F2,B9,B8,F1 -
31 C4,C3,C5,E3,E1,E2,E4,C2 18
32 G1,E1,D1,A1,F1,A2,B1,C1 26
33 E4,C5,C4,B4,D4,D5,E5,F5 18
34 D4,G4,A4,F4,C4,A3,E4,B4 26
35 B3,A9,G4,F4,A8,B4,G8,A3 -
36 B4,E3,F4,E4,G3,A4,G4,F3 9
37 E4,B3,E3,C3,A3,G3,F3,A2 4
38 C5,C4,C6,C8,C1,C2,C7,C3 49
39 C4,D4,E4,F3,E3,F4,D3,G4 20
40 F2,F6,F9,F7,F5,F3,F8,F4 49
41 A9,A3,A8,A2,B9,B8,A7,A1 9
42 G9,A8,G8,A6,A9,G6,G7,A7 18
43 B8,C4,D5,D4,C8,D8,E8,B4 11
44 B1,B2,F6,E4,C1,C2,F4,F5 4
45 B4,B3,B5,B1,B7,B8,B6,B2 49
46 G8,A8,G7,A7,F7,G6,A6,F8 9
47 B7,E7,D7,G7,C7,A7,F7,E8 11
48 F3,D7,B7,D3,C3,G3,E3,D9 -
49 B3,A6,C5,A3,A4,A2,B5,A5 -
50 A8,D6,B8,C8,D7,C7,D8,E8 4
51 B4,D9,C4,E9,E2,G9,F9,D2 11
52 B3,G9,A9,G1,A1,F1,F9,A3 -
53 G1,B1,A2,G2,B2,A1,A4,A3 11
54 A7,A6,C7,B7,B5,G5,A5,F5 4
55 D1,D9,D4,E4,E8,B4,F8,F4 -
56 B4,A8,C8,G8,B7,A3,B3,C7 -
57 D3,G3,D7,F3,D9,B7,E3,C3 -
58 B9,B1,F2,B7,B2,C8,F1,B8 -
59 F6,E4,F4,F5,B1,B2,C1,C2 4
60 A5,G5,B5,B4,G6,C4,G7,A6 -
61 C4,G3,F4,B7,A1,G4,D4,D5 -
62 D7,G2,A4,A3,A7,A5,A6,F7 -
63 F7,E5,E4,E3,E7,F3,F6,E6 11
64 C1,E9,D4,G5,A5,C5,C6,B5 -
65 E4,B6,A4,B4,B7,B5,C4,D4 20
66 G9,B4,D9,D2,E2,C4,F9,E9 11
67 B9,B2,B7,B1,G3,A7,B8,G4 4
68 B2,C1,E7,E6,A2,D2,C2,A1 -
69 A4,B4,F4,G4,E3,G3,E4,F3 9
70 A8,D8,D6,D7,C8,B8,E8,C7 4").