List 删除列表L的最后3个元素以在Prolog中生成列表L1

List 删除列表L的最后3个元素以在Prolog中生成列表L1,list,prolog,List,Prolog,如何编写一个目标,从列表L中删除最后三个元素,生成另一个列表L1 另外,我如何编写多个目标来删除列表中的前三个元素和后三个元素 逻辑编程的第一步,从基本情况开始。当元素少于三个时,您希望发生什么?我猜你想要一张空名单 without_last_three([], []). without_last_three([_], []). without_last_three([_,_], []). without_last_three([_,_,_], []). 现在,对于包含三个以上元素的列表,您希

如何编写一个目标,从列表L中删除最后三个元素,生成另一个列表L1


另外,我如何编写多个目标来删除列表中的前三个元素和后三个元素

逻辑编程的第一步,从基本情况开始。当元素少于三个时,您希望发生什么?我猜你想要一张空名单

without_last_three([], []).
without_last_three([_], []).
without_last_three([_,_], []).
without_last_three([_,_,_], []).
现在,对于包含三个以上元素的列表,您希望保留第一个元素,并从其余元素中删除三个元素。您可以先尝试写:

without_last_three([A|L], [A|M]) :- without_last_three(L, M). !!wrong
但这将由于回溯而导致不正确的结果。解决这个问题的最简单方法是验证L有三个以上的元素:

without_last_three([A,B,C,D|L], [A|M]) :- without_last_three([B,C,D|L], M).
但更优雅的解决方案是使用Prolog的切割操作符:

without_last_three([A|L], [A|M]) :- !, without_last_three(L, M).
要在没有前三个选项的情况下实现,而不感到厌烦,您可以简单地反转列表,删除后三个选项,然后再次翻转:

without_first_three(I, O) :- reverse(I, A), without_last_three(A, B), reverse(B, O).
或者你可以写下一些非常简单的规则:

without_first_three([], []).
without_first_three([_], []).
without_first_three([_,_], []).
without_first_three([_,_,_|L], L).

(想一想,也许在没有“最后三个”的情况下实施比没有“第一个”更好,而不是相反)

您可能想尝试以下方法:

without_last_three([_,_,_], []).
without_last_three([Head|Tail], [Head|NTail]):-
  without_last_three(Tail, NTail).

without_three_sides([_,_,_|L], L2):-
  without_last_three(L, L2).
第一个谓词将返回一个不包含最后三个元素的列表,如果少于三个元素,则返回失败


第二个谓词将返回一个不包含前三个和后三个元素的列表,如果少于六个元素,则会失败。

Prolog它与其他语言有点不同,但它还有一个值得学习的库(标准ISO):

delete_last_3(L, L1) :-  
 append(L1, [_,_,_], L).
现在,另一个请求很简单:

delete_first_and_last_3(L, L2) :-  
  append([_,_,_], LT, L), delete_last_3(LT, L2).
测试:


如果允许使用append/3,我认为OP不希望使用它,那么只需使用一个append即可重写delete_first_和_last_3:
append([[uu,[uu,[u124; L2],[uu,[uu,[uu,[uu,]L)
?- delete_last_3([1,2,3,4,5,6,7],X).
X = [1, 2, 3, 4] .

?- delete_first_and_last_3([1,2,3,4,5,6,7,8,9],L).
L = [4, 5, 6] .