仅删除第一个和最后一个元素之外的中间元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅删除第一个和最后一个元素之外的中间元素相关的知识,希望对你有一定的参考价值。

例;我有一个列表[1,2,3,a,f,s,h,u,4,5]。我想删除2,3,a,f,s,h,u,4,最终结果将[1,5]。我如何在Prolog中编写谓词?

delete(A, [A|B], B).      
delete(A, [B, C|D], [B|E]) :-  
    delete(A, [C|D], E).
答案

一个很好的方法来考虑像这样的基于序列的问题是DCG(Definite Clause Grammar),它是大多数常见Prolog发行版​​的标准部分,例如SWI和GNU:

first_last([First, Last]) --> [First], ..., [Last].

... --> [].
... --> [_], ... .

first_and_last(L, FirstLast) :-
   phrase(first_last(FirstLast), L).
另一答案

首先,这应该是一个delete/2谓词,而不是delete/3

base子句应该是一个只有两个成员的列表,而recursive子句应该删除第二个元素,然后继续:

delete([A,B], [A,B]).
delete([A,_|R], X) :- delete([A|R], X).

Demo.

另一答案

你可以使用append / 3:

?- X=[1,2,3,a,f,s,h,u,4,5].
X = [1, 2, 3, a, f, s, h, u, 4|...].

?- append([F|_],[L],$X).
F = 1,
L = 5,
X = [1, 2, 3, a, f, s, h, u, 4|...] .

或追加/ 2

?- append([[F],_,[L]],$X).
F = 1,
L = 5,
X = [1, 2, 3, a, f, s, h, u, 4|...] .

甚至更简洁的@lurker版本答案:

?- [user].
|: ... --> [] | ([_], ...).
|: ^D% user://1 compiled 0.01 sec, 1 clauses
true.

?- phrase(([F],...,[L]),$X).
F = 1,
L = 5,
X = [1, 2, 3, a, f, s, h, u, 4|...] ;
false.

以上是关于仅删除第一个和最后一个元素之外的中间元素的主要内容,如果未能解决你的问题,请参考以下文章

如何知道是否在地图中删除了最后一个元素?

使用 JQuery 从列表中删除除前 N 个元素之外的所有元素

有没有办法为“除第一个/最后一个之外的所有元素”指定CSS简写?

数据结构学习笔记-----------------线性表

如何从数组中删除除javascript中的第一个元素之外的所有元素

php中怎么删除数组的第一个元素和最后一个元素