문제

목록 목록이 있으며 가장 긴 목록을 찾아야합니다. 길이가 같은 것이 하나 이상 있으면 반환하는 것과 동일합니다. 감사.

도움이 되었습니까?

해결책

다음은 주어진 목표로 정의 된 단일 멤버를 찾기 위해 목록을 스캔하는 일반적인 술어입니다.

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

그래서 지금 당신이해야 할 일은 술어를 정의하는 것입니다 get_longer_list(L1, L2, L)대신 사용하십시오 get_bigger_number/3.

물론 일반적인 술어를 사용합니다 select_element/3 그다지 효율적이지 않을 수 있습니다. 예를 들어,이 계산은 프롤로그에서 느리기 때문에 동일한 목록의 길이를 여러 번 계산하지 않도록 노력해야합니다 (적어도 표준 방식으로 프롤로그에서 구현 된 경우).

다른 팁

내 aproach를 고려하십시오.

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] ;

인사!

우리는 정의합니다 longest/2 기반 max_of_by/3 함께 사용됩니다 length/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

다음은 효율적이고 이해하기 쉬운 또 다른 접근법입니다. 아이디어는 목록에서 모든 목록의 길이를 찾는 것입니다. 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).

% 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).

가장 긴 목록의 길이를 가지려면 :

%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),
   !.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top