Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 旋转并从列表中删除元素_List_Prolog_Element - Fatal编程技术网

List 旋转并从列表中删除元素

List 旋转并从列表中删除元素,list,prolog,element,List,Prolog,Element,我想遍历一个列表a并从该列表中删除与列表B中的对具有相同密钥的任何元素,然后从中创建一个新的列表C 我让它只对头部有效,但我不知道如何在列表B的尾部循环 diff(A, B, C). 如果我执行此查询: diff([(a,b),(k1,_),(c,d),(k2,_)],[(k1,_),(k2,_)],L). 我应该得到输出: L = [(a,b),(c,d),] 到目前为止,我得到的是: diff([],[(K,_)|_], []). diff([(K,_)|T],[(K,_)|_],M3

我想遍历一个列表a并从该列表中删除与列表B中的对具有相同密钥的任何元素,然后从中创建一个新的列表C

我让它只对头部有效,但我不知道如何在列表B的尾部循环

diff(A, B, C).
如果我执行此查询:

diff([(a,b),(k1,_),(c,d),(k2,_)],[(k1,_),(k2,_)],L).
我应该得到输出:

L = [(a,b),(c,d),]
到目前为止,我得到的是:

diff([],[(K,_)|_], []).
diff([(K,_)|T],[(K,_)|_],M3) :- 
   diff(T, [(K,_)|_], M3), !.
diff([H|T], [(K,_)|_], [H|M3]) :- 
   diff(T, [(K,_)|_], M3).
如果我通过我得到的运行查询,我会得到以下输出:

L = [(a,b),(c,d),(k2,_37227)]

您需要对谓词
diff/3

1-基本子句中的第二个术语不需要实例化,只要在列表为空时停止即可。
2-一般条款中的想法是,如果该元素不是密钥列表的成员,则将原始列表的标题复制到最终列表中。
看起来是这样的:

diff([], _, []).
diff([(K,_)|Tail], Keys, M3):-
             member((K,_), Keys), !,
             diff(Tail, Keys, M3).
diff([H|Tail], Keys, [H|M3]):-
              diff(Tail, Keys, M3).
咨询:

?- diff([(a,b),(k1,_),(c,d),(k2,_)],[(k1,_),(k2,_)],L).
L = [ (a, b), (c, d)].

哦,我明白了,与其将第二个列表的每个head元素与第一个列表的head进行比较,不如检查第一个列表的head是否在第二个列表中。谢谢你的帮助!