このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1252382593/516
#  2つの同じ要素数のリスト (Num a) => [a] を、 
#  片方を1要素分横にずらして和を取りたいです。 
#  たとえば [1, 2, 3] と [7, 8, 9] であれば 
#  [1, 2, 3, 0] と [0, 7, 8, 9] の和です。 
#   
#  今は定義を素直に実装して次のようにやってます。 
#  shearAdd :: (Num a) => [a] -> [a] -> [a] 
#  shearAdd as bs = zipWith (+) (as ++ [0]) (0 : bs) 
#   
#  もっと洗練された方法はあるでしょうか。 
#  たとえば (++) 演算子は左辺のリストの要素数が大きいと不利なので、 
#  これを改善できるとか。 
# 

shearAdd([A|R1],L2,[A|R3]) :-
        shearAdd_2(R1,L2,R3).

shearAdd_2([],L,L) :- !.
shearAdd_2([A|R1],[B|R2],[C|R3]) :-
        C is A + B,
        shearAdd_2(R1,R2,R3).