Pregunta

Tengo una base de datos llena de hechos como:

overground( watfordjunction   , watfordhighstreet , 2 ). 
overground( watfordhighstreet , bushey            , 3 ). 
overground( bushey            , carpenderspark    , 3 ). 
overground( carpenderspark    , hatchend          , 2 ). 

Ejemplo: Watford Junction a WatfordhighStreet toma 2 minutos.

Luego diseñé una regla para poder probar si se puede hacer un viaje de cualquier estación a otra, incluidos cualquier viaje inverso.

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).

Entiendo que la primera línea primero verifica si Station1 y Station2 existen en los hechos. Los cortes también finalizan el retroceso una vez que el viaje es cierto para evitar un bucle infinito.

La segunda línea luego verifica si un viaje entre la estación1 y la estación2 es posible a través de una estación intermedia (estación3). Lo que estoy confundido es esa tercera línea ... me parece que está haciendo lo contrario, en otras palabras, verificando lo mismo que la línea 2 pero para un viaje inverso. Sin embargo, lo que encuentro es que si elimino la tercera línea y pruebo el código que todavía funciona, incluso si pruebo un viaje inverso. Si la segunda línea de la regla puede verificar si es posible un viaje hacia adelante e inverso, ¿qué está haciendo la tercera línea?

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top