私は大学で 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 は結果リストの末尾を空のリストと統合しません。これは、さまざまな演習で数回発生したことであり、何が間違っていたのかを知るのは良いことです...