Пролог - увеличение на заданное число - PullRequest
2 голосов
/ 12 октября 2019

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

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

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

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

1 Ответ

0 голосов
/ 12 октября 2019

Классическая ошибка в том, что вы здесь суммируете 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, <b>HopCost</b>),
    count(Through, Finish, <b>RestCost</b>),
    sum(<b>HopCost</b>, <b>RestCost</b>, <b>Cost</b>).
...