Prolog 仅删除中间元素,第一个和最后一个元素除外
榜样;我有一个列表[1,2,3,a,f,s,h,u,4,5]。我想删除2,3,a,f,s,h,u,4,最终结果将是[1,5]。如何在Prolog中编写谓词Prolog 仅删除中间元素,第一个和最后一个元素除外,prolog,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). 首先,这应该是一个delete/2谓词,而不是delete/3 base子句应该是一个只有两个成员的列表,而recursive子句应该删除第二个元素,然后继续: delete
delete(A, [A|B], B).
delete(A, [B, C|D], [B|E]) :-
delete(A, [C|D], E).
首先,这应该是一个
delete/2
谓词,而不是delete/3
base子句应该是一个只有两个成员的列表,而recursive子句应该删除第二个元素,然后继续:
delete([A,B], [A,B]).
delete([A,_|R], X) :- delete([A|R], X).
考虑基于序列的问题的一个好方法是使用DCG(确定子句语法),它是大多数常见Prolog发行版(如SWI和GNU)的标准部分:
first_last([First, Last]) --> [First], ..., [Last].
... --> [].
... --> [_], ... .
first_and_last(L, FirstLast) :-
phrase(first_last(FirstLast), L).
您可以使用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|...] .
或者更简洁的@Louger answer版本:
?- [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.
那么
[a]
呢?。。。由于一些命运多舛的政治问题,DCG还没有成为标准的一部分。@false啊,好吧,很抱歉我说错了。更非正式地说,我应该说它们是流行的Prolog发行版(如SWI和GNU)的标准部分。它几乎无处不在