-1

所以我在尝试使用 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 创建某种可用于最终计算的占位符?

4

1 回答 1

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。

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

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

max_with_loop([First | Xs], Max) :-
    ( foreach(Xi, Xs), fromto(First, MaxPrev, MaxCurr, Max) do
        MaxCurr is max(MaxPrev, Xi) ).
于 2014-04-17T17:30:47.503 回答