Чтобы определить лучшую базу страны по фактору приоритета, пролог

Допустим, у нас есть эта база данных:

choice(marie, [peru,greece,vietnam]).
choice(jean,  [greece,peru,vietnam]). 
choice(sasha, [vietnam,peru,greece]). 

Мы хотим узнать лучшую страну на основе списка выбора каждого человека, элемент 0 в списке — это категория 3, вторая категория 2 и третья категория 1. Итак, спросив:

?- where([marie,jean,sasha],Country).

мы должны получить: Country = peru

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

where([],Count).
where([Name|L], Count) :-
    where(L, Count), 
    choice(Name,LPref), 
    calc(LPref,0,0,0,4) .
calc([],P,G,V,1).
calc([H|L],P,G,V,N) :-
    N1 is N-1,
    calc(L, P,G,V,N1),
    pays(H,P,G,V,N1).

pays(H,P,G,V,N) :- 
    H == 'peru',
    P is P+N.
pays(H,P,G,V,N) :- 
    H == 'greece',
    G is G+N.
pays(H,P,G,V,N) :- 
    H == 'vietnam',
    incr(V,N).

incr(I, I).
incr(I, K) :-
    J is I + 1,
    pays(H,J,G,V,N),
    incr(J, K).

person Mat    schedule 18.03.2020    source источник
comment
Это страдает от путаницы, связанной с тем, что предикаты рассматриваются как функции, возвращающие значение. Это не так, они просто возвращают true или false, а возвращаемые значения устанавливаются путем установки ограничений среди аргументов предиката. Например, pays(H,P,G,V,N):- H == 'peru',P is P+N. вообще ничего не делает, он вычисляет P+N, а затем проверяет, что он равен P, что обычно приводит к возврату false (pays — это «страна», верно?).   -  person David Tonhofer    schedule 18.03.2020
comment
См.: вычисление обработки списка в прологе, чтобы найти пункт назначения, который посетят друзья. Это точно такая же проблема с домашним заданием. Хотя это и не дубликат, вы должны были посмотреть на другие вопросы.   -  person Guy Coder    schedule 18.03.2020
comment
I can't get the value associated with a country to go back up the chain of choice. - Вам нужен accumulator. Просто загуглите Prolog accumulator и найдете много примеров   -  person Guy Coder    schedule 18.03.2020
comment
Без запуска вашего кода, с моей головы, ваш базовый случай calc([],P,G,V,1). имеет значения, но должен вернуть значения обратно, например. calc([],P,G,V,1,P,G,V). Да, переменные находятся там дважды, они унифицированы с переменными результата, которые нужно передать обратно, например. pays(H,P,G,V,N,PR,GR,VR).   -  person Guy Coder    schedule 18.03.2020