所以我无法使用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
)
)
).
这是我迄今为止最好的...所以我想知道,我如何为Max创建一些可用于最终计算的占位符?
答案 0 :(得分:4)
你的问题对我来说不是很清楚。这就是你如何使用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之后。
更新:变体,在评论中由@false建议,也适用于负数:
max_with_loop([First | Xs], Max) :-
( foreach(Xi, Xs), fromto(First, MaxPrev, MaxCurr, Max) do
MaxCurr is max(MaxPrev, Xi) ).