如何访问prolog列表中的元素?

时间:2014-04-17 06:38:03

标签: prolog eclipse-clp

所以我无法使用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创建一些可用于最终计算的占位符?

1 个答案:

答案 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之后。

BTW,ECLiPSe中的声明性循环是一种语法糖,它们被转换为系统的递归调用。

更新:变体,在评论中由@false建议,也适用于负数:

max_with_loop([First | Xs], Max) :-
    ( foreach(Xi, Xs), fromto(First, MaxPrev, MaxCurr, Max) do
        MaxCurr is max(MaxPrev, Xi) ).