Здравствуйте, я делаю работу для школы и пытаюсь получить максимальное число, которое возвращается с помощью рекурсии. Позвольте мне объяснить лучше с примерами:
У меня есть этот предикат:
li(_, []).
li(NAME, [H|T]) :-
find(NAME, H, Occur),
li(NAME, T).
li(NAME) :-
findall(T, pri(name(T), _, _, _), Info),
li(NAME, Info).
Предикат в строке 2 (найти), что он делает, давая имя и некоторую другую информацию, которую он вернет мне номер (Происходит). То, что я пытаюсь сделать, это узнать, каково наибольшее число (Occur) во всей рекурсии.
Ниже я попытался сделать несколько сравнений, но это не работает, он говорит, что Высшее не определено, Я знаю, потому что это не имеет никакого значения, связанного с ним, но я не знаю, как это сделать.
li(_, [], 0).
li(NAME, [H|T], Highest) :-
find(NAME, H, Occur),
li(NAME, T, Temp),
Temp is Occur,
Highest < Temp,
Highest is Temp.
li(NAME) :-
findall(T, pri(name(T), _, _, _), Info),
li(NAME, Info, Return),
write(Return).
Цель состоит в том, чтобы написать число в конце строки 3. Кто-нибудь знаете, что я могу сделать, чтобы это исправить? Спасибо.
РЕДАКТИРОВАТЬ
Я сделал еще одну попытку и сделал это:
li(_, [], 0).
li(NAME, [H|T], Highest) :-
find(NAME, H, Occur),
li(NAME, T, Temp),
Temp < Occur,
Temp is Occur,
Highest is Temp.
li(NAME) :-
findall(T, pri(name(T), _, _, _), Info),
li(NAME, Info, Return),
write(Return).
Это не вызывает никаких ошибок, но ничего не происходит, возвращается false и ничего не печатается.
EDIT2
Спасибо @David Tonhofer, теперь я могу получить самое высокое число. Но то, что я действительно хочу, это имя, которое ассоциируется с этим высоким числом.
li(NAME, [H|T], Highest, X) :-
find(NAME, H, Occur),
li(NAME, T, Temp),
Highest is max(Temp,Occur), X = ??.
Я шел шаг за шагом и сначала пытался получить наибольшее число, затем получаю имя, но теперь с МАКСОМ я не думаю, что я могу это знать.
Сначала я подумал что-то вроде этого:
li(_, [], 0).
li(NAME, [H|T], Highest, X) :-
find(NAME, H, Occur),
li(NAME, T, Temp),
Temp < Occur,
Temp is Occur,
Highest is Temp, X is NAME.
li(NAME) :-
findall(T, pri(name(T), _, _, _), Info),
li(NAME, Info, Return, X),
write(Return), write(X).