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

回文述語の動作確認 :-
        write('文字列を入力して下さい : '),
        get_line(_文字列),
        回文(_文字列,_診断),
        回文診断(_診断).

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

回文診断(1) :-
        write('文字列は回文です。\n').
回文診断(0) :-
        write('文字列は回文ではありません。\n').

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

回文(_文字列) :-
        回文(_文字列,1).

回文('',1).
回文(_文字列,_診断) :-
        文字列の先頭と末尾から一文字取り出す(_文字列,A,_中間部分文字列,A),
        回文(_中間部分文字列,_診断).

文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_中間部分文字列,_末尾) :-
        sub_atom(_文字列,0,1,_,_先頭文字),
        sub_atom(_文字列,_,1,0,_末尾文字).
        '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,1,_中間部分文字列).

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

文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_末尾) :-
        sub_atom(_文字列,0,1,_,_先頭文字),
        sub_atom(_文字列,_,1,0,_末尾文字).

'文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,_N文字,_中間部分文字列) :-
        sub_atom(_文字列,_N文字,_,_N文字,_中間部分文字列).

文字列の先頭から一文字取り出す(_文字列,_先頭文字,_残り文字列) :-
        sub_atom(_文字列,0,1,R,_文字),
        sub_atom(_文字列,1,R,0,_残り文字列).

文字列の先頭からN文字取り出す(_文字列,_N文字,_先頭からの文字列,_残り文字列) :-
        sub_atom(_文字列,0,_N文字,R,_先頭からの文字列),
        sub_atom(_文字列,_N文字,R,0,_残り文字列).

文字列の末尾から一文字取り出す(_文字列,_末尾文字,_残り前方文字列) :-
        sub_atom(_文字列,R,1,0,_末尾文字),
        sub_atom(_文字列,0,R,1,_残り前方文字列).

文字列の末尾部分N文字取り出す(_文字列,_N文字,_末尾部分文字列,_残り前方文字列) :-
        sub_atom(_文字列,R,_N文字,0,_末尾部分文字列),
        sub_atom(_文字列,0,R,_N文字,_残り前方文字列).

文字列の末尾から逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列,_残り前方文字列) :-
        文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列),
        sub_atom(_文字列,0,R,_N文字,_残り前方文字列).

文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列) :-
        文字列の末尾部分を逆順にN文字取り出す(_文字列,0,_N文字,_末尾からの逆順文字列).

文字列の末尾部分を逆順にN文字取り出す(_文字列,N,N,'') :- !.
文字列の末尾部分を逆順にN文字取り出す(_文字列,M,_N文字,_末尾からの逆順文字列) :-
        sub_atom(_文字列,_,1,M,_文字),
        M_2 is M + 1,
        文字列の末尾部分を逆順にN文字取り出す(_文字列,M_2,_N文字,_末尾からの逆順文字列_2),
        atom_concat(_末尾からの逆順文字列_2,_文字,_末尾からの逆順文字列).

%
%  sub_atom/5はPrologの中でも極めてスーパーな組込述語である。この述語を
%  使っての文字列操作について、いくつか述語定義をしてみた。
%