仅删除第一个和最后一个元素之外的中间元素
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).
另一答案
你可以使用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简写?