Prolog删除功能

时间:2013-02-04 11:12:29

标签: prolog

我是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).

2 个答案:

答案 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).