このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/936
#  下のように定義される等比級数の第1項から第n項までの和 sum を 
#  求めるプログラムを for文を用いて作成せよ。 
#   
#   a1 = 1.0 
#   a i+1 = a i *0.5        
#   
#       n 
#  sum=  Σ(ai) 
#         i=1 
#   
#   
#   
#  すみません。かなりの時間ねばったんですが、できませんでした。 
#  お願いいたします。 
# 
# 

sum(1,_n,Sum) :-
        sum(1,_n,1,0,_sum).

sum(_n,_n,_ai,sum,_sum).
sum(_i,_n,_ai,sum_1,_sum) :-
         _ai_2 is _ai * 0.5,
         _sum_2 is _sum_1 + _ai,
         _i_2 is _i + 1,
         sum(_i_2,_n,_ai_2,_sum_2,_sum).        

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

f(X,Y) :- Y is X * 0.5.

sum(1,_n,Sum) :-
        sum(1,_n,1,P,0,_sum).

sum(_n,_n,_ai,_sum,_sum).
sum(_i,_n,_ai,_sum_1,_sum) :-
         f(_ai,_ai_2),
         _sum_2 is _sum_1 + _ai,
         _i_2 is _i + 1,
         sum(_i_2,_n,_ai_2,_sum_2,_sum).        

%  
%  大事なことは、http://nojiriko.asia/prolog/c152_503.html で定義したシグマは使えないことだ。
%  この定義では式に関係する変数は第一引数だけであり、一つ前の計算結果に
%  依存することがない。計算は完結していてデータの連関はない。
%  データの連関が無いから、findall/3を使用できた。すなわち非決定性として、
%  バックトラックさせることができた。
%  ここでの例では_ai_2 は _ai に依存する。このようなケースでは再帰述語として書く。
%  更に言えば、ここでf/2として定義している本体部分を式として引数に持たせてはならない。
%