prolog - 在 prolog 中为多集编写联合操作
问题描述
在序言中有一种标准方法来定义两个集合的联合
但我想为多集合编写联合函数。这意味着如果第一组有 [1,2] 而
第二组有 [2,3] 那么输出应该是 [1,2,2,3]。
我该如何编写这样的函数。
解决方案
Prolog中没有Set类型。您所引用的只是列表。union
谓词将两个具有假定唯一元素的列表组合到一个新列表中,其中元素再次唯一。一组中的顺序无关紧要。当您传递一个无序/非集合列表时,您会看到这一点。
% both ordered, but result is not
?- union([1, 2, 5, 6], [3, 4, 7, 8], S).
S = [1, 2, 5, 6, 3, 4, 7, 8].
% sets, not ordered
?- union([1, 2, 3], [3, 2, 4, 5], S).
S = [1, 3, 2, 4, 5].
% multisets, not ordered
?- union([1, 2, 3], [3, 2, 4, 5, 5], S).
S = [1, 3, 2, 4, 5, 5].
要创建一个多重集,即保留集合并集中的所有元素,您可以只组合列表,同时按照您的意愿对它们进行排序。形式上,多重集也没有排序,所以如果排序无关紧要,您可以将第二个列表附加到第一个列表,这也适用于您的示例:
?- append([1, 2, 4], [2, 3, 4, 5], S).
S = [1, 2, 4, 2, 3, 4, 5].
?- append([1, 2], [2, 3], S).
S = [1, 2, 2, 3].
如果您可以假设要对列表进行排序,并且希望结果是这种情况,则可以合并它们,从而保持顺序:
?- merge([1, 2, 4], [2, 3, 4, 5], S).
S = [1, 2, 2, 3, 4, 4, 5].
如果您不能假设要对列表进行排序,但希望对结果进行排序,您也可以自己处理排序,例如使用 msort:
?- append([1, 2, 3], [3, 2, 4, 5, 5], S), msort(S, S1).
S = [1, 2, 3, 3, 2, 4, 5, 5],
S1 = [1, 2, 2, 3, 3, 4, 5, 5].
周围还有更多的排序谓词,如果更复杂,您也可以自己编写一个。
推荐阅读
- javascript - 避免回调地狱和组织 Node.js 代码
- batch-file - 使用批处理脚本打开文件
- android - android studio 在 Viewflipper 中给出 OutOfMemoryError
- java - JPA 工具正在生成具有数据库中“旧”/已删除列的实体
- identityserver4 - IdentityServer4 QuickStart2_ResourceOwnerPasswords System.Net.Http.HttpRequestException
- c# - C# Linq 按多个过滤器排序
- python - 循环矩阵运算的循环优化
- javascript - 蜜罐垃圾邮件陷阱与浏览器自动填充功能冲突
- json - 角度 6 http 获取 JSON
- laravel - 如何从关系子查询 Laravel 返回单个对象