Prolog - 需要了解规则正在做什么

时间:2012-01-17 20:34:58

标签: prolog nodes rule

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

overground( watfordjunction   , watfordhighstreet , 2 ). 
overground( watfordhighstreet , bushey            , 3 ). 
overground( bushey            , carpenderspark    , 3 ). 
overground( carpenderspark    , hatchend          , 2 ). 
例如:watford交界处到watfordhighstreet需要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).

据我所知,第1行首先检查事实中是否存在station1和station2。一旦发现旅程成立,切割也会结束回溯,以防止无限循环。

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

2 个答案:

答案 0 :(得分:1)

这意味着道路是双向的,路线的来源和目的地可以互换。

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

答案 1 :(得分:1)

  

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

这确实是它正在做的事情。这段代码很混乱;它可以更好地使用中间谓词编写,如

connected(A, B) :- overground(A, B, _).
connected(A, B) :- overground(B, A, _).