列表序言中的第二大
second largest from a list prolog
我正在编写一个函数,如果 E 是列表中的第二大元素,则 return 为真,尤其是尝试使用库 https://www.swi-prolog.org/pldoc/man?section=lists
像这样:
secLarg([], E).
secLarg([_], E).
secLarg([T], E) :- L is max_member(T, E), delete(T, L), max_member(E, L).
所以使用某种库函数组合 max_member 并删除,但是这个解决方案不起作用,因为 max_member 似乎只 return true/false,而不是具体最大的元素是什么。您知道如何使用这些函数以任何方式确定 E 是否是第二大元素吗?
问题是L is max_member(T, E)
没有多大意义。谓词没有 return 值:它要么成功,要么失败。它使用 unification 将变量与结果统一起来。
如果使用[T]
统一,则只会统一正好一个元素的列表。而您可能希望统一具有任意数量元素的列表。
delete/3
也 不 改变列表,它生成一个新列表,其中删除了最大的成员:
secLarg(Xs, E) :-
max_member(Lg, <b>Xs</b>),
delete(Xs, Lg, <b>Xs1</b>),
max_member(E, <b>Xs1</b>).
写secLarg([], E)
和secLarg([_], E)
也没有多大意义,因为对于这样的列表,没有第二大的:
% <s>secLarg([], E)</s>.
% <s>secLarg([_], E)</s>.
secLarg(Xs, E) :-
max_member(Lg, <b>Xs</b>),
delete(Xs, Lg, <b>Xs1</b>),
max_member(E, <b>Xs1</b>).
注意 delete/3
将删除 所有 具有给定值的元素。确实:
?- delete([1,4,2,5,4], 4, R).
R = [1, 2, 5].
所以如果存在多次出现最大值的列表,则不会select最大值(也是第二大的)
我正在编写一个函数,如果 E 是列表中的第二大元素,则 return 为真,尤其是尝试使用库 https://www.swi-prolog.org/pldoc/man?section=lists
像这样:
secLarg([], E).
secLarg([_], E).
secLarg([T], E) :- L is max_member(T, E), delete(T, L), max_member(E, L).
所以使用某种库函数组合 max_member 并删除,但是这个解决方案不起作用,因为 max_member 似乎只 return true/false,而不是具体最大的元素是什么。您知道如何使用这些函数以任何方式确定 E 是否是第二大元素吗?
问题是L is max_member(T, E)
没有多大意义。谓词没有 return 值:它要么成功,要么失败。它使用 unification 将变量与结果统一起来。
如果使用[T]
统一,则只会统一正好一个元素的列表。而您可能希望统一具有任意数量元素的列表。
delete/3
也 不 改变列表,它生成一个新列表,其中删除了最大的成员:
secLarg(Xs, E) :-
max_member(Lg, <b>Xs</b>),
delete(Xs, Lg, <b>Xs1</b>),
max_member(E, <b>Xs1</b>).
写secLarg([], E)
和secLarg([_], E)
也没有多大意义,因为对于这样的列表,没有第二大的:
% <s>secLarg([], E)</s>.
% <s>secLarg([_], E)</s>.
secLarg(Xs, E) :-
max_member(Lg, <b>Xs</b>),
delete(Xs, Lg, <b>Xs1</b>),
max_member(E, <b>Xs1</b>).
注意 delete/3
将删除 所有 具有给定值的元素。确实:
?- delete([1,4,2,5,4], 4, R).
R = [1, 2, 5].
所以如果存在多次出现最大值的列表,则不会select最大值(也是第二大的)