我对类似问题Intersection and union of 2 个列表的回答可能会让您感兴趣。
与这里和那里发布的其他答案不同,我建议的实现在逻辑上是纯粹的和单调的,这使得它在泛化/专业化方面更加通用和健壮。
首先,让我们看看它是否适用于您上面给出的查询:
?- As = [la_defense,etoile,chatelet,nation],
Bs = [auber,chatelet,hotel_de_ville,nation],
list_list_intersection(As,Bs,Xs).
As = [la_defense, etoile, chatelet, nation],
Bs = [auber, chatelet, hotel_de_ville, nation],
Xs = [chatelet, nation].
但是,如果我们以不同(但在逻辑上等效)的方式编写查询呢?
?- As = [_,_,_,_],
Bs = [_,_,_,_],
list_list_intersection(As,Bs,Xs),
As = [la_defense,etoile,chatelet,nation],
Bs = [auber,chatelet,hotel_de_ville,nation].
As = [la_defense, etoile, chatelet, nation],
Bs = [auber, chatelet, hotel_de_ville, nation],
Xs = [chatelet, nation].
list_list_intersection/3
我们得到相同的结果。
intersection/3
现在,让我们考虑使用另一个答案中提出的内置函数。intersection/3
在泛化方面也很稳健吗?
?- As = [_,_,_,_],
Bs = [_,_,_,_],
intersection(As,Bs,Xs),
As = [la_defense,etoile,chatelet,nation],
Bs = [auber,chatelet,hotel_de_ville,nation].
false.
不! intersection/3
失败,即使它在逻辑上等价的查询中成功,这表明实现intersection/3
不是monotone。
底线: intersection/3
比正确使用更难list_list_intersection/3
;它迫使您在使用它时考虑声明性和程序性方面。