このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/827
#  [1] 授業単元:C  
#  [2] 問題文(含コード&リンク):  
#  http://ime.nu/codepad.org/qQfTmJyV  
#  リンク先のコードは分数を読み込み、その分数を約分した結果を表示するものの一部であり、 
#  このプログラムを完成させよ。ただし、分子と分母に0を入力すると終了する。 
#   
#  実行例 
#  bunshi:36 
#  bunbo:48 
#  3/4 
#  bunshi:-12 
#  bunbo:15 
#  -4/5 
#  bunshi:0 
#  bunbo:0 
#   
#  

'分数を読み込み、その分数を約分した結果を表示する' :-
'分数を読み込み、'(_分数),
その分数を約分した結果を(_分数,_約分した結果),
表示する(_分数,_約分した結果).

'分数を読み込み、'(_分数) :-
分子を読み込む(_分子),
分母を読み込む(_分母),
_分数 = _分子 / _分母.

分子を読み込む(_分子) :-
整数を得る(分子,_分子).

分母はを読み込む(_分母) :-
整数を得る(分母,_分母).

その分数を約分した結果を(_分子_1 / _分母_1,_分子 / _分母) :-
最大公約数(_分子_1,_分母_1,_最大公約数),
_分子 is _分子_1 // _最大公約数,
_分母 is _分母_1 // _最大公約数.

表示する(_分子_1/_分母_1,_分子/_分母) :-
writef('入力した分数 %t/%t\n約分した分数 %t/%t\n',[_分子_1,_分母_1,_分子,_分母]).

整数を得る(_催促文,_整数) :-
催促文を表示して整数を得る(_催促文,_整数),!.
整数を得る(_催促文,_整数) :-
整数を得る(_催促文,_整数).

催促文を表示して整数を得る(_催促文,_整数) :-
writef('%wを入力して下さい : ',[_催促文]),
整数を得る(_整数).

整数を得る(_整数) :-
行入力(_行),
整数検査(_行,_整数).

行入力(_行) :-
read_line_to_codes(user_input,_codes),
atom_codes(_行,_codes).

整数検査(_行,_整数) :-
atom_number(_行,_整数),
integer(_整数),!.
整数検査(_行,_) :-
writef('入力された %w は整数ではありません。再入力をお願いします。\n',[_行]),
fail.

最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :-
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(M,N,_最大公約数).

ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_最大公約数) :-
_剰余 is _被除数 mod _除数,
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_剰余,_最大公約数).

割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,0,_最大公約数) :-
割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!.
割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_剰余,_最大公約数) :-
'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_被除数,_除数,_剰余,_最大公約数).

割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :-
_除数 = _最大公約数.

'割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_被除数,_除数,_剰余,_最大公約数) :-
ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,_剰余,_最大公約数).