【发布时间】:2021-03-15 16:40:13
【问题描述】:
我试图在 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
我知道问题在于我实际上是在将整数列表与整数进行比较,这意味着它们是不兼容的类型,但为什么会这样呢?我做错了什么?
【问题讨论】:
-
先看
flatten([1,[2,3],4],L)。 -
为什么开头只有一个
is_list([]).?不为空的列表怎么办? -
^^,此外,
is_list/1是一个内置功能,可以完全按照您的要求完成。没有你的定义,它就可以工作。旁注:add/3更好地称为append/3,它也是一个内置的。 :) -
而且......你不需要展平!只需遍历树寻找最大值(我认为这称为树上的“折叠”操作,而不是列表上的折叠操作)
-
@DavidTonhofer 我已经在我的答案中添加了一个基于聚合的代码,我相信它就是这样做的。
标签: list prolog nested-lists swi-prolog flatten