0

这就是我到目前为止所拥有的。我需要证明,如果两个站通过第三个站连接,它们是相互连接的

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) .
4

1 回答 1

0

您的第一个connected子句将因以下子句而失败:

?- connected(bremen, hamburg).

大概你打算写

connected(X,Y) :- adjacent_(X,Y) .

反而。

除了上述错误之外,您的代码似乎还不错。我唯一要补充的是,您并没有防范“循环”。例如,如果您试图查找柏林是否连接到富尔达,理论上您可能永远不会到达那里,因为以下循环:

柏林->汉诺威->奥斯纳布吕克- >不来梅- >汉堡->柏林(以此类推)。

因此,您还可以在代码中包含一个累加器,包含到目前为止访问的所有节点,这样如果当前节点已经出现在您的节点“路径”中,您就不允许您的子句成功。


PS。如果您只想知道 X 和 Z 是否连接,而不是有多少可能的方式,您还可以在每个子句!的末尾显式指定一个切割(即 ) 。connected

于 2016-11-06T01:33:28.677 回答