このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/797
#  (1)c言語(2)問題:最大公約数を求める関数を条件とベースに基づいて作成お願いします 
#  条件 
#  1:関数gcdの呼ばれた回数を記録  2:呼ばれた回数と、その時の引数a,bの値を表示 
#  実行結果:2つの整数を入力してください 
#  数値1:64 
#  数値2:120 
#  1回目の関数の呼び出し:a=64 ,b=120 
#  2回目の関数の呼び出し:a=120 ,b=64 
#  3回目の関数の呼び出し:a=64 ,b=56 
#  4回目の関数の呼び出し:a=56 ,b=8 
#  最大公約数は8です 
#  ベース 
#  #include <stdio.h>//ユークリッドのアルゴリズムで最大公約数gcdを求める 
#  int gcd(int fa , int fb); //プロトタイプ宣言 
#  int main(){  
#      int a,b,g; 
#      printf("2つの数値を入力してください。\n"); 
#      printf("数値1:"); 
#      scanf("%d",&a); 
#      printf("数値2:"); 
#      scanf("%d",&b); 
#      g = gcd(a,b); 
#      printf("最大公約数は%dです\n",g); 
#  } 
#  int gcd(int fa, int fb){ 
#      int r,ret; 
#      r =  fa % fb   ; 
#      if(r > 0){                    //不成立時が終了条件 
#          ret = gcd(fb,r);         //再帰呼び出し 
#      }else{ret = fb ; 
#      }return ret; 
#  } 
# 

#  実行結果:2つの整数を入力してください 
#  数値1:64 
#  数値2:120 
#  1回目の関数の呼び出し:a=64 ,b=120 
#  2回目の関数の呼び出し:a=120 ,b=64 
#  3回目の関数の呼び出し:a=64 ,b=56 
#  4回目の関数の呼び出し:a=56 ,b=8 
#  最大公約数は8です 

最大公約数を求める :-
        '2つの整数を入力'(_整数1,_整数2),
        最大公約数をユークリッドの互除法で求める(_a,_b,X),
        writef('最大公約数は%tです\n',[X]).

'2つの整数を入力'(_整数1,_整数2) :-
        write('2つの整数をカンマ区切りで入力してください '),
        数値1の入力(_整数1),
        数値2の入力(_整数2).

数値1の入力(_整数1) :-
        get_line(Line),
        整数入力診断(Line,_整数1),!.
数値1の入力(_整数1) :- 数値1の入力(_整数1).

数値2の入力(_整数2) :-
        get_line(Line),
        整数入力診断(Line,_整数2),!.
数値2の入力(_整数2) :- 数値2の入力(_整数2).

整数入力診断(Line,_整数) :-
        atom_to_term(Line,_整数,_),
        integer(_整数),!.
整数入力診断(Line,_整数) :-
        writef('入力された%tからは整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

最大公約数をユークリッドの互除法で求める(_a,_b,X) :-
        最大公約数をユークリッドの互除法で求める(_a,_b,X,1,Count).

最大公約数をユークリッドの互除法で求める(_a,_b,_b,Count,Count) :-
        0 is _a mod _b,
        writef(%t回目の呼び出し a=%t,b=%t\n,[Count,_a,_b]),!.
最大公約数をユークリッドの互除法で求める(_a,_b,X,Count1,Count) :-
        Mod is _a mod _b,
        writef(%t回目の呼び出し a=%t,b=%t\n,[Count1,_a,_b]),
        Count2 is Count + 1,
        最大公約数をユークリッドの互除法で求める(_b,Mod,X,Count2,Count) .