1

私は大学で Prolog を学び、自宅でのエクササイズ中に奇妙なことに出くわします。私は、はるかに大きなプログラムの一部である次の Prolog 節を書きました。

edges(X,Edges):-
    findall(Edge,(highway(X,Y,Edge);highway(Y,X,Edge)),Edges).

edgesList([],_).
edgesList([node(X)|InL],OutL):-
    member((node(X),Edges),OutL),
    edges(X,Edges),
    edgesList(InL,OutL).

次の事実を使用します。

highway(1,2,yellow). 
highway(2,3,blue). 
highway(1,3,yellow).

高速道路は、最初の 2 つの引数で 2 つのノードを記述し、3 番目の引数でエッジを記述する事実として見ることができます。すべての事実が一緒になって、接続されたグラフを形成します。

句edgeListを使用して、ノードごとにエッジをリストしたい

Result = [(node(1),[yellow,yellow]),(node(2),[blue,yellow]),(node(3),[blue,yellow])]

しかし、クエリを書くと:

edgesList([node(1),node(2),node(3)],List).

次の結果が得られます。

List = [(node(1),[yellow, yellow]), (node(2),[blue, yellow]), (node(3),[blue, yellow])|_G610]

何らかの理由で、メンバー述語が正しく使用されているにもかかわらず、Prolog は結果リストの末尾を空のリストと統合しません。これは、さまざまな演習で数回発生したことであり、何が間違っていたのかを知るのは良いことです...

4

1 に答える 1

1

問題は次の節にあります。

edgesList([],_).

最終的に、インスタンス化されていないテール (|_G610) でリストがいっぱいになるからです。

1つの解決策は次のとおりです。

edges(X,Edges):-
    findall(Edge,(highway(X,Y,Edge);highway(Y,X,Edge)),Edges).

edgesList([],[]).
edgesList([node(X)|InL],[(node(X),Edges)|T]):-
   edges(X,Edges),
   edgesList(InL,T).
于 2016-08-06T22:23:29.927 に答える