我是 prolog 的新手,我希望能够从列表中删除两个位置。我用它来检查我的代码:
remove(e,[(d,1),(e,2),(e,3),(a,4),(b,5),(c,7)], M2).
但它只删除了两个位置中的一个(即 e)。谁能帮我?这是代码的其余部分。
remove(J, [(J,_)|Tail], Tail).
remove(J, [Head|Tail1], C2) :-
remove(J, Tail1, C2).
我是 prolog 的新手,我希望能够从列表中删除两个位置。我用它来检查我的代码:
remove(e,[(d,1),(e,2),(e,3),(a,4),(b,5),(c,7)], M2).
但它只删除了两个位置中的一个(即 e)。谁能帮我?这是代码的其余部分。
remove(J, [(J,_)|Tail], Tail).
remove(J, [Head|Tail1], C2) :-
remove(J, Tail1, C2).
如果您的 Prolog 有库(列表),则可以重用“功能”列表操作内置函数:它们将“功能”行为归因于它们将谓词作为参数的事实,(通常)应用于每个列表元素(内置是排除/3)
% this must adapt to your data structure
match_key(K, (K, _)).
remove(Key, List, Rest) :-
exclude(match_key(Key), List, Rest).
测试:
?- remove(e,[(d,1),(e,2),(e,3),(a,4),(b,5),(c,7)], M2).
M2 = [ (d, 1), (a, 4), (b, 5), (c, 7)].
我认为它值得学习,因为一个精心设计的库是一门好语言的重要组成部分,学习更简单的部分会让你更容易地了解更高级的部分。
您当前的版本实际上删除了所有直到第一次出现的e
. 试试这个:
remove(_, [], []).
% matches if current head element is equals to remove element.
remove(J, [(J,_)|Tail], Res) :- remove(J, Tail, Res).
% matches if current head element IS NOT equal to remove element.
% J \= K checks it.
remove(J, [(K, V) | Tail], [(K, V) | Res]) :-
J \= K, remove(J, Tail, Res).