旋转和删除列表中的元素
Rotate and delete an element from a list
我想 运行 遍历列表 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-如果此元素是 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)].
我想 运行 遍历列表 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-如果此元素是 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)].