このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/526
#  【質問テンプレ】  
#  [1] 授業単元: プログラミング演習 
#  [2] 問題文 
#  巡回セールスマン問題の厳密解を総当たり法で求めるプログラムを、再帰呼び出しを用いて作成せよ 
#  (例)  1  2  3  4  5  6 
#    1  0  470 550 420 300 200 
#    2 470   0 800 900 770 560 
#    3 550 800   0 330 650 750 
#    4 420 900 330   0 450 400 
#    5 300 770 650 450   0 180 
#    6 200 560 750 400 180   0 
#  

隣接(東京,埼玉,50).
隣接(埼玉,東京,50).
隣接(埼玉,群馬,80).
隣接(群馬,埼玉,80).
隣接(群馬,栃木,60).
隣接(栃木,群馬,60).
隣接(栃木,茨木,65).
隣接(茨木,栃木,65).
隣接(茨木,千葉,65).
隣接(千葉,茨木,65).
隣接(千葉,東京,20).
隣接(東京,千葉,20).
隣接(埼玉,茨木,90).
隣接(茨木,埼玉,90).

'巡回セールスマン問題の厳密解を総当たり法で求めるプログラムを、再帰呼び出しを用いて作成せよ'(_出発都市,LL) :-
        setof(_都市,[_都市,_隣接都市,_距離] ^ (
                    隣接(_都市,_隣接都市,_距離)),_都市ならび),
        length(_都市ならび,_都市数),
        '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,[],LL).

'巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,LL,LL) :-
        setof(_都市_2,[_都市,_都市_2,_距離,LL] ^ (
                    member([_都市,_都市_2,_距離],LL)),LL2),
        length(LL2,_都市数).
'巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_出発都市,L1,L) :-
        隣接(_出発都市,_隣接都市,_距離),
        \+(member([_出発都市,_隣接都市,_],L1)),
        \+(member([_隣接都市,_出発都市,_],L1)),
        '巡回セールスマン問題の厳密解を総当たり法で求める'(_都市数,_隣接都市,[[_出発都市,_隣接都市,_距離]|L1],L).