Факты в Прологе - PullRequest
       1

Факты в Прологе

3 голосов
/ 27 ноября 2011

Я пишу программу о дорогах ...

Например, у меня есть road(1, a, b, 2) (дорога № 1 от а до б, занимающая 2 единицы топлива). Дело в том, что если у меня есть road(1, a, b, 2), у меня тоже должно быть road(1, b, a, 2), но если я использую один, я не могу использовать другой, иначе программа будет зацикливаться.

Что я могу написать, чтобы, если программа использует этот факт, она не может использовать другой?

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

Вы можете использовать одно правило для захвата симметрии, но поставить его после всех других правил с тем же именем и арностью. Если существуют какие-либо решения для любого вашего запроса, они будут показаны перед тем, как войти в любой бесконечный цикл.

дорога (R, A, B, F): - дорога (R, B, A, F).

1 голос
/ 27 ноября 2011

Вы можете сохранить список посещенных точек, чтобы избежать циклов, если вы хотите сохранить свои симметричные факты (хотя я не понимаю, почему). Я кодировал маленький пример без номера дороги:

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

Иначе, мы выбираем точку, которую мы еще не посещали, и продолжаем.

1 голос
/ 27 ноября 2011

Я не уверен, что понял вас, но, возможно, -

    direct_road(1,a,b,2).
    direct_road(1,b,a,2).

    road(X,A,B,Y) :-
      direct_road(X,A,B,Y),
      direct_road(X,B,A,Y).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...