从列表中旋转并删除元素

时间:2015-03-26 20:02:33

标签: 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) :- 
   diff(T, [(K,_)|_], M3), !.
diff([H|T], [(K,_)|_], [H|M3]) :- 
   diff(T, [(K,_)|_], M3).

如果我通过我得到的内容运行查询,我会得到以下输出:

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

1 个答案:

答案 0 :(得分:0)

您需要对谓词diff/3进行一些修复 1-您的基本条款中的第二个术语不需要实例化,只需在列表为空时停止。
2-如果此元素是 NOT 您的键列表成员,则一般条款中的想法是将原始列表的头部复制到最终列表。
它看起来像这样:

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)].