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

问题描述 投票:2回答:3

例;我有一个列表[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).
prolog
3个回答
3
投票

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

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

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

first_and_last(L, FirstLast) :-
   phrase(first_last(FirstLast), L).

0
投票

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

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

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

Demo.


0
投票

你可以使用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.
© www.soinside.com 2019 - 2024. All rights reserved.