首页 > 解决方案 > 如何查找和输出包括最大数量(所有列表)的列表?序言

问题描述

我需要在 Prolog 的列表列表中找到最大数量,然后“打印”(在新列表中输出)包含此最大数量的列表。

例如:lists_with_max([[1,2,3],[2,3,44],[44,5,6]],Lists)。应该输出:Lists = [[2,3,44],[44,5,6]]

下面的代码是我能想到的最接近的代码并且没有错误,但它显然是错误的,因为每次它找到一个新的最大值然后输出错误的列表。

'max' 查找列表中的最大数量。'flat' “展平”列表。'maxl' 查找列表列表中的最大数量。

max([X], X).
max([H|T], H):-
    max(T, MaxT),
    H > MaxT.
max([H|T], MaxT):-
    max(T, MaxT),
    H =< MaxT.

flat([], []).
flat([H|T], [H|LT]):-
    atomic(H),
    flat(T, LT).
flat([H|T], L):-
    flat(T, LT),
    not(atomic(H)),
    flat(H, LH),
    append(LH, LT, L).

maxl(List,Max):-
    flat(List,Newlist),
    max(Newlist,Max).

lists_with_max([],[]).
lists_with_max([H|T],[H|L]):-
    maxl([H|T],Max),
    member(Max,H),
    lists_with_max(T,L).
lists_with_max([_H|T],L):-
    lists_with_max(T,L).

标签: listprolog

解决方案


这是使用构建谓词max_list/2、 maplist /3include/3memberchk/2的另一种方法:

lists_with_max(LL, LL1):-
  maplist(max_list, LL, ML),
  max_list(ML, M),
  include(memberchk(M), LL, LL1).

推荐阅读