Как я могу получить доступ к элементу в списке для пролога?
Поэтому у меня возникают проблемы при попытке получить один элемент из списка, используя Prolog, без использования рекурсии, используя только циклы, такие как foreach, foreachelem и т. Д.
Итак, у меня есть список Xs = [1,2,3], и я хочу получить каждый элемент в отдельности. Лучшее, что я придумала, это...
sumOfList(Xs, Max) :-
( foreach(List, Xs), count(I, 1, _), param(Xs)
do
( foreach(List2, Xs), count(J, 2, _), param(Xs, I, List)
do
( List =< List2
-> Max is List2;
Max is List1
)
)
).
Это лучшее, что у меня есть на данный момент... Так что мне интересно, как мне создать какой-нибудь заполнитель для Макса, который можно использовать для окончательного расчета?
1 ответ
Ваш вопрос не очень понятен для меня. Вот как вы можете найти максимум в списке неотрицательных элементов с помощью декларативных циклов ECLiPSe:
max_with_loop(Xs, Max) :-
( foreach(Xi, Xs), fromto(0, MaxPrev, MaxCurr, Max) do
MaxCurr is max(MaxPrev, Xi) ).
Интересная часть fromto(0, MaxPrev, MaxCurr, Max)
, Используя эту часть вы можете передавать информацию между итерациями. Первоначально MaxPrev становится 0, после каждой итерации MaxCurr становится MaxPrev, после цикла MaxCurr становится Max.
Кстати, декларативные циклы в ECLiPSe являются своего рода синтаксическим сахаром, они переводятся системой в рекурсивные вызовы.
Обновление: вариант, предложенный @false в комментариях, который также работает с отрицательными числами:
max_with_loop([First | Xs], Max) :-
( foreach(Xi, Xs), fromto(First, MaxPrev, MaxCurr, Max) do
MaxCurr is max(MaxPrev, Xi) ).