【问题标题】:Prolog, List of lists contains another list exactlyProlog,列表列表完全包含另一个列表
【发布时间】:2014-12-10 14:53:44
【问题描述】:

我基本上想要实现的是,给定列表 A 的列表,我想要一个谓词来检查列表 B 的元素是否为 完全包含在列表A中。

例如:

A = [[1,2],[3,4],[5],[]] B = [1,2,3,4,5]

A = [[1,2],[3,4],[5],[]] B = [2,5,3,4,1]

结果为真,但是

A = [[1,2],[3,4],[5],[]] B = [1,2,3,4]

A = [[1,2],[3,4],[5],[]] B = [1,2,3,4,5,6]

两者都会导致错误。

这在prolog中可能吗?

确切的意思是: 顺序并不重要,它只需要包含所有元素。 另外,假设 B 列表不包含重复项。 因此,如果 A 包含重复项,我们应该得到错误的结果。

【问题讨论】:

  • 当然这是可能的。在 prolog 中,有 谓词,而不是 函数。他们不是真正的同一件事,也没有相同的行为。你应该看看flatten/2,这会让事情变得简单。
  • 根据您的示例,仍然不清楚 究竟 是什么意思。顺序重要吗?重复会发生什么?
  • append/2 可以回答
  • @lurker 和 Boris,感谢您的快速回复,我编辑了我的问题以便更好地描述我的问题。请记住,我是 prolog 的新手,所以对我来说没有“琐碎”的答案。
  • 这仍然没有意义。您的意思是“嵌套列表 A 中的元素集与列表 B 中的元素集相同”?或者,“嵌套列表 A 中的稳定排序元素与稳定排序列表 B 相同”?

标签: prolog declarative-programming


【解决方案1】:

简单的答案:

?- flatten([[1,2],[3,4],[5],[]], [1,2,3,4,5]).
true.

?- flatten([[1,2],[3,4],[5],[]], [1,2,3,4]).
false.

?- flatten([[1,2],[3,4],[5],[]], [1,2,3,4,5,6]).
false.

或者,

foo(A, B) :- % because I don't know how to call it
    flatten(A, B).

如果你说的是集合:

bar(A, B) :-
    flatten(A, A_flat),
    sort(A_flat, A_sorted),
    sort(B, A_sorted).

如果您不想删除重复项,可以使用msort/2

如果问题是“我如何实现flatten/2”,您可以在 SO 上找到几个答案。

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 2021-05-15
    • 2012-05-31
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    相关资源
    最近更新 更多