0

我基本上想要实现的是,给定列表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]

两者都会导致错误。

这在序言中可能吗?

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

4

1 回答 1

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-12-10T15:00:39.503 回答