:- prompt(_, '').
:- use_module(library(readutil)).
goal_check([[],_]).
goal_check([[X,X,X,X],_]).
move_check([],_,_):-!,false.
move_check([X,X,X,Y],[X,X,X],[Y]):-X\=Y.
move_check([X,X,Y,Y2],[X,X],[Y,Y2]):-X\=Y.
move_check([X,Y,Y2,Y3],[X],[Y,Y2,Y3]):-X\=Y.
move_check([X,X,X],[X,X,X],[]).
move_check([X,X,Y],[X,X],[Y]):-X\=Y.
move_check([X,Y,Y2],[X],[Y,Y2]):-X\=Y.
move_check([X,X],[X,X],[]).
move_check([X,Y],[X],[Y]):-X\=Y.
move_check([X],[X],[]).
move_ok(_,[]).
move_ok([X|_],[X|_]).
head([Xs,_],Xs).
get2([_,Xs],Xs).
swap([X,Y],[Y,X]).
cleaning_route
(Data
,[Next1
,Now2
]):-bagof(Now1
,member
([Next1
,Now1
],Data
),Nows
),[Now2
|_
]=Nows
.
move(Xs1,Res):-select(X1,Xs1,Xs2),
[E1,No1]=X1,
move_check(E1,E1Move,E1Next),
select(X2,Xs2,Xs),
[E2,No2]=X2,
move_ok(E1Move,E2),
append(E1Move,E2,E2Next),
length(E2Next,Len),
Len<5,
msort([[E1Next,No1],[E2Next,No2]|Xs],Res).
search_all_move(Data1,[Next,Now1]):-member([Now1,_],Data1),move(Now1,Next).
my_equal(E1,E2):-maplist(head,E1,E1A),
maplist(head,E2,E2A),
sort([E1A,E2A],[E1A]).
my_more(E1,E2):-maplist(head,E1,E1A),
maplist(head,E2,E2A),
sort([E1A,E2A],[E1A,E2A]).
deduplication([],Data,Data):-!.
deduplication(_,[],[]):-!.
deduplication([Commit1|Data1],[[Next2,_]|Data2],Res):-my_equal(Commit1,Next2),!,deduplication([Commit1|Data1],Data2,Res).
deduplication([Commit1|Data1],[[Next2,Now2]|Data2],Res):-my_more(Commit1,Next2),!,
deduplication(Data1,[[Next2,Now2]|Data2],Res).
deduplication([E1|Data1],[E2|Data2],[E2|Res]):-!,
deduplication([E1|Data1],Data2,Res).
format_ans(Data):-member([Now1,_],Data),
maplist(swap,Now1,Now2),
msort(Now2,Now3),
maplist(get2,Now3,Now4),
maplist
(writeln
,Now4
),nl,false
.format_ans(_).
get_next(Data,Res):-member([Res,_],Data).
bfs(_,_,Data,[[Ans,Old1]]):-member([Ans,Old1],Data),maplist(goal_check,Ans),!.
bfs
(N
,AllData1
,Data1
,[[NowRes
,OldRes
]|Res
]):-N2
is N
+1, setof(E1
,search_all_move
(Data1
,E1
),Data2
), findall(E3
,cleaning_route
(Data2
,E3
),Data3
), sort(Data3,Data4),
deduplication(AllData1,Data4,Data5),
findall(E5
,get_next
(Data5
,E5
),DataNext
), append(AllData1,DataNext,AllData2),
sort(AllData2,AllData3),
length(AllData3,Len3),
length(Data5,Len5),
/*writeln([Len5,Len3,N]),*/
!,
bfs(N2,AllData3,Data5,Res),
[[NextRes,NowRes]|_]=Res,
member([NowRes,OldRes],Data1),
!.
main:-
process:-
/*
深さ4、ビーカー数可変のウォーターソートパズルを解くコード、答えの出力は手抜き状態、堀江 伸一
テキストファイルに出力するコードに変えないとな。
処理が重たくメモリも食うので、ビーカー数の少ない問題しか解けません。
一応手元で問題を1問正しく解いたのは確認済みです。
*/
msort([[[1,2,1,2],1],[[3,4,1,3],2],[[2,4,4,3],3],[[4,1,2,3],4],[[],5],[[],6]],Test2),
bfs(0,[],[[Test2,[]]],Ans),
format_ans(Ans),
:-main.
Oi0gc2V0X3Byb2xvZ19mbGFnKHZlcmJvc2Usc2lsZW50KS4KOi0gcHJvbXB0KF8sICcnKS4KOi0gdXNlX21vZHVsZShsaWJyYXJ5KHJlYWR1dGlsKSkuCgpnb2FsX2NoZWNrKFtbXSxfXSkuCmdvYWxfY2hlY2soW1tYLFgsWCxYXSxfXSkuCgptb3ZlX2NoZWNrKFtdLF8sXyk6LSEsZmFsc2UuCm1vdmVfY2hlY2soW1gsWCxYLFldLFtYLFgsWF0sW1ldKTotWFw9WS4KbW92ZV9jaGVjayhbWCxYLFksWTJdLFtYLFhdLFtZLFkyXSk6LVhcPVkuCm1vdmVfY2hlY2soW1gsWSxZMixZM10sW1hdLFtZLFkyLFkzXSk6LVhcPVkuCm1vdmVfY2hlY2soW1gsWCxYXSxbWCxYLFhdLFtdKS4KbW92ZV9jaGVjayhbWCxYLFldLFtYLFhdLFtZXSk6LVhcPVkuCm1vdmVfY2hlY2soW1gsWSxZMl0sW1hdLFtZLFkyXSk6LVhcPVkuCm1vdmVfY2hlY2soW1gsWF0sW1gsWF0sW10pLgptb3ZlX2NoZWNrKFtYLFldLFtYXSxbWV0pOi1YXD1ZLgptb3ZlX2NoZWNrKFtYXSxbWF0sW10pLgoKbW92ZV9vayhfLFtdKS4KbW92ZV9vayhbWHxfXSxbWHxfXSkuCgpoZWFkKFtYcyxfXSxYcykuCmdldDIoW18sWHNdLFhzKS4KCnN3YXAoW1gsWV0sW1ksWF0pLgoKY2xlYW5pbmdfcm91dGUoRGF0YSxbTmV4dDEsTm93Ml0pOi1iYWdvZihOb3cxLG1lbWJlcihbTmV4dDEsTm93MV0sRGF0YSksTm93cyksW05vdzJ8X109Tm93cy4KCm1vdmUoWHMxLFJlcyk6LXNlbGVjdChYMSxYczEsWHMyKSwKCQkJCVtFMSxObzFdPVgxLAoJCQkJbW92ZV9jaGVjayhFMSxFMU1vdmUsRTFOZXh0KSwKCQkJCXNlbGVjdChYMixYczIsWHMpLAoJCQkJW0UyLE5vMl09WDIsCgkJCQltb3ZlX29rKEUxTW92ZSxFMiksCgkJCQlhcHBlbmQoRTFNb3ZlLEUyLEUyTmV4dCksCgkJCQlsZW5ndGgoRTJOZXh0LExlbiksCgkJCQlMZW48NSwKCQkJCW1zb3J0KFtbRTFOZXh0LE5vMV0sW0UyTmV4dCxObzJdfFhzXSxSZXMpLgpzZWFyY2hfYWxsX21vdmUoRGF0YTEsW05leHQsTm93MV0pOi1tZW1iZXIoW05vdzEsX10sRGF0YTEpLG1vdmUoTm93MSxOZXh0KS4KCm15X2VxdWFsKEUxLEUyKTotbWFwbGlzdChoZWFkLEUxLEUxQSksCgkJCQltYXBsaXN0KGhlYWQsRTIsRTJBKSwKCQkJCXNvcnQoW0UxQSxFMkFdLFtFMUFdKS4KIApteV9tb3JlKEUxLEUyKTotbWFwbGlzdChoZWFkLEUxLEUxQSksCgkJCQltYXBsaXN0KGhlYWQsRTIsRTJBKSwKCQkJCXNvcnQoW0UxQSxFMkFdLFtFMUEsRTJBXSkuCgpkZWR1cGxpY2F0aW9uKFtdLERhdGEsRGF0YSk6LSEuCmRlZHVwbGljYXRpb24oXyxbXSxbXSk6LSEuCmRlZHVwbGljYXRpb24oW0NvbW1pdDF8RGF0YTFdLFtbTmV4dDIsX118RGF0YTJdLFJlcyk6LW15X2VxdWFsKENvbW1pdDEsTmV4dDIpLCEsZGVkdXBsaWNhdGlvbihbQ29tbWl0MXxEYXRhMV0sRGF0YTIsUmVzKS4KZGVkdXBsaWNhdGlvbihbQ29tbWl0MXxEYXRhMV0sW1tOZXh0MixOb3cyXXxEYXRhMl0sUmVzKTotbXlfbW9yZShDb21taXQxLE5leHQyKSwhLAoJCQkJCQkJCWRlZHVwbGljYXRpb24oRGF0YTEsW1tOZXh0MixOb3cyXXxEYXRhMl0sUmVzKS4KZGVkdXBsaWNhdGlvbihbRTF8RGF0YTFdLFtFMnxEYXRhMl0sW0UyfFJlc10pOi0hLAoJCQkJCQkJCWRlZHVwbGljYXRpb24oW0UxfERhdGExXSxEYXRhMixSZXMpLgpmb3JtYXRfYW5zKERhdGEpOi1tZW1iZXIoW05vdzEsX10sRGF0YSksCgkJCW1hcGxpc3Qoc3dhcCxOb3cxLE5vdzIpLAoJCQltc29ydChOb3cyLE5vdzMpLAoJCQltYXBsaXN0KGdldDIsTm93MyxOb3c0KSwKCQkJbWFwbGlzdCh3cml0ZWxuLE5vdzQpLG5sLGZhbHNlLgpmb3JtYXRfYW5zKF8pLgpnZXRfbmV4dChEYXRhLFJlcyk6LW1lbWJlcihbUmVzLF9dLERhdGEpLgoKYmZzKF8sXyxbXSxfKTotISxyZWFkKF8pLGZhaWwuCmJmcyg2MCxfLF8sXyk6LSEscmVhZChfKSxmYWlsLgpiZnMoXyxfLERhdGEsW1tBbnMsT2xkMV1dKTotbWVtYmVyKFtBbnMsT2xkMV0sRGF0YSksbWFwbGlzdChnb2FsX2NoZWNrLEFucyksIS4KYmZzKE4sQWxsRGF0YTEsRGF0YTEsW1tOb3dSZXMsT2xkUmVzXXxSZXNdKTotTjIgaXMgTisxLAoJCQlzZXRvZihFMSxzZWFyY2hfYWxsX21vdmUoRGF0YTEsRTEpLERhdGEyKSwKCQkJZmluZGFsbChFMyxjbGVhbmluZ19yb3V0ZShEYXRhMixFMyksRGF0YTMpLAoJCQlzb3J0KERhdGEzLERhdGE0KSwKCQkJZGVkdXBsaWNhdGlvbihBbGxEYXRhMSxEYXRhNCxEYXRhNSksCgkJCWZpbmRhbGwoRTUsZ2V0X25leHQoRGF0YTUsRTUpLERhdGFOZXh0KSwKCQkJYXBwZW5kKEFsbERhdGExLERhdGFOZXh0LEFsbERhdGEyKSwKCQkJc29ydChBbGxEYXRhMixBbGxEYXRhMyksCgkJCWxlbmd0aChBbGxEYXRhMyxMZW4zKSwKCQkJbGVuZ3RoKERhdGE1LExlbjUpLAoJCQkvKndyaXRlbG4oW0xlbjUsTGVuMyxOXSksKi8KCQkJISwKCQkJYmZzKE4yLEFsbERhdGEzLERhdGE1LFJlcyksCgkJCVtbTmV4dFJlcyxOb3dSZXNdfF9dPVJlcywKCQkJbWVtYmVyKFtOb3dSZXMsT2xkUmVzXSxEYXRhMSksCgkJCSEuCgkJCm1haW46LQoJcHJvY2VzcyxoYWx0LgogCnByb2Nlc3M6LQoJLyoKCea3seOBlTTjgIHjg5Pjg7zjgqvjg7zmlbDlj6/lpInjga7jgqbjgqnjg7zjgr/jg7zjgr3jg7zjg4jjg5Hjgrrjg6vjgpLop6PjgY/jgrPjg7zjg4njgIHnrZTjgYjjga7lh7rlipvjga/miYvmipzjgY3nirbmhYvjgIHloIDmsZ8g5Ly45LiACgnjg4bjgq3jgrnjg4jjg5XjgqHjgqTjg6vjgavlh7rlipvjgZnjgovjgrPjg7zjg4njgavlpInjgYjjgarjgYTjgajjgarjgIIKCeWHpueQhuOBjOmHjeOBn+OBj+ODoeODouODquOCgumjn+OBhuOBruOBp+OAgeODk+ODvOOCq+ODvOaVsOOBruWwkeOBquOBhOWVj+mhjOOBl+OBi+ino+OBkeOBvuOBm+OCk+OAggoJ5LiA5b+c5omL5YWD44Gn5ZWP6aGM44KS77yR5ZWP5q2j44GX44GP6Kej44GE44Gf44Gu44Gv56K66KqN5riI44G/44Gn44GZ44CCCgkqLwoJbXNvcnQoW1tbMSwyLDEsMl0sMV0sW1szLDQsMSwzXSwyXSxbWzIsNCw0LDNdLDNdLFtbNCwxLDIsM10sNF0sW1tdLDVdLFtbXSw2XV0sVGVzdDIpLAoJYmZzKDAsW10sW1tUZXN0MixbXV1dLEFucyksCglmb3JtYXRfYW5zKEFucyksCglyZWFkKFgpLAoJdHJ1ZS4KOi1tYWluLgk=
[1,2,1,2]
[3,4,1,3]
[2,4,4,3]
[4,1,2,3]
[]
[]
[2,1,2]
[3,4,1,3]
[2,4,4,3]
[4,1,2,3]
[1]
[]
[2,2,1,2]
[3,4,1,3]
[4,4,3]
[4,1,2,3]
[1]
[]
[2,2,1,2]
[3,4,1,3]
[4,4,4,3]
[1,2,3]
[1]
[]
[2,2,1,2]
[3,4,1,3]
[4,4,4,3]
[2,3]
[1,1]
[]
[1,2]
[3,4,1,3]
[4,4,4,3]
[2,2,2,3]
[1,1]
[]
[2]
[3,4,1,3]
[4,4,4,3]
[2,2,2,3]
[1,1,1]
[]
[2,2,2,2]
[3,4,1,3]
[4,4,4,3]
[3]
[1,1,1]
[]
[2,2,2,2]
[4,1,3]
[4,4,4,3]
[3,3]
[1,1,1]
[]
[2,2,2,2]
[1,3]
[4,4,4,3]
[3,3]
[1,1,1]
[4]
[2,2,2,2]
[3]
[4,4,4,3]
[3,3]
[1,1,1,1]
[4]
[2,2,2,2]
[]
[4,4,4,3]
[3,3,3]
[1,1,1,1]
[4]
[2,2,2,2]
[]
[3]
[3,3,3]
[1,1,1,1]
[4,4,4,4]
[2,2,2,2]
[]
[]
[3,3,3,3]
[1,1,1,1]
[4,4,4,4]
Warning: /home/Tzc64y/prog:67:
Singleton variables: [Len3,Len5,NextRes]
Warning: /home/Tzc64y/prog:87:
Singleton variables: [X]