Вы можете сохранить список посещенных точек, чтобы избежать циклов, если вы хотите сохранить свои симметричные факты (хотя я не понимаю, почему). Я кодировал маленький пример без номера дороги:
road(a, b, 2).
road(b, a, 3).
road(b, c, 5).
get_road(a, c, FuelConsumed) :-
get_road(a, c, [a], 0, FuelConsumed).
Здесь мы вводим два новых параметра, третий - список посещенных точек, четвертый - аккумулятор для отслеживания потребленного топлива.
get_road(Start, End, _Visited, TotalFuel, FuelConsumed) :-
road(Start, End, Fuel),
FuelConsumed is TotalFuel + Fuel.
Если этот шаг является последним, мы останавливаемся.
get_road(Start, End, Visited, TotalFuel, FuelConsumed) :-
road(Start, Waypoint, Fuel),
\+ member(Waypoint, Visited),
NewTotalFuel is TotalFuel + Fuel,
get_road(Waypoint, End, [Waypoint|Visited], NewTotalFuel, FuelConsumed).
Иначе, мы выбираем точку, которую мы еще не посещали, и продолжаем.