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

时间:2017-12-27 13:55:34

标签: prolog

实施例;我有一个列表[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).

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

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

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

Demo.

答案 2 :(得分: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.