在prolog中为多集编写并集运算

在prolog中为多集编写并集运算,prolog,multiset,Prolog,Multiset,在序言中,有一种标准的方法来定义两个集合的并集 但我想为多集编写并集函数。这意味着如果第一组有[1,2]和 第二个有[2,3],那么输出应该是[1,2,2,3] 如何编写这样的函数。Prolog中没有设置类型。您所引用的只是列表。union谓词将两个具有假定唯一元素的列表组合到一个新列表中,其中元素再次是唯一的。顺序在一组中并不重要。当您传递一个非有序/非集合列表时,您会看到这一点 % both ordered, but result is not ?- union([1,2,5,6], [3,

在序言中,有一种标准的方法来定义两个集合的并集
但我想为多集编写并集函数。这意味着如果第一组有[1,2]和
第二个有[2,3],那么输出应该是[1,2,2,3]
如何编写这样的函数。

Prolog中没有设置类型。您所引用的只是列表。
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].
要创建一个多集合,即将集合中的所有元素保持为并集,您可以在随意排序的同时合并列表。从形式上讲,multiset也不是有序的,因此如果排序不重要,您可以将第二个列表附加到第一个列表,这也适用于您的示例:

?- 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].

还有更多的排序谓词,如果更复杂的话,你也可以自己写一个。

我让联合工作起来了。我需要一些关于subset-
subset([],389;)的帮助。子集([X | L],集):-成员(X,集),子集(L,集)。
这是正常子集的代码,但现在该集是一个多集,因此我需要从集合中删除X,然后检查L是否是集合的子集,而不是检查子集(L,集)。如何在prologI中做到这一点我不完全理解这将如何使它成为一个多集检查。但是您可以使用
delete(Set,X,NewSet)
创建一个新的集合,而不使用
X
“union谓词将两个列表与假定的有序唯一元素组合起来”我相信您的示例表明
union
假定每个列表中的元素都是唯一的,但不是有序的,我错了吗?如果它假设列表被排序,那么您将得到
[1,2,3,2,…]
而不是
[1,3,2,…]
@Maëlan您是对的,我把它与
ord_union
混淆了。将更正答案。我要实现的联合示例-
A={A;A;b;b;c;d;d};B={B;B;c;c;c;d;d;e}A U B={A;A;B;B;c;c;c;d;d;e}
所有元素的最大计数。元素的顺序在输出中并不重要