Prolog 从列表中查找子序列

Prolog 从列表中查找子序列,prolog,Prolog,你好,我不知道怎么解决作业。我应该从列表中找到连续的元素组合。例如:列表[1,2,3] 应该给我[1],[2],[3],[1,2],[2,3],[1,2,3],但我的问题是,我的尝试也给了我[1,3] 代码: 这里的问题是,在给定列表的每个元素上,都有两个子句: 选择项目的第二行;及 第三行,不选择项目 这意味着您将生成所有列表,其中每个项目都可以选择包含或排除它 对于您问题中定义的子序列,这是一个不同的故事:您基本上有两个选择点: “开始”子序列的点;及 “停止”子序列的点 停止子序列实际上与

你好,我不知道怎么解决作业。我应该从列表中找到连续的元素组合。例如:列表[1,2,3] 应该给我[1],[2],[3],[1,2],[2,3],[1,2,3],但我的问题是,我的尝试也给了我[1,3]

代码:


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

  • 选择项目的第二行;及
  • 第三行,不选择项目
  • 这意味着您将生成所有列表,其中每个项目都可以选择包含或排除它

    对于您问题中定义的子序列,这是一个不同的故事:您基本上有两个选择点:

  • “开始”子序列的点;及
  • “停止”子序列的点
  • 停止子序列实际上与生成前缀相同:

    现在对于子序列,我们只需要在起始点上分支,然后添加剩余列表的前缀,如:

    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.
    

    谢谢你的帮助!我注意到这个解决方案不适用于我在prolog中构建的学校,但它确实适用于我的个人计算机@这是一个相当简单的通用解决方案。你们学校的序言到底有什么不及格的地方?可能
    前缀/2
    子序列/2
    是由该系统预定义的?
    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.