0

私はプロローグでいくつかの問題を抱えています。2つの都市間のすべてのパスを返す述語を書き込もうとしていますが、現時点では無限ループで最初に見つかったパスを返します。どこが間違っているのかわかりませんが、私は一日中これを理解しようとしていて、どこにも行きません。

提供できるどんな助けもいただければ幸いです。

go:-
    repeat,
    f([],0,lon,spa,OP,OD),
    write(OP),
    write(OD),
    fail.

city(lon).
city(ath).
city(spa).
city(kol).

path(lon,1,ath).
path(ath,3,spa).
path(spa,2,kol).
path(lon,1,kol).

joined(X,Y,D):-
    path(X,D,Y);path(Y,D,X).

f(Ci_Vi,Di,De,De,PaO,Di):-
    append([De],Ci_Vi,PaO),
    !.
f(Cities_Visited,Distance,Start,Destination,Output_Path,Output_Distance):-
    repeat,
    city(X),
    joined(Start,X,D),
    not_member(X,Cities_Visited),
    New_Distance is Distance + D,
    f([Start|Cities_Visited],New_Distance,X,Destination,Output_Path,Output_Distance).

not_member(X,List):-
    member(X,List),
    !,
    fail.
not_member(X,List).

ここで期待している出力は[spa、ath、lon] 4 [spa、kol、lon]3です。

もう一度、助けていただければ幸いです。

よろしくお願いします。

4

1 に答える 1

1

あなたの解決策は本質的に正しいです。と入力f([],0,lon,spa,OP,OD)すると、期待どおりに最初のパスが取得されます。私が見ることができる唯一のエラーはrepeat、検索述語内で使用していることです。そのため、同じソリューションを計算し続けます。repeatビジネスロジック内で必要になることはほとんどありません。ソリューションのバックトラックは、すでにREPループに組み込まれています。それを取り出すと、期待どおりに2番目のパスが得られ、その後(正しく)失敗します。

于 2011-11-26T17:48:37.817 に答える