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

如何访问prolog列表中的元素?,prolog,eclipse-clp,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, _)

因此,我在尝试使用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创建某种占位符,用于最终计算

你的问题我不太清楚。这就是如何在ECLiPSe声明性循环的非负元素列表中找到最大值的方法:

max_with_loop(Xs, Max) :-
    ( foreach(Xi, Xs), fromto(0, MaxPrev, MaxCurr, Max) do
        MaxCurr is max(MaxPrev, Xi) ).
有趣的部分是fromto0,maxprov,MaxCurr,Max。使用此部分可以在迭代之间传输信息。最初maxprov变为0,每次迭代后MaxCurr变为maxprov,循环后MaxCurr变为Max

顺便说一句,ECLiPSe中的声明性循环是一种语法糖,系统将它们转换为递归调用

更新:注释中@false建议的变量,也适用于负数:

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

是的!任何帮助都将不胜感激……我想你想学习循环构造,但如果你真的只想知道列表的最大值,只需将max is maxXs.max_与_循环[-2,-1],-1一起写入即可。fails@false是的,正如我写的,它只适用于非负元素。你为什么不正确地定义它呢?甚至没有更多complex@false要处理负数,它应该初始化为-无穷大或第一个元素的值。我认为它增加了不必要的细节,我的目标是展示如何在迭代之间传输信息。嘿!max|u与_循环[I|Xs],max:-。。。fromtoI。。。