Могу ли я отслеживать значение, которое я получаю в другой переменной, работая в рекурсии? - PullRequest
0 голосов
/ 27 ноября 2011
predicates
          pathdistance(symbol,symbol,integer).
          solve(symbol,symbol,integer).

clauses
   pathdistance(a,b,10). 
   pathdistance(b,c,20).
   pathdistance(c,d,5).
   pathdistance(d,e,15). 
   pathdistance(a,d,5).
   pathdistance(c,e,10).

solve(X,Z,C):-
     pathdistance(X,Z,C).

solve(X,Z,C):-
     pathdistance(X,Y,Cost),
     solve(Y,Z,C),
     Cost is Cost+C.

goal
    solve(a,d,Cost).

Ответ, который я хотел получить за стоимость, является суммой всех C (общего расстояния) между a и d. Приведенный выше код не работает, он не позволяет мне взять новую переменную. Может кто-нибудь сделать изменения? в приведенном выше коде, чтобы я мог получить общее расстояние в стоимости. Помните, что я новичок в прологе, спасибо!

1 Ответ

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

Вам нужно использовать аккумулятор (еще одна переменная в вашем предикате решения):

pathdistance(a,b,10). 
pathdistance(b,c,20).
pathdistance(c,d,5).
pathdistance(d,e,15). 
pathdistance(a,d,5).
pathdistance(c,e,10).

solve(Start, End, Result):-
    solve(Start, End, 0, Result).

Здесь вы вводите свой аккумулятор и инициализируете его до 0.

solve(Start, End, TotalCost, Result) :-
    pathdistance(Start, End, Cost),
    Result is TotalCost + Cost.

Если этот шаг является последним, вашим результатом будет значение вашего аккумулятора (здесь он называется TotalCost) + последняя стоимость.

solve(Start, End, TotalCost, Result):-
    pathdistance(Start, Waypoint, Cost),
    NewTotalCost is TotalCost + Cost,
    solve(Waypoint, End, NewTotalCost, Result).

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

Надеюсь, это поможет.

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

...