このディレクトリの索引
#  
#  @kamizen1 @sym_num 最初の述語は多分こんな感じ。 http://nojiriko.asia/prolog/twitter_by_kamizen1_20121109.html … 実行して確かめてはいないけれど。
#  
% ?- hir_zen( 'う゛おう゛う゛お---;;;;,,,,...', P ). の様に使う。ひらがな -> 全角カタカナ (ひらがな ではない文字は、素通りします。)

hir_zen( _文字列, _変換後 ) :-                        /* ここが質問のはじめ : main() */ 
    atom(_文字列),
    atom_chars( _文字列, _処理前リスト ),
    hir_zen_henkan( _処理前リスト, _処理後リスト ),
    atom_chars( _変換後, _処理後リスト ).

hir_zen( _変換後, _文字列 ) :-                        /* ここが質問のはじめ : main() */ 
    atom(_文字列),
    var(_変換後),
    atom_chars( _文字列, _処理前リスト ),
    hir_zen_henkan( _処理後リスト,_処理前リスト ),
    atom_chars( _変換後, _処理後リスト ).



hir_zen_henkan( [], [] ).                             /* 停止判定 */

hir_zen_henkan( [A,B|L], ['ヴ'|Z] ) :-                /* _処理前リストの最初の2文字が 'う', '゛' の場合 */
    atom_chars('う゛', V),
    V=[A,B],
    !,
    hir_zen_henkan( L, Z ).

hir_zen_henkan(L1, [ZZ|Z]) :-
    /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */
    \+(var(L1)),
    L1 = [A|L],
    hir( Hira ),
    nth1( N, Hira, A ),
    zen( Zen ),
    nth1( N, Zen, ZZ ),
    !,
    hir_zen_henkan( L, Z ).

hir_zen_henkan(L1, L2) :-
    /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */
    var(L1),
    \+(var(L2)),
    L2 = [ZZ|Z],
    L1 = [A|L],
    zen( Zen ),
    nth1( N, Zen, ZZ ),
    hir( Hira ),
    nth1( N, Hira, A ),
    !,
    hir_zen_henkan( L, Z ).

hir_zen_henkan( [A|L], [A|Z] ) :-                    /* _処理前リストの最初の1文字が、hir( **リスト** ). にない場合 */
    !,
    hir_zen_henkan( L, Z ).