从列表中查找子序列

时间:2018-10-08 15:01:58

标签: prolog

你好,我不知道如何解决作业。我应该从列表中找到连续的元素组合。例如:列表[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).

1 个答案:

答案 0 :(得分:1)

这里的问题是在给定列表的每个元素上,您有两个子句:

  1. 选择项目的第二行;和
  2. 您在第三行选择项目。

因此,这意味着您将生成所有列表,对于每个项目,可以选择包含或排除该项目。

对于子序列,即问题中定义的子序列,情况就不同了:您基本上有两个选择点:

  1. “开始”子序列的时间点;和
  2. “停止”子序列的位置。

停止子序列实际上与生成前缀相同:

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.