【问题标题】:Prolog - Most common occurring sequence of length N in a listProlog - 列表中最常见的长度为 N 的序列
【发布时间】:2017-11-01 02:29:29
【问题描述】:

我正在尝试查找出现在列表中的最常见的长度为 N 的序列。所以我应该写一个谓词 common(L,N,X) 以列表的形式给我这个序列。例如:common([1,2,3,2,3,1,4],2,X) 应该还给我X=[2,3]common([1,2,3,4,2,2,2,3,4],3,X) 应该回馈X=[2,3,4]common([1,2,3],1,X) 应该回馈X=[1] X=[2] X=[3]

当我们只寻找最常见的元素时,我已经阅读了几篇文章(所以 N=1 的情况),但我不知道如何为一般的 N 做到这一点。我不允许使用 if -then-else 或 clpfd。

我在想也许可以对元素进行分组,然后对它们进行排序,所以对于common([1,2,3,2,3,1,4],2,X),创建一个类似[[1,2],[2,3],[3,2],[2,3],[3,1],[1,4]] 的列表,然后将元素从最常见到最少排序。

【问题讨论】:

    标签: list prolog logic sequence


    【解决方案1】:

    我喜欢你的计划。以下是我获得重叠子序列的方法。

    首先,我们获取长度为 N 的列表的前缀:

    subsequences(L, N, Sub) :- append(Sub, _, L), length(Sub, N).
    

    这应该读作“Sub 是列表 L 的长度为 N 的子序列,如果 Sub,附加到其他东西产生 L,并且 Sub 的长度是 N。”这肯定会得到一个长度为 N 的 L 前缀。现在让我们看看递归情况:

    subsequences([_|L], N, Sub) :- subsequences(L, N, Sub).
    

    “否则,在 L 的尾部找到一个子序列。”这将产生多种解决方案:

    ?- subsequences([1,2,3,2,3,1,4], 2, X).
    X = [1, 2] ;
    X = [2, 3] ;
    X = [3, 2] ;
    X = [2, 3] ;
    X = [3, 1] ;
    X = [1, 4] ;
    

    findall/3是你的朋友,你可以用它来建立你想要的列表:

    ?- findall(X, subsequences([1,2,3,2,3,1,4], 2, X), Subsequences).
    Subsequences = [[1, 2], [2, 3], [3, 2], [2, 3], [3, 1], [1, 4]].
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      相关资源
      最近更新 更多