我有一个充满事实的数据库,例如:
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行是做什么的?
答案 0 :(得分:1)
这意味着道路是双向的,路线的来源和目的地可以互换。
您的代码甚至无法检查两个地方之间是否存在路线:第一条规则足以获得true
作为输出。如果第一个规则检查地点的存在,请给它一个不同的名称。检查存在并不等同于在它们之间建立路径。
答案 1 :(得分:1)
在我看来,它只是做了相反的事情,换句话说,检查与第2行相同的事情,但是为了反向旅程。
这确实是它正在做的事情。这段代码很混乱;它可以更好地使用中间谓词编写,如
connected(A, B) :- overground(A, B, _).
connected(A, B) :- overground(B, A, _).