(Prolog)如何查找2个谓词之间是否存在连接

时间:2016-11-05 22:41:32

标签: prolog transitive-closure

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

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

1 个答案:

答案 0 :(得分:0)

您的第一个connected子句将失败,例如:

?- connected(bremen, hamburg).

据说你打算写

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

代替。

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

  

berlin - > hannover - > osnabruck - > bremen - > 汉堡 - > berlin (等等无限期)。

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

<小时/> <子> PS。如果您只想了解X和Z是否已连接,而不是有多少可能的方式,您还可以在每个!子句的末尾明确指定一个剪切(即connected