Prolog删除列表中第一个和最后一个元素之间的元素

Prolog删除列表中第一个和最后一个元素之间的元素,prolog,Prolog,对于只包含连续整数的列表,我试图只保留第一个元素和最后一个元素 例如: ?- remove([1,2,3,4,5], NewList). NewList = [1,5]. 我只能成功保留最后一个元素: remove([], []). % for consecutive integers in the list remove([ Head | Tail ], NewList) :- check_consecutive(Head, Tail), remove(Tail, NewL

对于只包含连续整数的列表,我试图只保留第一个元素和最后一个元素

例如:

?- remove([1,2,3,4,5], NewList).
NewList = [1,5].
我只能成功保留最后一个元素:

remove([], []).

% for consecutive integers in the list
remove([ Head | Tail ], NewList) :-
    check_consecutive(Head, Tail),
    remove(Tail, NewList).

% for the case when the list is empty
remove([ Head | Tail ], [ Head | NewList ]) :-
    not(check_consecutive(Head, Tail)),
    remove(Tail, NewList).

check_consecutive(Num, [ Head | _ ]) :-
    Num is Head - 1.
我一直想保留第一个元素,但它一直给我最后一个元素

如果存在一些不连续的元素,则应执行以下操作:

?- remove([1,2,4,5,6,8,3], NewList).
NewList = [[1,6], 8, 3]. 

感谢您的帮助。

要解决此问题,您必须处理不同的情况,这里是解决方案,然后是评论:

last([E],E).
last([_|T],E):-
    last(T,E).

remove([],[]).
remove([A],[A]).
remove([A,B],[A,B]).
remove([A|B],[A,Last]):-
    last(B,Last).

findElementsR([A,B],LT,LOT,LO):-
    B =< A,
    append(LT,[A],LT1),
    remove(LT1,LRem),
    append(LOT,[LRem,[B]],LO).

findElementsR([A,B|T],LT,LOT,LO):-
    B =< A,
    append(LT,[A],LT1),
    remove(LT1,LRem),
    append(LOT,[LRem],LOT1),
    findElementsR([B|T],[],LOT1,LO).

findElementsR([A,B],LT,LOT,LO):-
    B is A+1, %consecutive
    append(LT,[A,B],LTO),
    remove(LTO,RM),
    append(LOT,[RM],LO).

findElementsR([A,B|T],LT,LOT,LO):-
    B is A+1, %consecutive
    append(LT,[A],LTO),
    findElementsR([B|T],LTO,LOT,LO).

findElements(L,LO):-
    findElementsR(L,[],[],LO).

?- findElements([3,1,2,3,2,3,4,5,2,3,4],L).
L = [[3], [1, 3], [2, 5], [2, 4]]
false
然后用
remove/3
我得到由第一个和最后一个元素组成的列表


findElements/2
用于调用findElementsR/4(使其尾部递归)
findElements/4
查找连续元素的列表,然后调用
remove/2
以获取第一个和最后一个元素。

如果列表中没有连续整数该怎么办。那该怎么办呢?只是失败?例如,
remove([1,2,4,5,6,8,3],NewList)的结果应该是什么?
be?使用append是一个非常好的主意。如果我想让列表中的单个整数不是子列表,我该怎么办?例如,-findElements([3,1,2,3,2,3,4,5,2,3,4],L)。L=[3,1,3,2,5,2,4]]
?- last([1,2,3],L).
L = 3