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