2

Prolog で Dijkstra Shortest Path を書くという課題が与えられました。

まず第一に、コードを理解しようとしているので、ソースまたは完全な実装は必要ありません (評価の一部はコードを説明することになります)。あちこちでいくつかの実装を見てきました、それがどのように機能するのかはよくわかりません。

これまでのところ、私はこれを持っています:

edge(1,2,12). %edge(From,To,Cost)
...
edge(1,4,13).

vertex(1,100000,nil,false).%vertex(Id, Weight, Over, Closed).
...
vertex(5,100000,nil,false).

neigh(V1, V2):-edge(V1,V2,_).

open_neigh(V1,V2):-edge(V1,V2,_),vertex(V2,_,_,P),not(P).

nearest_neighbor(From,Who,Cost):-findall(Node,neigh(From, Node),NeighL),
    nearest_in_list(From,Who,NeighL,Cost).

n_hood(From,NeighList):-findall(Node, neigh(From,Node), NeighList).

open_n_hood(From,NeighList):-findall(Node, open_neigh(From,Node), NeighList).

nearest_in_list(_,Who,[Who],_).
nearest_in_list(From,Who,[H,K|T],Cost) :-
    edge(From,H,C1),
    edge(From,K,C2),
    C1 =< C2,
    Cost is C1,
    nearest_in_list(From,Who,[H|T],Cost).

nearest_in_list(From,Who,[H,K|T],Cost) :-
    edge(From,H,C1),
    edge(From,K,C2),
    C1 > C2,
    Cost is C2,
    nearest_in_list(From,Who,[K|T],Cost).

問題は、頂点に関する情報を更新する方法がわかりません。assert/1 とrettract/1 を試しましたが、うまくいきません。静的プロシージャ vertex/4 を変更できないというエラーが表示されます。

私は現在 SWI Prolog を使用していますが、プログラムは Amzi でも動作するはずです! プロローグもそうなので、なるべくベーシックなプロローグに近づけたいと思っています。

ありがとう。

4

1 に答える 1