这是我到目前为止所拥有的。我需要证明,如果两个电台通过第三个电台连接,它们相互连接
station(hamburg).
station(bremen).
station(hannover).
station(berlin).
station(leipzig).
station(osnabruck).
station(stuttgart).
station(fulda).
station(munich).
adjacent(hamburg, bremen).
adjacent(hamburg, berlin).
adjacent(berlin, hannover).
adjacent(berlin, leipzig).
adjacent(leipzig, fulda).
adjacent(fulda, hannover).
adjacent(hannover, osnabruck).
adjacent(osnabruck, bremen).
adjacent(stuttgart, munich).
/* insert your clauses here */
adjacent_(X,Y) :-adjacent(Y,X) .
adjacent_(X,Y) :-adjacent(X,Y) .
connected(X,Y) :-adjacent(X,Y) .
connected(X,Z) :-connected(X,Y), adjacent_(Y,Z) .
答案 0 :(得分:0)
您的第一个connected
子句将失败,例如:
?- connected(bremen, hamburg).
据说你打算写
connected(X,Y) :- adjacent_(X,Y) .
代替。
除上述错误外,您的代码似乎还不错。我唯一要补充的是你没有防范“周期”。例如。如果你试图找到柏林是否与富尔达有关,理论上你可能永远不会到达那里因为以下周期:
berlin - > hannover - > osnabruck - > bremen - > 汉堡 - > berlin (等等无限期)。
因此,您还可以在代码中包含一个累加器,其中包含到目前为止访问过的所有节点,这样如果当前节点已经出现在节点“path”中,则不允许子句成功。
<小时/> <子> PS。如果您只想了解X和Z是否已连接,而不是有多少可能的方式,您还可以在每个
!
子句的末尾明确指定一个剪切(即connected
) 子>