你好,我不知道如何解决作业。我应该从列表中找到连续的元素组合。例如:列表[1,2,3] 应该给我[1],[2],[3],[1,2],[2,3],[1,2,3]但我的问题是我的尝试也给了我[1,3 ]
代码:
subseq([], []).
subseq([H|T], [H|R]) :- subseq(T, R).
subseq([_|T], R) :- subseq(T, R).
答案 0 :(得分:1)
这里的问题是在给定列表的每个元素上,您有两个子句:
因此,这意味着您将生成所有列表,对于每个项目,可以选择包含或排除该项目。
对于子序列,即问题中定义的子序列,情况就不同了:您基本上有两个选择点:
停止子序列实际上与生成前缀相同:
myprefix(_, []).
myprefix([H|T], [H|T2]) :-
myprefix(T, T2).
所以现在对于子序列,我们只需要分支到起点,然后添加其余列表的前缀,例如:
subsequence([H|T], [H|T2]) :-
myprefix(T, T2).
subsequence([_|T], T2) :-
subsequence(T, T2).
然后产生预期的结果:
?- subsequence([1, 2, 3], X).
X = [1] ;
X = [1, 2] ;
X = [1, 2, 3] ;
X = [2] ;
X = [2, 3] ;
X = [3] ;
false.