2

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

2 回答 2

2

如果您的 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)].

我认为它值得学习,因为一个精心设计的库是一门好语言的重要组成部分,学习更简单的部分会让你更容易地了解更高级的部分。

于 2013-02-04T12:12:54.313 回答
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). 
于 2013-02-04T11:19:41.987 回答