Пролог - нужно понимать, что делает правило - PullRequest
0 голосов
/ 18 января 2012

У меня есть база данных, полная фактов, таких как:

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-я строка?

Ответы [ 2 ]

1 голос
/ 18 января 2012

Мне кажется, что он просто делает противоположное, другими словами, проверяет то же самое, что и строка 2, но для обратного пути.

Это действительно то, что кажетсяделает.Этот код очень запутанный;лучше написать его, используя промежуточный предикат, такой как

connected(A, B) :- overground(A, B, _).
connected(A, B) :- overground(B, A, _).
1 голос
/ 18 января 2012

Это означает, что дороги являются двусторонними, источник и пункт назначения маршрута могут быть взаимозаменяемы.

Ваш код даже не проверяет, существует ли маршрут между двумя местами: первого правила достаточно, чтобы получить true в качестве вывода. Если первое правило проверяет существование мест, дайте ему другое имя. Проверка существования не эквивалентна наличию маршрута между ними.

...