Пролог - приращение на заданное число

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

link(a, b, 100).
link(b, c, 223).
link(c, d, 311).

Я хочу узнать, возможен ли обход, и, если это возможно, вернуть общую стоимость.

Так что вопрос ?-count(a, d, X). возвращает X = 634.

Вот моя попытка сделать это:

sum(A, B, X) :-
    X is A + B.
count(Start, Finish, Cost) :-
    link(Start, Finish, Cost).
count(Start, Finish, Cost) :-
    link(Start, Through, Tempcost),
    count(Through, Finish, Newcost),
    sum(Cost, Tempcost, Newcost).

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

Мой текущий код возвращает ошибку «Недостаточный аргумент. Создан экземпляр». Я знаю, что это часто как-то связано с порядком кода, поэтому я попытался изменить его, но пока безуспешно.


person Xi Xamiti    schedule 12.10.2019    source источник


Ответы (1)


Классическая ошибка состоит в том, что здесь вы суммируете Cost с Tempcost до Newcost. Но Newcost - вот стоимость перехода с Through на Finish.

Таким образом, отношение происходит в обратном порядке, как вы его определяете. Можно сказать, что Cost для перехода от Start к Finish равно стоимости перехода от Start к ThroughHopCost) плюс RestCost: стоимость перехода с Through на Finish:

sum(A, B, X) :-
    X is A + B.

count(Start, Finish, Cost) :-
    link(Start, Finish, Cost).
count(Start, Finish, Cost) :-
    link(Start, Through, HopCost),
    count(Through, Finish, RestCost),
    sum(HopCost, RestCost, Cost).
person Willem Van Onsem    schedule 12.10.2019