将列表与Prolog中另一个列表中的列表进行比较

恩索

我有两个清单:

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.
塔斯

首先,让我们观察一下您已经写了一个谓词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]]

另一方面,如果您要查看第一个参数与第二个参数所有列表的交集,则可能需要执行以下操作:

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]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用LINQ将列表按列表中的另一个列表分组

来自分类Dev

Prolog:比较2个列表,找出另一个列表中是否至少有一个成员

来自分类Dev

将列表中的值与另一个列表中的特定总和进行比较的最快方法是什么?

来自分类Dev

如何在Python中将列表列表中的一个值与列表列表中的另一个值进行比较

来自分类Dev

在Python中的列表项与另一个列表的索引之间进行比较

来自分类Dev

将阵列列表中的产品与相似产品的另一个阵列列表进行匹配

来自分类Dev

Scala根据另一个列表中的值对一个列表进行排序

来自分类Dev

编写Java谓词以将列表与另一个列表进行比较

来自分类Dev

将列表与另一个列表进行比较时检查列表中缺少的内容

来自分类Dev

Python:比较列表中的值(如果存在于另一个列表中)

来自分类Dev

将列表的每个元素与另一个列表的每个元素进行比较

来自分类Dev

将DataFrame列与另一个列表进行比较并进行更改

来自分类Dev

将列表中的每个元素与另一个列表中的2个元素进行比较,使代码高效

来自分类Dev

如何有效地将字典中的字符串列表与Python中的另一个字典列表进行比较?

来自分类Dev

如何将列表中的列表添加到另一个列表

来自分类Dev

将列表与另一个列表项进行比较,如果列表项相似,则将其返回

来自分类Dev

如何使用与另一个列表的比较来对列表中的字典进行排序

来自分类Dev

将列表的第一个元素与另一个列表进行比较

来自分类Dev

将临时列表添加到另一个列表中,丢失列表数据

来自分类Dev

比较一个列表以查看它在另一个列表中的位置

来自分类Dev

将列表与Prolog中另一个列表中的列表进行比较

来自分类Dev

python根据名称将一个列表中的文件与另一个列表中的文件进行匹配

来自分类Dev

将一个列表对象中的项与另一个列表对象中的另一项进行比较

来自分类Dev

将字典的值(列表)与另一个列表进行比较时更改字典的键

来自分类Dev

将列表的每个元素与 Python3 中另一个列表的每个元素进行比较

来自分类Dev

从一个列表中查找一个元素并将其与另一个列表中的元素进行比较

来自分类Dev

将列表与另一个列表进行比较时出错

来自分类Dev

将用户定义的列表与 bash 中的另一个列表进行比较

来自分类Dev

如何将嵌套的 Dict 列表与另一个嵌套的 Dict 列表进行比较,并从另一个更新一个中的值

Related 相关文章

  1. 1

    使用LINQ将列表按列表中的另一个列表分组

  2. 2

    Prolog:比较2个列表,找出另一个列表中是否至少有一个成员

  3. 3

    将列表中的值与另一个列表中的特定总和进行比较的最快方法是什么?

  4. 4

    如何在Python中将列表列表中的一个值与列表列表中的另一个值进行比较

  5. 5

    在Python中的列表项与另一个列表的索引之间进行比较

  6. 6

    将阵列列表中的产品与相似产品的另一个阵列列表进行匹配

  7. 7

    Scala根据另一个列表中的值对一个列表进行排序

  8. 8

    编写Java谓词以将列表与另一个列表进行比较

  9. 9

    将列表与另一个列表进行比较时检查列表中缺少的内容

  10. 10

    Python:比较列表中的值(如果存在于另一个列表中)

  11. 11

    将列表的每个元素与另一个列表的每个元素进行比较

  12. 12

    将DataFrame列与另一个列表进行比较并进行更改

  13. 13

    将列表中的每个元素与另一个列表中的2个元素进行比较,使代码高效

  14. 14

    如何有效地将字典中的字符串列表与Python中的另一个字典列表进行比较?

  15. 15

    如何将列表中的列表添加到另一个列表

  16. 16

    将列表与另一个列表项进行比较,如果列表项相似,则将其返回

  17. 17

    如何使用与另一个列表的比较来对列表中的字典进行排序

  18. 18

    将列表的第一个元素与另一个列表进行比较

  19. 19

    将临时列表添加到另一个列表中,丢失列表数据

  20. 20

    比较一个列表以查看它在另一个列表中的位置

  21. 21

    将列表与Prolog中另一个列表中的列表进行比较

  22. 22

    python根据名称将一个列表中的文件与另一个列表中的文件进行匹配

  23. 23

    将一个列表对象中的项与另一个列表对象中的另一项进行比较

  24. 24

    将字典的值(列表)与另一个列表进行比较时更改字典的键

  25. 25

    将列表的每个元素与 Python3 中另一个列表的每个元素进行比较

  26. 26

    从一个列表中查找一个元素并将其与另一个列表中的元素进行比较

  27. 27

    将列表与另一个列表进行比较时出错

  28. 28

    将用户定义的列表与 bash 中的另一个列表进行比较

  29. 29

    如何将嵌套的 Dict 列表与另一个嵌套的 Dict 列表进行比较,并从另一个更新一个中的值

热门标签

归档