このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1289913298/508
#  [1] 授業単元:画像処理 
#  [2] 問題文(含コード&リンク): すべての点について、もっとも近い点通しを結ぶ。 このとき、結んだ線分の 
#  長さの合計を求めなさい。  
#  

すべての点について、もっとも近い点通しを結ぶ。このとき、結んだ線分の長さの合計を求めなさい。(_すべての点ならび,_長さの合計) :-
        すべての点について、もっとも近い点通しを結ぶ。(_すべての点ならび,_すべての点ならび,_重複を許す最も近い線分ならび),
        重複する線分を取り除く(_重複を許す最も近い線分ならび,_最も近い線分ならび),
        このとき、結んだ線分の長さの合計を求める。(_最も近い線分ならび,_長さの合計).

すべての点について、もっとも近い点通しを結ぶ。([],_,[]) :- !.
すべての点について、もっとも近い点通しを結ぶ。([[_点X座標,_点Y座標]|R1],_すべての点ならび,[[_点X座標,_点Y座標,_最も近い点のX座標,_最も近い点のY座標]|R3]) :-
        findmin([_線分の長さ,_最も近い点のX座標,_最も近い点のY座標],(
                    append(_,[[X,Y]|_],_すべての点ならび),
                    \+((X=_点X座標,Y=_点Y座標)),
                    _線分の長さ is sqrt((X-_点X座標) * (X-_点X座標) + (Y-_点Y座標) * (Y-_点Y座標)),
                [_線分の長さ,_最も近い点のX座標,_最も近い点のY座標]),
        すべての点について、もっとも近い点通しを結ぶ。(R1,_すべての点ならび,[[_点X座標,_点Y座標,_最も近い点のX座標,_最も近い点のY座標]|L1],R3).

重複する線分を取り除く(_重複をゆるされた最も近い線分ならび,_最も近い線分ならび) :-
        findall([X1,Y1,X2,Y2],(
                    append(L0,[[X1,Y1,X2,Y2]|R],_重複をゆるされた最も近い線分ならび),
                    \+(append(_,[[X2,Y2,X1,Y1]|_],L0))),
                _最も近い線分ならび),!.

このとき、結んだ線分の長さの合計を求めなさい。([[X1,Y1,X2,Y2]|R1],_長さの合計) :-
        _長さ is sqrl((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2)),
        このとき、結んだ線分の長さの合計を求めなさい。(R1,_長さの合計の二),
        _長さの合計 is _長さ + _長さの合計の二.

このとき、結んだ線分の長さの合計を求める。(_最も近い線分ならび,_長さの合計) :-
        findsum(_距離,(
                    append(L0,[[X1,Y1,X2,Y2]|_],_最も近い線分ならび),
                    _長さ is sqrt((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2))),
                _長さの合計),!.