My answer到类似的问题Intersection and union of 2 lists可能是你的兴趣。
与此处发布的其他答案和there不同,我建议的实现逻辑上是纯粹的和单调的,这使得它在泛化/专业化方面更加通用和强大。
首先,让我们看看它是否与您在上面给了查询工作:
?- 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
的执行是而非单调。
底线:intersection/3
是更难使用权比list_list_intersection/3
;它迫使你在使用它时考虑声明性程序方面的和。
谢谢,它完美的作品^^所以如果成员是真的,LI = [X | R] ...被执行?我不知道“ - >”:/ – toshiro92