我要解决下面的练习中的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]. % expected result ?- 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]. % expected result
我不明白为什么...但我的代码是错误的,结果总是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)'成功。这是你的意图吗?那么当'C'没有实例化时,'cresc/2'的第二个子句具有'maxList(H,C)'。这可能是不正确的,我敢打赌你可能会在'>/2'上看到一个实例化错误(尽管你还没有确切地说过你尝试过的例子或者你得到了什么错误)。 – lurker
maxList是你写的内容,检查N是否是那些已经被控制的(C列表中的)最大的数字,并且即使L为空也是成功的。是的,实例化错误是我最初的问题,但更重要的是,似乎我的程序无法正常工作,我不明白为什么(所以我的语义问题)。 – JinLemon
而不是正确的序列([1,2,3,4])我只有一个错误 – JinLemon