このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/956
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):次のプログラムをstrcpy(a,b)を使わずに 
#  whileを使って同じことを行うプログラムを作れ。 
#  int main(void){ 
#    char a[64],*b; 
#    b="INFORMATION"; 
#    strcpy(a,b); 
#    printf("%s\n",a); 
#    return 0; 
#  }  
#  

b("INFORMATION").

'次のプログラムをstrcpy(a,b)を使わずに同じことを行うプログラムを作れ。' :-
        b(_b),
        strcpyもどき(_a,_b),
        writef('%t\n',[_a]).

strcpyもどき([],[]).
strcpyもどき([A|R1],[A|R2]) :-
        strcpyもどき(R1,R2).

%  ここではINFORMATIONがstringつまり文字コードのリストとして定義されている。
%
%  今日的にはstringはあまり使われないが、atom_charsなどを介さずリスト処理に
%  入れる魅力はある。アトムテーブルが無闇に増えない点も利点だが、
%  その代わりリストとしてスタックに負荷がかかる。  
%
%  今日、あまり使われなくなった理由は、
%  1) ダブルクォーツが情報として邪魔。この理由が一番大きいと思う。
%  2) 効率が悪い。どんなに工夫しても、リストのユニフィケーションは高負担。
%  3) 少なくとも、関数名はストリングではなく、アトムであり、functorや
%     =.. を使用するときに不整合な部分が現れる。
%  4) 表示文字に変換する記法が何通りもあり、それをoptionのprolog_flagで
%     指定することになっている。この指定方法を知らなかったり、習熟して
%     いないことがプログラムエラーの原因となる。
%  5) sub_atom/5のようなatom操作の強力な組込述語が開発された。
%  以上のような理由からだと思われる。
%
%
%  一般にProlog述語を定義する時は、引数の前半に入力引数、後半に
%  出力引数を集めるものだが、ここはstrcpyとstrcpyもどきの対応を
%  くっきりとさせるため、敢えて引数をひっくり返した。
%  ひっくり返してもまったく機能的には削がれることがないことを確認して下さい。
%