Как я могу получить доступ к элементу в списке для пролога?

Поэтому у меня возникают проблемы при попытке получить один элемент из списка, используя 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) ).
Другие вопросы по тегам