首页 > 解决方案 > Prolog检查2个列表是否具有相同数量的元素

问题描述

我正试图弄清楚如何做这件小事。例如,我有 2 个列表[1,1,2,3,4][2,1,4,3,1]我需要确认列表 1 中的所有元素是否都包含在列表 2 中,所以如果我将上述列表作为输入,这应该是正确的,但是如果它像这样[1,1,2,3,4]并且[2,1,4,3,1,1](三个 1)它应该给假,这必须在不使用排序功能的情况下完成。

标签: prolog

解决方案


我假设您知道如何将列表写为头尾 ( [H|L])。
所以你可以使用谓词member/2来要求第一个列表中的每个元素也都在第二个列表中,但这并不能解决重复的问题。在这种情况下,使用谓词length/2将无济于事。所以你需要一些能从列表中收回一个匹配元素的东西。您可以编写自己的查找和删除谓词或使用谓词append/3这样做。append/3被认为附加 2 个列表以形成第三个列表,但它也可以用于将一个列表分成两个。如果您将您的元素声明为第二个划分列表的头元素,您基本上可以获得“删除元素”功能。一旦你得到了 2 个划分的列表,将它们组合成一个新列表并再次调用谓词,但这次没有列表 1 中的头元素和重新附加列表。因此,在每一步中,您从每个列表中删除一个元素,直到您最终找到两个空列表 ( permut([],[]).)。如果出现了这两种情况以外的东西,那么这两个列表不是彼此的排列,并且谓词失败。

由于回溯其他位置没有用,我!在第二个列表中成功找到一个元素后插入了一个剪切 ( )。谓词在没有切割的情况下也有效。

permut([],[]).
permut([H|T], Compare):-
    append(C1, [H|C2], Compare),
    !,
    append(C1, C2, Cnext),
    permut(T, Cnext).

给出输出

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

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

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

推荐阅读