我有一个充满事实的数据库,例如:
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 行并测试它仍然有效的代码,包括我是否测试反向旅程。如果规则的第二行可以检查是否可以进行正向和反向旅行,那么第三行是做什么的?