我是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).
答案 0 :(得分:2)
如果您的Prolog有库(lists),您可以重用“功能”列表操作内置:它们的“功能”行为是因为它们将谓词作为参数,被应用(通常)到每个列表'元素(内置为exclude / 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)].
我认为这是值得研究的,因为它是一个精心设计的图书馆,它是良好语言的重要组成部分,学习更简单的部分将使您更容易学习更高级的文章。
答案 1 :(得分:1)
您当前的版本实际上会删除所有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).