Допустим, у нас есть эта база данных:
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).
pays(H,P,G,V,N):- H == 'peru',P is P+N.
вообще ничего не делает, он вычисляетP+N
, а затем проверяет, что он равенP
, что обычно приводит к возвратуfalse
(pays
— это «страна», верно?). - person David Tonhofer   schedule 18.03.2020I 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.2020calc([],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