% カットの話題から逸れるが、設計が適切とは言い難いデータベースの集約問題。
% 駒場東大前から下北沢までの距離を求めなさい

井の頭線(渋谷,500).
井の頭線(神泉,900).
井の頭線(駒場東大前,1000).
井の頭線(池ノ上,600).
井の頭線(下北沢,500).
井の頭線(新代田,東松原,500).

駒場東大前から下北沢までの距離(_距離) :-
  findall((_駅,_次の駅までの距離),井の頭線(_駅,_次の駅までの距離),L),
  駒場東大前までを読み飛ばす(L,L2),
  駒場東大前から下北沢までの距離(L2,_距離).

駒場東大前までを読み飛ばす([(駒場東大前,_次の駅までの距離)|R],[(駒場東大前,_次の駅までの距離)|R]).
駒場東大前までを読み飛ばす([_|R1],R2) :-
  駒場東大前までを読み飛ばす(R1,R2).

駒場東大前から下北沢までの距離([(下北沢,_)|_],0).
駒場東大前から下北沢までの距離([(_,_次の駅までの距離)|R],_下北沢までの距離) :-
  駒場東大前から下北沢までの距離(R,_次の駅から下北沢までの距離),
  _下北沢までの距離 is _次の駅までの距離 + _次の駅から下北沢までの距離.