このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/6
#  [1] 授業単元:アルゴリズム 
#  [2] 問題文(含コード&リンク):文字列st が回文(前から読んでも後ろから読んでも 
#  同じ)であれば1 を,そうでなければ0 を返す関数 
#  int isPalindrome(const char st[]) 
#  を作成せよ.以下の実行例のように,関数の動作を確認 
#  例.文字列を入力してください:AKASAKA 
#  その文字列は回文です。 
#   
#   
#   
#   
#  できるmain 関数も作成する. 
#  例 
#  

'文字列st が回文(前から読んでも後ろから読んでも同じ)であれば1 を,そうでなければ0 を返す'(_st,1) :-
        回文(_st),!.
'文字列st が回文(前から読んでも後ろから読んでも同じ)であれば1 を,そうでなければ0 を返す'(_st,0).

回文(_文字列) :-
        atom_chars(_文字列,Chars),
        reverse(Chars,Chars).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文(_文字列) :-
        atom_chars(_文字列,Chars),
        回文(Chars,[],Chars).

回文([],L,L).
回文([_],L,L).
回文([A|R1],L1,L) :-
        回文(R1,[A|L1],L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文(_文字列) :-
        atom_chars(_文字列,Chars),
        reverse(Chars,Chars1),
        atom_chars(_文字列,Chars1).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文(_文字列) :-
        atom_chars(_文字列,Chars),
        回文(Chars,[]).

回文(L,L) :- !.
回文([_|L],L) :- !.
回文([A|R],L1) :-
        回文(R,[A|L1]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文(_文字列) :-
        atom_chars(_文字列,Chars),
        回文_1(Chars).

回文_1([]).
回文_1([_]).
回文_1(L) :-
        append([A],L2,[A],L),
        回文_1(L2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文(_文字列) :-
        sub_atom(_文字列,0,_長さ,0,_文字列),
        _長さ_1 is _長さ // 2,
        回文(文字列,0,_長さ_1,_長さ),!.

回文(_文字列,_長さ_1,_長さ_1,_長さ) :- !.
回文(_文字列,N,_長さ_1,_長さ) :-
        sub_atom(_文字列,N,1,_,_文字),
        sub_atom(_文字列,_長さ-N-1,1,_,_文字),
        N_2 is N + 1,
        回文(_文字列,N_2,_長さ_1,_長さ).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文(_文字列) :-
        sub_atom(_文字列,0,_長さ,0,_文字列),
        _長さ_1 is _長さ // 2,
        回文(文字列,0,_長さ_1,_長さ),!.

回文(_文字列,_長さ_1,_長さ_1,_長さ) :- !.
回文(_文字列,N,_長さ_1,_長さ) :-
        sub_atom(_文字列,N,1,_,_文字),
        sub_atom(_文字列,_長さ-N-1,1,_,_文字),
        N_2 is N + 1,
        回文(_文字列,N_2,_長さ_1,_長さ).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

回文('') :- !.
回文(_文字列) :-
        両端の文字(_文字列,A,_中間の文字列,A),
        回文(_中間の文字列,1),!.

両端の文字('','','','') :- !.
両端の文字(_文字列,'',_文字列,'') :-
        sub_atom(_文字列,0,1,0,_文字列),!.
両端の文字(_文字列,_最前の文字,'',_最後の文字) :-
        sub_atom(_文字列,0,1,1,_最前の文字),
        sub_atom(_文字列,1,1,0,_最後の文字),!.
両端の文字(_文字列,_最前の文字,_中間の文字列,_最後の文字) :-
        sub_atom(_文字列,0,1,_,_最前の文字),
        sub_atom(_文字列,1,_,1,_中間の文字列),
        sub_atom(_文字列,_,1,0,_最後の文字),!.