Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 仅删除中间元素,第一个和最后一个元素除外_Prolog - Fatal编程技术网

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

榜样;我有一个列表[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([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)的标准部分。它几乎无处不在