このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1289016056/350
#  今週から授業がPrologに入り、来週のテストまでに仕上げてくるようにと課題を渡され 
#  いろいろと考えてみてメソッドはこれで合っていると思うのですが、 
#  肝心の再帰処理でのリストの作成がわからなくて詰まっています。 
#  どなたか助けてもらえないでしょうか? 
#   
#  //入力と出力 
#  ?- nextItem( [146, 394, 882, 1730, 3082], N). 
#  N = 5106 
#   
#   
#  /*メソッド 
#  146,  394,  882,  1730,   3082 
#     248,  488,  848,   1352 
#          240,  360,  504 
#             120,  144 
#                 24 
#   
#  隣り合う数字の差分を新しいリストに出力しつづける 
#  (248 = 394-146, 488= 882-394,...) 
#  リストの最後まで行ったら、終了 
#   
#  新しいリストで繰り返し同じ処理を行う 
#  リストの数列の長さが1になったら終了 
#  今まで作成したリストの最後の数字をすべて足し算する。 
#   
#  N = 24 + 144 + 504 + 1352 + 3082 
#  N = 5106 
#   
#  */メソッド 
# 
# 

nextItem(List,X) :-
        nextItem_1([List],X).

nextItem_1([[N]|R],X) :-
        sumLastElements([[N]|R],X),!.
nextItem_1([L|R],X) :-
        nextItem_2(L,L2),
        nextItem_1([L2,L|R],X).

sumLastElements([],0).
sumLastElements([List|R],X) :-
        lastElement(List,LastElement),
        sumLastElements(R,Y),
        X is LastElement + Y.

nextItem_2([_],[]).
nextItem_2([N1,N2|R1],[N3|R2]) :-
        N3 is N2 - N1,
        nextItem_2([N2|R1],R2).

lastElement([LastElement],LastElement) :- !.
lastElement([_|R],LastElement) :-
        lastElement(R,LastElement).