两个重复列表之间的交集(Intersection between two lists of repetition)
重复列表由元素(element,number_of_occurrences)组成。 对于这样的元素的两个列表到交集。
我写了以下代码
min(X,Y,X):-X=<Y. min(X,Y,Y):-X>Y. search([X,Y],[[X,W]|_],[X,Z]):-min(Y,W,Z). search([X,Z],[[_,_]|T],Answer):-search([X,Z],T,Answer). intersection([],_,[]). intersection([[H,O]|T],L2,[Z|Temp]):- member([H,_],L2), search([H,O],L2,Z), intersection(T,L2,Temp). intersection([H|T],L2,Temp):- \+member(H,L2), intersection(T,L2,Temp).当我在此测试时:交叉点([[1,2],[2,2],[5,5]],[[1,1],[2,],[4,5]],A )。 它给出A = [[1,1],[2,2]],A = [[1,1]]和A = [[2,2]] A = []我只想得到第一个答案,怎么能我做到了吗? 我的代码出了什么问题?
The list with repetition cists of the elements (element, number_of_occurrences). For two lists of such elements find the intersection.
I wrote the following code
min(X,Y,X):-X=<Y. min(X,Y,Y):-X>Y. search([X,Y],[[X,W]|_],[X,Z]):-min(Y,W,Z). search([X,Z],[[_,_]|T],Answer):-search([X,Z],T,Answer). intersection([],_,[]). intersection([[H,O]|T],L2,[Z|Temp]):- member([H,_],L2), search([H,O],L2,Z), intersection(T,L2,Temp). intersection([H|T],L2,Temp):- \+member(H,L2), intersection(T,L2,Temp).When I test it on this : intersection([[1,2],[2,2],[5,5]] , [[1,1],[2,],[4,5]],A). It gives A = [[1, 1], [2, 2]] , A = [[1, 1]] and A = [[2, 2]] A = [] I only want the first answer, How can I do it? what is wrong with my code?
最满意答案
我认为使用member/2后跟search/会因回溯而创建子集解决方案。 search/谓词已经成功或失败,取决于其设计的成员资格。 因此,如果您重新调整您的intersection/谓词,则可以消除冗余并强制执行完整的解决方案。
你也可以消除你的min/谓词,注意到SWI Prolog支持min/2 。 你可以用Z is min(Y, W)替换min(Y, W, Z) ,但只是意识到假设Y和W都是实例化的。
search([X,Y], [[X,W]|_], [X,Z]) :- Z is min(Y, W). search([X,Z], [_|T], Answer) :- search([X,Z], T, Answer). intersection([], _, []). intersection([[H,O]|T], L2, R) :- ( search([H,O], L2, Z) -> R = [Z|Temp] ; R = Temp ), intersection(T, L2, Temp). ?- intersection([[1,2],[2,2],[5,5]], [[1,1],[2,],[4,5]], A). A = [[1, 1], [2, 2]]. ?-I think that using member/2 followed by a search/ creates the subset soluti due to backtracking. The search/ predicate will already provide success or failure depending upon membership by its design. So, if you reswizzle your intersection/ predicate, you can eliminate the redundancy and enforce the full solution.
You can also eliminate your min/ predicate noting that SWI Prolog supports a min/2. You would replace min(Y, W, Z) with Z is min(Y, W), but just being aware the assumption is that both Y and W are always instantiated.
search([X,Y], [[X,W]|_], [X,Z]) :- Z is min(Y, W). search([X,Z], [_|T], Answer) :- search([X,Z], T, Answer). intersection([], _, []). intersection([[H,O]|T], L2, R) :- ( search([H,O], L2, Z) -> R = [Z|Temp] ; R = Temp ), intersection(T, L2, Temp). ?- intersection([[1,2],[2,2],[5,5]], [[1,1],[2,],[4,5]], A). A = [[1, 1], [2, 2]]. ?-#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 6 条评论) |
本站网友 永久免费空间 | 9分钟前 发表 |
but just being aware the assumption is that both Y and W are always instantiated. search([X | |
本站网友 噗怎么读 | 30分钟前 发表 |
[[X | |
本站网友 光场相机 | 3分钟前 发表 |
O] | |
本站网友 冬奥会项目 | 25分钟前 发表 |
A = [[1 | |
本站网友 金黄散 | 12分钟前 发表 |
1] |