path(A,B,Path)
A から B へのボード上のすべての有効なパスを生成する Prolog 関数があります。
この関数の出力は次のようになります。
?- path(0,2,Path).
Path = [0, 1, 2] ;
Path = [0, 3, 2] ;
Path = [0, 1, 4, 2] ;
Path = [0, 3, 4, 2] ;
Path = [0, 1, 4, 5, 3, 2] ;
などなど
有効なパスを含むリストの無限のセットを生成します。これらのパスの最短を取得したいだけです(ただし、いくつもあります)。つまりshortest(A,B,Path)
、ボード上の A から B への最短の有効なパスを生成する関数が必要です。
私が望む出力は次のとおりです。
?- shortest(0,2,Path).
Path = [0, 1, 2] ;
Path = [0, 3, 2] ;
false.
Prologの関数をいじって、setof
すべてのパスをセットにバインドし、そのセットに長さの制限を課しましたが、まだ機能していません。
これまでの私の下手な作業は次のようになります。setof
それは間違いなく間違っています。どのように機能し、このセットから最短のリストを見つける方法を理解していただければ幸いです。ありがとう!
shortest(A,B,MinPath) :-
setof(Path,path(A,B,Path),MinPath),
min(length(Path), length(MinPath)).