このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/780
#  [2]構造体についての問題です 
#  ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する. 
#  2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.  
#  実行例  
#  -----------------------------------------------------  
#  [1] Aさんのデータを入力  
#  [2] Bさんのデータを入力  
#  [3] 結果表示  
#  [9] 終了  
#  -----------------------------------------------------  
#  #コマンドを入力して下さい:1  
#  Aさんの生れた年は?:1967  
#  Aさんの生れた月は?:8  
#   
#  #コマンドを入力して下さい:3  
#  まだBさんのデータが入力されていません!  
#   
#  #コマンドを入力して下さい:2  
#  Bさんの生れた年は?:1987  
#  Bさんの生れた月は?:10  
#   
#  #コマンドを入力して下さい:3  
#  Aさんは 20年と2ヶ月 Bさんより年上です.  
#   
#  #コマンドを入力して下さい:9  
#  [3]環境 
#   [3.1] OS:Linux  [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C  
#  [4]1/31 
#  よろしくお願いします 
# 
# 

'2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示す' :-
        機能選択(_選択された機能),
        '2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示す'.

機能選択(_選択された機能) :-
        機能選択表示,
        write('コマンドを入力して下さい:'),
        get_line(Line),
        機能選択(Line,_選択された機能).

機能選択表示 :-
        write('-----------------------------------------------------  \n'),
        write('[1] Aさんのデータを入力 \n'), 
        write('[2] Bさんのデータを入力 \n'), 
        write('[3] 結果表示 \n'), 
        write('[9] 終了 \n'), 
        write('-----------------------------------------------------  \n').

機能選択('1') :-
        '[1] Aさんのデータを入力'.
機能選択('2') :-
        '[2] Bさんのデータを入力'. 
機能選択('3') :-
        '[3] 結果表示'.
機能選択('4') :-
        '[9] 終了'.

'[1] Aさんのデータを入力' :-
        write('Aさんのデータを入力します。\n'),
        write('Aさんの生れた年は?:'),
        get_integer(_年),
        write('Aさんの生れた月は?: '),
        get_integer(_月),!.

'[2] Bさんのデータを入力' :-
        write('Bさんのデータを入力します。\n'),
        write('Bさんの生れた年は?:'),
        get_integer(_年),
        write('Bさんの生れた月は?: '),
        get_integer(_月),!.

'[3] 結果表示' :-
        findall([_氏名,_年,_月],(
                    生年月日(_氏名,_生年月日_年,_生年月日_月)),
                _生年月日ならび),
        生年月日の差(_生年月日ならび,_年長氏名,_年下氏名,_年の差,_月の差),
        writef('%tさんは %t年と%tヶ月 %tさんより年上です.\n',[_年長氏名,_年下氏名,_年の差,_月の差]).

生年月日の差([[_氏名_1,_生年月日_年_1,_生年月日_月_1],[_氏名_2,_生年月日_年_2,_生年月日_月_2]],_年長氏名,_年下氏名,_年の差,_月の差) :-
        _紀元元年からの累積月_1 is _生年月日_年_1 * 12 + _生年月日_月_1,
        _紀元元年からの累積月_2 is _生年月日_年_2 * 12 + _生年月日_月_2,
        _月換算の差 is _生年月日累積月_1 - _生年月日累積月_2,
        生年月日の差(_月換算の差,_年長氏名,_年下氏名,_年の差,_月の差).

生年月日の差(_月換算の差,'A','B',_年の差,_月の差) :-
        _月換算の差 >= 0,
        _年の差 is _月換算の差 // 12,
        _月の差 is _月換算の差 mod 12.
生年月日の差(_月換算の差,'B','A',_年の差,_月の差).
        _月換算の差 < 0,
        _年の差 is abs(_月換算の差) // 12,
        _月の差 is abs(_月換算の差) mod 12.