€³€Ξ₯Η₯£₯μ₯―₯Θ₯κ€ΞΊχ°ϊ
http://hibari.2ch.net/test/read.cgi/tech/1296387672/27
#  [1] ΌψΆΘΓ±Έ΅‘§CΈΐΈμ 
#  [2] ΜδΒκΚΈ(΄ή₯³‘Ό₯Ι&₯κ₯σ₯―)‘§http://ime.nu/codepad.org/zKDn7mD5 
#  
#  
#  ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ£ΣΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ
#  ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ
#  ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ
#  ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ
#  ΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙΚΙΚΙΚΙΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ‘‘ΚΙ
#  ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ‘‘ΚΙ‘‘‘‘‘‘ΚΙ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ΚΙ
#  ΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙΚΙ£ΗΚΙ

ΜΒϩáΊχ(_ΜΒΟ©₯Υ₯‘₯€₯λ,_·ΠΟ©) :-
        ΜΒΟ©ΎπΚσ€ΞΌθΖΐ(_ΜΒΟ©₯Υ₯‘₯€₯λ,_ΜΒΟ©ΎπΚσ),
        £Σ€Ξ°ΜΓΦ€Ο(_ΜΒΟ©ΎπΚσ,_ΉΤ£Σ,_Ξσ£Σ),
        £Η€Ξ°ΜΓΦ€Ο(_ΜΒΟ©ΎπΚσ,_ΉΤ£Η,_Ξσ£Η),
        ΜΒϩáΊχ(_ΜΒΟ©ΎπΚσ,_ΓΦ΄Ή€΅€μ€ΏΜΒΟ©ΎπΚσ,_ΉΤ£Σ,_Ξσ£Σ,_ΉΤ£Η,_Ξσ£Η,[],Log),
        reverse(Log,Log2),
        ·ΠΟ©€Ξΐ°Νύ(Log2,_·ΠΟ©).

ΜΒΟ©ΎπΚσ€ΞΌθΖΐ(_ΜΒΟ©₯Υ₯‘₯€₯λ,_ΜΒΟ©ΎπΚσ) :-
        get_chars(_ΜΒΟ©₯Υ₯‘₯€₯λ,Chars),
        ²ώΉΤΚΈ»ϊ€ΗΚ¬³δ(Chars,_ΜΒΟ©ΎπΚσ),!.

£Σ€Ξ°ΜΓΦ€Ο(LL1,_ΉΤ,_Ξσ) :-
        append(L0,[L|_],LL1),
        length([_|L0],_ΉΤ),
        append(L1,[£Σ|_],L),
        length([_|L1],_Ξσ),!.

£Η€Ξ°ΜΓΦ€Ο(LL1,_ΉΤ,_Ξσ) :-
        append(L0,[L|_],LL1),
        length([_|L0],_ΉΤ),
        append(L1,[£Η|_],L),
        length([_|L1],_Ξσ),!.

²ώΉΤΚΈ»ϊ€ΗΚ¬³δ([],[]) :- !.
²ώΉΤΚΈ»ϊ€ΗΚ¬³δ(L1,[L0|R2]) :-
        append(L0,['\n'|R],L1),!,
        ²ώΉΤΚΈ»ϊ€ΗΚ¬³δ(R,R2).

ΜΒϩáΊχ(LL1,_ΉΤG,_ΞσG,_ΉΤG,_ΞσG,Log,Log) :- !.
ΜΒϩáΊχ(LL1,_ΉΤ,_Ξσ,Log1,Log) :-
        append(L0,[L|_],LL1),
        length([_|L0],_ΉΤ),
        append(L1,[A|_],L),
        length([_|L1],_Ξσ),
        Ό‘€ΞΑͺΒς(LL1,_ΉΤ,_Ξσ,Log1,_ΉΤ2,_Ξσ2),
        ΜΒϩáΊχ(LL1,_ΉΤ2,_Ξσ2,_ΉΤG,_ΞσG,[[_ΉΤ,_Ξσ,_ΉΤ2,_Ξσ2]|Log1],Log).


Ό‘€ΞΑͺΒς(LL1,_ΉΤ,_Ξσ,Log1,_ΉΤ2,_Ξσ) :-
        _ΉΤ2 is _ΉΤ + 1,
        \+(append(_,[[_ΉΤ2,_Ξσ,_ΉΤ,_Ξσ]|_],Log1),
        \+(append(_,[[_ΉΤ,_Ξσ,_ΉΤ2,_Ξσ]|_],Log1),
        append(L0,[L|_],LL1),
        length([_,_|L0],_ΉΤ),
        append(L1,[A|_],L),
        length([_|L1],_Ξσ),
        \+(A = ΚΙ).        
Ό‘€ΞΑͺΒς(LL1,_ΉΤ,_Ξσ,Log1,_ΉΤ2,_Ξσ) :-
        _ΉΤ2 is _ΉΤ - 1,
        \+(append(_,[[_ΉΤ2,_Ξσ,_ΉΤ,_Ξσ]|_],Log1),
        \+(append(_,[[_ΉΤ,_Ξσ,_ΉΤ2,_Ξσ]|_],Log1),
        append(L0,[L|_],LL1),
        length(L0,_ΉΤ),
        append(L1,[A|_],L),
        length([_|L1],_Ξσ),
        \+(A = ΚΙ).        
Ό‘€ΞΑͺΒς(LL1,_ΉΤ,_Ξσ,Log1,_ΉΤ2,_Ξσ) :-
        _Ξσ2 is _Ξσ + 1,
        \+(append(_,[[_ΉΤ,_Ξσ2,_ΉΤ,_Ξσ]|_],Log1),
        \+(append(_,[[_ΉΤ,_Ξσ,_ΉΤ,_Ξσ2]|_],Log1),
        append(L0,[L|_],LL1),
        length([_|L0],_ΉΤ),
        append(L1,[A|_],L),
        length([_,_|L1],_Ξσ),
        \+(A = ΚΙ).        
Ό‘€ΞΑͺΒς(LL1,_ΉΤ,_Ξσ,Log1,_ΉΤ2,_Ξσ) :-
        _Ξσ2 is _Ξσ - 1,
        \+(append(_,[[_ΉΤ,_Ξσ2,_ΉΤ,_Ξσ]|_],Log1),
        \+(append(_,[[_ΉΤ,_Ξσ,_ΉΤ,_Ξσ2]|_],Log1),
        append(L0,[L|_],LL1),
        length([_|L0],_ΉΤ),
        append(L1,[A|_],L),
        length(L1,_Ξσ),
        \+(A = ΚΙ).        

·ΠΟ©€Ξΐ°Νύ([[_ΉΤ1,_Ξσ1,_ΉΤ2,_Ξσ2]],[[ΉΤ1,_Ξσ1],[_ΉΤ2,_Ξσ2]]) :- !.
·ΠΟ©€Ξΐ°Νύ([[_ΉΤ1,_Ξσ1,_ΉΤ2,_Ξσ2]|R1],[[ΉΤ1,_Ξσ1]|R2]) :- !.
        ·ΠΟ©€Ξΐ°Νύ([R1,R2).