У меня есть база данных, полная фактов, таких как:
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).
Я понимаю, что первая строка сначала проверяет, существуют ли станции 1 и 2 в фактах. Сокращения также заканчиваются возвращением в исходное положение, когда путешествие оказывается верным, чтобы предотвратить бесконечный цикл.
Затем вторая строка проверяет, возможно ли путешествие между станцией 1 и станцией 2 через промежуточную станцию (станция 3). Что меня смущает, так это 3-я строка ... Мне кажется, что она просто делает противоположное, другими словами, проверяет то же самое, что и строка 2, но для обратного пути. Однако я обнаружил, что, если я удаляю 3-ю строку и проверяю код, он все равно работает, в том числе, если я проверяю обратный путь. Если вторая строка правила может проверить, возможна ли прямая и обратная дорога, то что делает 3-я строка?