-1

そのため、再帰を使用せずに、foreach、foreachelem などのループのみに依存して、Prolog を使用してリストから単一の要素を取得しようとすると問題が発生します....

したがって、リスト 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 に答える