list - 如何在Prolog中查找嵌套列表中的最大元素?

标签 list prolog nested-lists swi-prolog flatten

我试图在Prolog中找到多层列表中的最大元素(意思是列表中的列表中的列表...)。问题是,我一一检查了所有谓词,它们都有效,除了实际上应该解决我的问题的谓词。我的方法是展平列表(使其成为单层)并找到该列表中的最大元素。这是我的代码:

is_list([]).

add([],L,L).
add([X|L1],L2,[X|L3]):-add(L1,L2,L3).

maximum([X|O],M) :- max(O,X,M),!.
max([X|O],Y,M) :- X=<Y, max(O,Y,M).
max([X|O],Y,M) :- X>Y, max(O,X,M).
max([],M,M).

flatten([],[]).
flatten([X|L1],[X|L2]):-not(is_list(X)),!,flatten(L1,L2).
flatten([X|L1],L2):-flatten(X,LX),flatten(L1,LL1),add(LX,LL1,L2).

maximum_in_multilayered_list(L,M):-flatten(L,L1),maximum(L1,N), M is N.

由于某种原因,我收到以下错误:

?- maximum_in_multilayered_list([1,[2,3],4],X).
ERROR: Type error: `[]' expected, found `[2,3]' (a list) ("x" must hold one character)
ERROR: In:
ERROR:   [13] [2,3]=<1
ERROR:   [12] max([[2|...],4],1,_7284) at c:/users/ace_m/documents/prolog/bp.pl:47
ERROR:   [11] maximum([1,...|...],_7328) at c:/users/ace_m/documents/prolog/bp.pl:46
ERROR:   [10] maximum_in_multilayered_list([1,...|...],_7366) at c:/users/ace_m/documents/prolog/bp.pl:75
ERROR:    [9] <user>
   Exception: (12) max([[2, 3], 4], 1, _7596) ? creep

我知道问题在于我实际上是将整数列表与整数进行比较,这意味着它们是不兼容的类型,但为什么会出现这种情况呢?我做错了什么?

最佳答案

删除你的 is_list([]) 就可以了。

事实上,任何非空列表都不被视为 is_list/1 Material ,因此对于 [1, 中的 [2,3], [2,3],4] 应用 flatten/2 定义中的第二个子句,并添加 X = [2,3] 按原样进入“扁平化”列表[X|L2]

但是 is_list/1 已经是一个内置谓词,它完全可以满足您的需求。


实现此目的的另一种方法是使用 library(aggregate) .

首先,我们定义一个可回溯谓词,它通过嵌套列表枚举所有非列表(即“普通值”)(取自 this 我最近的一些相关答案):

nembr(Z, A) :-    % member in nested lists
  is_list(A), member(B,A), nembr(Z,B)
  ;
  \+ is_list(A), A=Z.

然后

18 ?- nembr(X, [1,[2,3],4]).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
false.

19 ?- use_module(library(aggregate)).
true

20 ?- L = [1,[2,3],4], aggregate( max(X), nembr(X,L), R).
L = [1, [2, 3], 4],
R = 4.

关于list - 如何在Prolog中查找嵌套列表中的最大元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65129805/

相关文章:

python - 按 Python 列表中的逻辑连接优先级对操作数进行分组

python - 通过多个维度索引列表的方法

c - 具有链表内存转储的结构

python - 按分配为值的列表中的最高数字对字典中的数据进行排序? Python

数据库中的 Java 项目不会添加到我创建的列表中

python - 错误 : IndexError: string index out of range. 试图颠倒列表的顺序

python - 获取任意长度列表中每个列表的所有可能组合

prolog - 语法错误: Operator expected (SWI Prolog)

prolog - 在列表中查找第二个最小值

prolog - Prolog 目标运行时间成本的真实抽象度量