2

リストのリストがあり、それらの中で最も長いリストを見つける必要があります。同じ長さのものが複数ある場合、返されるものは同じです。ありがとう。

4

6 に答える 6

8

リストをスキャンして、特定の目標によって定義された単一のメンバーを見つける一般的な述語を次に示します。

select_element(Goal, [Head | Tail], Selected) :-
    select_element(Goal, Tail, Head, Selected).


select_element(_Goal, [], Selected, Selected).

select_element(Goal, [Head | Tail], Current, FinalSelected) :-
    call(Goal, Head, Current, Selected),
    select_element(Goal, Tail, Selected, FinalSelected).

述語を定義するとしましょう

get_bigger_number(N1, N2, N) :-
    N is max(N1, N2).

これで実行できます:

?- select_element(get_bigger_number, [5, 1, -2, 10, 3.2, 0], Selected).

Selected = 10

したがって、あとは predicate を定義し、 のget_longer_list(L1, L2, L)代わりに使用するだけですget_bigger_number/3

もちろん、一般的な述語 like を使用してselect_element/3もあまり効率的ではない可能性があります。たとえば、同じリストの長さを数回計算しないようにする必要があります。これは、Prolog ではこの計算が遅いためです (少なくとも Prolog で標準的な方法で実装されている場合)。

于 2009-11-02T11:34:35.827 に答える
3

私のアプローチを検討してください。

longest([L], L) :-
   !.
longest([H|T], H) :- 
   length(H, N),
   longest(T, X),
   length(X, M),
   N > M,
   !.
longest([H|T], X) :-
   longest(T, X),
   !.

次に、それを参照できます。

?- longest([[1]], N).
N = [1] ;

?- longest([[1],[2]], N).
N = [2] .

?- longest([[1],[2], [3,3,3], [2]], N).
N = [3, 3, 3] ;

?- longest([[1],[2], [3,3,3], [2]], N).
N = [3, 3, 3].

?- longest([[1],[2], [3,3,3], [2], [4,4,4,4]], N).
N = [4, 4, 4, 4] .

?- longest([[1],[2], [3,3,3], [2], [4,4,4,4]], N).
N = [4, 4, 4, 4] ;

ごきげんよう!

于 2009-11-05T19:17:31.953 に答える
2

と連携して使用されるlongest/2に基づいて 定義します。 max_of_by/3length/2

longest(Xss,Ys) :-
   max_of_by(Ys,Xss,length).

サンプルクエリ:

?- longest([[1],[2]],Xs).      % we expect   multiple solutions
  Xs = [1]                
; Xs = [2].                    % we    _get_ multiple solutions

?- longest([[2,1,3],[7,5],[1,8,2,3,1],[2,7,1,4]],Xs).
Xs = [1,8,2,3,1].              % succeeds deterministically
于 2015-08-06T09:19:25.310 に答える
2

これは、効率的で理解しやすい別のアプローチです。アイデアは、リスト内のすべてのリストの長さを見つけ、max_list最も長いリストの長さを取得するために使用し、その長さのリストを見つけることです。これには、最も長いリストをすべて返すという利点があります。

lengths([],[]).
lengths([H|T], [LH|LengthsT]) :-
    length(H, LH),
    lengths(T, LengthsT).

lengthLongest(ListOfLists, Max) :-
    lengths(ListOfLists, Lengths),
    max_list(Lengths, Max).

longestList(ListOfLists, Longest) :-
    lengthLongest(ListOfLists, Len),
    member(Longest, ListOfLists),
    length(Longest, Len).
于 2015-12-05T16:16:34.253 に答える
0

最長のリストの長さを取得するには:

%sample: longest([[2,1,3],[7,5],[1,8,2,3,1],[2,7,1,4]],L,LEN).

longest([L], L, _) :-
   !.
longest([H|T], H, _) :-
   length(H, N),
   longest(T, X, N),
   length(X, M),
   N > M,
   !.
longest([_|T], X, LEN) :-
   length(X, LEN),
   longest(T, X, LEN),
   !.
于 2011-04-29T13:26:33.503 に答える
0

% Correct again.

longest(LL,LX) :-
        findmax(Len,(append(_,[L|_],LL),length(L,Len)),MaxLen),
        append(_,[LX|_],LL),
        length(LX,MaxLen).

findmax(V,P,Max) :-
        findall(V,P,L),
        max(L,Max).

max([N],N) :- !.
max([N|R],Max) :-
        max(R,Max2),
        max3(N,Max2,Max).

max3(N,Max2,N) :- N > Max2,!.
max3(N,Max2,Max2).
于 2011-04-29T17:36:37.193 に答える