prolog - 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)它应该给假,这必须在不使用排序功能的情况下完成。
解决方案
我假设您知道如何将列表写为头尾 ( [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.
推荐阅读
- curl - windows vbs 使用 curl 和 findstr 时无法获取错误级别
- ios - 下载完成前如何获取文件路径?
- php - 使用 cron 在服务器上使用 php 插入数据(不工作)
- scala - 如何使用字符串常量进行枚举
- terraform - 在创建 aws_eks_cluster 后从 terraform 运行时出现间歇性 kubectl 应用错误
- javascript - react-bootstrap-datetimerangepicker 没有取消/清除按钮
- python - 考虑到python中的长度限制,使用正则表达式查找特定的数字集
- node.js - 基于 Azure AD 证书的身份验证:如何在 Node JS 中指定证书路径?
- mysql - mysql.user 的列数错误。预期 50,发现 51。表可能已损坏
- flutter - 在 Flutter / Dart 中动态更改按钮的背景颜色