このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/719
#  
#  (1)%で始まっていればコマンドに応じた処理ができるように分岐処理を書く
#  	%Q:プログラムの終了
#  	%C:メモリ中に保持しているデータの登録数を出力
#  	%P:0~99番目までの100人分のデータが登録されている場合
#  		%P 8	…0番目→7番目の順で表示
#  		%P -10	…90番目→99番目の順で表示
#  	出力例:
#  	
#  		ID		: 100023
#  		Name	: Tokyo
#  		Date	: 1900/1/1
#  		Addr	: Tokyoto.......
#  		Memo	: aaeiou 1234566....
#  		
#  		ID		: 100048
#  		Name	: Osaka
#  		Date	: 1900/2/2
#  		Addr	: Osakafu.......
#  		Memo	: abcde 124816....
#  
#  (2)%で始まっていなければデータを格納
#  (3)ループするようにしておいて何行でも入力可能にする(%Qでプログラムを終了)
#  
#  
#  
#  以下プログラムですが実行してもうまくいきません。
#  とりあえずどういった感じで作っているか雰囲気だけでも分かってもらえればと思います。
#  

プログラム :-
        データまたはコマンドの入力(_データまたはコマンド行),
        コマンドループ(_データまたはコマンド行,_診断),
        _診断 = 終了.

データまたはコマンドの入力(_データまたはコマンド行) :-
        get_line(_データまたはコマンド行).

コマンドループ(_データまたはコマンド行,_診断) :-
        sub_atom(_データまたはコマンド行,0,1,_,'%'),
        split(_データまたはコマンド行,['%',' '],[_コマンド|_引数],
        コマンドの実行(_コマンド,_引数,_診断).
コマンドループ(_データまたはコマンド行,_診断) :-
        \+(sub_atom(_データまたはコマンド行,0,1,_,'%')),
        データ入力(_データまたはコマンド行,_診断).
コマンドループ(_,_診断) :-
        データまたはコマンドの入力(_データまたはコマンド行),
        コマンドループ(_データまたはコマンド行,_診断).

コマンドの実行('Q',_,終了) :-
コマンドの実行('C',_,true) :-
        count(clause(データ(_),_),_登録データ数),
        writef('登録データ数 = %t\n',[_登録データ数]).
コマンドの実行('P',[N],true) :-
        N < 0,
        N >= -50,
        M1 is 100 + N,
        M2 is 0 - N - 1,
        for(M1,M,M2),
        データ(M,_データ),
        writef('%t\n',[_データ]),
        M = M2,!.        
コマンドの実行('P',[N],true) :-
        N >= 0,
        N =< 100,
        M1 is 0,
        M2 is N - 1,
        for(M1,M,M2),
        データ(M,_データ),
        writef('%t\n',[_データ]),
        M = M2,!.        
コマンドの実行(_,_,false).

データ入力(_データ,true) :-
        findmax(N,データ(N,_),Max),
        Max2 is Max + 1,
        assertz(データ(Max2,_データ)),!.
データ入力(_データ,true) :-
        assertz(データ(0,_データ)).