【发布时间】:2026-01-04 15:30:02
【问题描述】:
我想在 Prolog 中解决以下练习:
对于整数列表
Zs,max_sequence(Zs,Xs)找到一个longest increasing subsequenceXs。
示例查询:
?- max_sequence([1,2,1,2,3,4,2,1,2,1],Xs)。 Xs = [1,2,3,4]。 % 预期结果 ?- max_sequence([1,2,1,2,3,4,2,1,6,7,7,2,1,8],Xs)。 Xs = [1,2,3,4,6,7,8]。 % 预期结果我不明白为什么...但是我的代码是错误的,结果总是false。
max_sequence(L,R) :-
cresc(L,[],R).
cresc([],[],[]).
cresc([H|T],C,[H|C]) :-
maxList(H,C),
\+ member(H,C),
cresc(T,C,C).
cresc([H|T],C,C) :-
member(H,C),
cresc(T,C,C).
cresc([H|T],C,C) :-
\+ maxList(H,C),
cresc(T,C,C).
maxList(_,[]).
maxList(N, [H|T]) :-
N>H,
maxList(N,T).
我想知道我解决问题的方法是否正确。 感谢您的帮助!
【问题讨论】:
-
您可以从
maxList/2谓词之类的东西开始。从语义上讲,这是什么意思?它的目的是什么?如果N大于L的每个成员,或者L无论如何都是空的,那么在我看来maxList(N, L)会成功。这是你的意图吗?那么cresc/2的第二个子句在C未实例化时具有maxList(H, C)。这可能是不正确的,我敢打赌您可能会在>/2上看到一个实例化错误(尽管您没有确切说明您尝试过的示例或遇到的错误)。 -
maxList 是您编写的内容,检查 N 是否是已控制的那些(在 C 列表中)中的最大数字,即使 L 为空也会成功。是的,实例化错误是我最初的问题,但最重要的是,我的程序似乎无法按我的意愿运行,而且我不明白为什么(所以我的是语义问题)。
-
我只有一个错误的序列而不是正确的序列([1,2,3,4])
-
您应该编辑您的问题并显示更新后的代码并修复了实例化错误。
-
“序列”是指“子序列”,“最大”是指“最长”? (从你给出的例子中猜测)如果你给你的问题一个正确的名字,它可能会引起正确的注意。