0

我有一个充满事实的数据库,例如:

overground( watfordjunction   , watfordhighstreet , 2 ). 
overground( watfordhighstreet , bushey            , 3 ). 
overground( bushey            , carpenderspark    , 3 ). 
overground( carpenderspark    , hatchend          , 2 ). 

例如:沃特福德路口到沃特福德大街需要 2 分钟。

然后我设计了一个规则,以便我可以测试从任何站点到另一个站点的旅程是否可以完成,包括任何反向旅程。

isjourney(Station1,Station2):-
   overground(Station1,_,_), overground(_,Station2,_),!; overground(Station2,_,_), overground(_,Station1,_),!.
isjourney(Station1,Station2):-
   overground(Station1,Station3,_), isjourney(Station3,Station2).
isjourney(Station1,Station2):-
   overground(Station3,Station2,_), isjourney(Station1,Station3).

我了解第一行首先检查事实中是否存在 station1 和 station2。一旦发现旅程为真,切割也结束回溯,以防止无限循环。

然后,第二条线路检查是否可以通过中间站(站 3)在站 1 和站 2 之间进行旅行。我感到困惑的是第 3 行......在我看来,它只是在做相反的事情,换句话说,检查与第 2 行相同的事情,但要进行反向旅行。但是我发现,如果我删除第 3 行并测试它仍然有效的代码,包括我是否测试反向旅程。如果规则的第二行可以检查是否可以进行正向和反向旅行,那么第三行是做什么的?

4

2 回答 2

1

这意味着道路是双向的,路线的起点和终点可以互换。

您的代码甚至不检查两个地方之间是否有路线:第一条规则足以true作为输出。如果第一条规则检查地点的存在,请给它一个不同的名称。检查存在并不等同于在它们之间建立路由。

于 2012-01-17T20:37:22.870 回答
1

在我看来,它只是在做相反的事情,换句话说,检查与第 2 行相同的东西,但检查的是反向旅程。

这确实是它似乎正在做的事情。这段代码非常混乱;最好使用中间谓词来编写,例如

connected(A, B) :- overground(A, B, _).
connected(A, B) :- overground(B, A, _).
于 2012-01-17T20:40:10.130 回答