Пролог: добавить список - PullRequest
1 голос
/ 06 июля 2019

Я не знаю, собираюсь ли я объяснить это понятно, но в принципе у меня есть проблема с этим: «Если расстояние меньше 190, комиссия составляет 10%, если расстояние больше, чем190 комиссия составляет 15%. "Что я могу сделать, чтобы включить комиссию из суммы расстояния?

conexion(a, b, 100).
conexion(a, c, 250).
conexion(b, c, 10).
conexion(b, d, 100).
conexion(c, d, 50).

route(A, B, Route):- conexion(A, B, C), Route = [[A, B]].
route(A, B, Route):- conexion(A, X, C), route = (X, B, Route1), Route = [[A, X] | Route1].

route2(A, B, Route, Dist):- conexion(A, B, C), Route = [[A, B]], Dist = [C].
route2(A, B, Route, Dist):- conexion(A, X, C), route2 = (X, B, Route1, Dist1), Route = [[A, X] | Route1], Dist = [C | Dist1].

sum(List, Cnt):- List = [], Cnt = 0.
sum(List, Cnt):- List = [X | R], sum(R, Cnt1), Cnt is Cnt1 + X.

distance(X, Y, Total):- route2(X, Y, route, Dist), sum(Dist, Total).

Когда я делаю запрос:

route2(a, b, R, D), sum(D, S).

вывод:

R = [[a, b]],
D = [100],
S = 100 ;
false.

1 Ответ

1 голос
/ 07 июля 2019

Я думаю, что вы делаете слишком много обработки списка здесь. Мы можем определить простой предикат route/4, который вычисляет маршрут вместе с расстоянием, например:

route(A, A, [A], 0).
route(A, C, [A|R], Dist) :-
    conexion(A, B, D0),
    route(B, C, R, D1),
    Dist is D0 + D1.

или мы можем использовать tail-call-оптимизацию с:

route(A, C, R, D) :-
    route(A, C, R, 0, D).

route(A, A, [A], D, D).
route(A, C, [A|R], D0, D) :-
    conexion(A, B, D1),
    D2 is D0 + D1,
    route(B, C, R, D2, D).

Затем мы можем добавить предикат route_with_commission, который просто вычисляет комиссию. Сначала мы можем ввести предикат помощника для расчета комиссии:

commission(D, C) :-
    D < 190,
    !,
    C is 0.1 * D.
commission(D, C) :-
    D >= 190,
    C is 0.15 * D.

и затем объедините два:

route_with_commission(A, C, R, D, Commission) :-
    route(A, C, R, D),
    commission(D, Commission).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...