我有两个清单:
L1 = [[a,b,c], [e,b,d], [f,g,a]]
L2 = [a,e]
我想将L2与L1中的每个列表进行比较,并找到常用项目的数量。我正在尝试以下代码:
common([],L).
common([H|T], L, Out):-
intersection(H,L,Out), common(T, L, Out),
length(Out,Len).
然而,它不起作用:
?- common([[a,b,c], [e,b,d], [f,g,a]], [a,e], Outlist).
false.
主列表仍然列在列表中(如使用writeln语句调试后所见):
L is:
[a,e]
H|T is:
[[f,g,a]]
Outlist = [] .
问题在哪里?我该如何纠正?
我编辑了代码以进行调试,发现它已经开始工作了:
common([],L,Out).
common([H|T], L, Out):-
writeln('------------in common--------------'),
writeln('L is:'), writeln(L),
writeln('H is:'), writeln(H),
intersection(L,H,Out2list),
writeln('Out2list is:'), writeln(Out2list),
common(T, L, Out2).
41 ?- common([[a,b,c], [e,b,d], [f,g,a]], [a,e], Outlist).
------------in common--------------
L is:
[a,e]
H is:
[a,b,c]
Out2list is:
[a]
------------in common--------------
L is:
[a,e]
H is:
[e,b,d]
Out2list is:
[e]
------------in common--------------
L is:
[a,e]
H is:
[f,g,a]
Out2list is:
[a]
true.
答案 0 :(得分:1)
首先让我们观察你编写了一个谓词common / 2和一个谓词common / 3。阅读你的问题,我假设你打算将前者作为common / 3的基本案例。考虑到您想要描述的关系,定义空列表和任何其他列表的交集是空列表是有意义的:
common([],_,[]).
然而,你对第三个论点的期望并不完全清楚。在你的问题中,你写的是它应该是常见项目的数量。在谓词common / 3中使用length / 2支持这种解释。在这种情况下,您希望在第三个列表中具有相应交叉点的长度:
common([],_,[]).
common([H|T], L, [Len|Out]):- % Len is in the 3rd list
intersection(H,L,I), % I is intersection of H and L
length(I,Len), % Len is length of I
common(T, L, Out). % the same for T, L and Out
使用此版本,您的示例查询会产生:
?- common([[a,b,c], [e,b,d], [f,g,a]],[a,e],I).
I = [1,1,1]
但是,在您的第一条评论中,您写道,您希望Outlist
为[a]
。这表明你想在第三个参数中使用列表而不是数字。但是查看示例查询[a]
并不是答案。一方面,如果你想要看到第一个列表的元素与第二个参数的所有交叉点,你可能想写一些类似的东西:
common2([],_,[]).
common2([H|T], L, [I|Out]):- % I is in the third list
intersection(H,L,I), % I is intersection of H and L
common2(T, L, Out). % the same for T, L and Out
这会以您的示例为准:
?- common2([[a,b,c], [e,b,d], [f,g,a]],[a,e],I).
I = [[a],[e],[a]]
另一方面,如果你想要看到 all 与第二个参数的第一个参数列表的交集,你可能会喜欢这样的东西:
common3([],_,[]). % special case empty list
common3([H|T],L,I) :- % if 1st list not empty
common3_([H|T],L,I). % I is described in common3_/3
common3_([],I,I). % if the list is empty I = Outlist
common3_([H|T], L, O) :-
intersection(H,L,I), % I is intersection of H and L
common3_(T,I,O). % only the elements in I can be in O
使用您的示例列表,这会产生
?- common3([[a,b,c], [e,b,d], [f,g,a]],[a,e],I).
I = []
因为在所有三个列表中都不会出现a
和e
。但是如果你将a
添加到第二个列表:
?- common3([[a,b,c], [e,b,d,a], [f,g,a]],[a,e],I).
I = [a]