2 つのノード間のエッジ コスト/重みのリストを出力できるルールをプロローグでどのようにプログラミングすればよいでしょうか?
私のエッジの事実は次のように入力されます
edge(X,Y,Weight).
edge(Y,X,Weight).
2 つのノード間のエッジ コスト/重みのリストを出力できるルールをプロローグでどのようにプログラミングすればよいでしょうか?
私のエッジの事実は次のように入力されます
edge(X,Y,Weight).
edge(Y,X,Weight).
edge
つまり、すべてのファクトで一致を検索し、X to Y
それに関連するウェイトコストを出力するルールが必要です。
すべてのノードに後方ファクトがあることが確実であり(実際には、すべてのファクトに対してコードedge(X,Y,Edge_Weight)
にファクトが存在する必要があることを意味edge(Y,X,Edge_Weight)
します)、提供したようにこれら2つのエッジ間の重みに違いがないと仮定すると、ここにコードがあります。これにより、次の間にある可能性のあるすべてのエッジの重量コストが出力されますX and Y
。
find_edge_weight(X,Y, [D]):-
edge(X, Y, EdgeCost), /* Checking for an existing edge */
find_edge_weight(X,Y,[EdgeCost|D]), /* Adding weight to the list */
printList([D]). /* Printing list */
/* A rule used to print the list */
printList([EdgeCost|D]):-
write_ln(EdgeCost),
printList(D).
次のようなパス述語を定義できます。
path(Node1,Node2,W,Path_Weight) :- edge(Node1,Node2,Tmp), Path_Weight = W+Tmp.
path(Node1,Node2,W,Path_Weight) :- edge(Node1,NextNode,A), path(NextNode,Node2,A+W,Path_Weight).
これにより、Path_Weight 変数のソリューションが提供されます。それが役に立てば幸い。