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