【问题标题】:Prolog: Split a list of size N into two lists of known size K and N-KProlog:将大小为 N 的列表拆分为两个已知大小为 K 和 N-K 的列表
【发布时间】:2018-06-13 07:06:52
【问题描述】:

我有一个整数列表,即 Keys,并希望将其拆分为两个列表 ListOfReqKeys 和 ListOfRewKeys,如标题中所述。

Keys =[1, 1, 3, 9, 1, 15]
ReqK = 3
ListOfReqKeys = [1, 1, 3], ListOfRewKeys = [9, 1, 15]

这两个列表的长度是已知的,分别是它的 ReqK 和 RewK。

append(ListOfReqKeys, ListOfRewKeys, Keys),
atom_codes(At, ListOfReqKeys),
atom_number(At, ReqK).

是否有内置谓词或更快的方法?

【问题讨论】:

  • 请提供示例输入和期望的输出,以及执行(或尝试执行)您想要的完整程序。那么请定义一下“更好”对您意味着什么。
  • @Enigmativity 感谢您的评论...这部分代码是否不足以让人们理解问题?
  • 不,不是。我希望能够运行您的代码并查看结果。阅读如何创建minimal reproducible example。
  • 您需要任意拆分能力,还是列表总是一分为二?如果您想更快,那么缩小要求有时会有所帮助。
  • 您的代码中包含append、atom_codes 和atom_number 似乎混淆了您所询问的内容。我不清楚该代码的用途。使用您的示例值,atom_codes(At, ListOfReqKeys) 将导致 At = '\001\001\003',然后 atom_number(At, ReqK) 将失败,因为绑定到 At 的原子不代表数字。

标签: list split prolog


【解决方案1】:

没有分裂。只有追加。

将长度为N 的列表拆分为长度为K 的前缀必然会留下长度为N-K 的后缀 - 无需测量/创建1 sup> 就这样。它只是是,通过构造。

因此,

split( K, L, A, B):-
   append( A, B, L),
   length(A, K).

很简单,不是吗。但是等等,它可以改进吗?不添加或删除任何内容?我们还能用它做什么?

1提示:你试过length(X, 2)吗? length(X, N)?

【讨论】:

  • 这就是我所需要的.. 是的,我已经尝试过了,当 X 与两个术语的列表统一时很满意。切换追加和长度的顺序会更好吗?直觉上似乎是这样,但我无法解释为什么
  • 是的,没错!当 append 是第一个时,它会尝试所有拆分列表的方法,比如对于 5 个元素,它会尝试 0,5 ; 1,4; 2,3; 3,2; 4,1; 5,0 分裂。但是当长度是第一个并且 K 已知时,它会生成占位符的 K 元素列表 - 元素尚不知道,但长度是(例如,对于 K=2,[_A,_B]),所以追加不会尝试所有组合,而是直接使用我们需要的组合 - 我们知道我们需要 K-long 前缀!
猜你喜欢
  • 2012-07-12
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多