プロローグを独学しようとしています。以下に、無向グラフのノード間のすべてのパスを返す必要があると思われるコードをいくつか書きましたが、そうではありません。この特定のコードが機能しない理由を理解しようとしています (これにより、この質問が同様の Prolog パスファインディングの投稿と区別されると思います)。これを SWI-Prolog で実行しています。手がかりはありますか?
% Define a directed graph (nodes may or may not be "room"s; edges are encoded by "leads_to" predicates).
room(kitchen).
room(living_room).
room(den).
room(stairs).
room(hall).
room(bathroom).
room(bedroom1).
room(bedroom2).
room(bedroom3).
room(studio).
leads_to(kitchen, living_room).
leads_to(living_room, stairs).
leads_to(living_room, den).
leads_to(stairs, hall).
leads_to(hall, bedroom1).
leads_to(hall, bedroom2).
leads_to(hall, bedroom3).
leads_to(hall, studio).
leads_to(living_room, outside). % Note "outside" is the only node that is not a "room"
leads_to(kitchen, outside).
% Define the indirection of the graph. This is what we'll work with.
neighbor(A,B) :- leads_to(A, B).
neighbor(A,B) :- leads_to(B, A).
A --> B --> C --> D がループのないパスの場合、
path(A, D, [B, C])
真であるべきです。つまり、3 番目の引数には中間ノードが含まれます。
% Base Rule (R0)
path(X,Y,[]) :- neighbor(X,Y).
% Inductive Rule (R1)
path(X,Y,[Z|P]) :- not(X == Y), neighbor(X,Z), not(member(Z, P)), path(Z,Y,P).
まだ、
?- path(bedroom1, stairs, P).
は偽です。なんで?R1 に一致させるべきではありませんか
X = bedroom1
Y = stairs
Z = hall
P = []
以来、
?- neighbor(bedroom1, hall).
true.
?- not(member(hall, [])).
true.
?- path(hall, stairs, []).
true .
?
実際に評価してみると
?- path(A, B, P).
長さ 1 の解しか得られません。