我需要找到第一个具有从1到K的所有数字的子列表,并返回它及其长度。
抱歉,修改不正确
所以我检查1到K是否在子列表中,然后从
删除元素(Hd)NumList,将其附加到我们的result(SubList)并递归调用函数
以尾巴作为我们要检查的新列表。
findFirstSubListHavingAllColors( NumList, [Hd|Tl] ,SubList, X):-
( oneToKinSub(SubList,NumList)
-> length(SubList,X)
; delete(NumList,Hd,NumList1),
append(SubList,[Hd],SubList1),
findFirstSubListHavingAllColors(NumList1,Tl,SubList1,_)
).
oneToKinSub(_,[]).
oneToKinSub(SubString,[Hd|Tl]) :-
member(Hd,SubString),
oneToKinSub(SubString,Tl).
例如,如果
NumList = [1,2,3]
[Hd | Tl] = [ 1,3,1,3,1,3,3,2 ,2,1]
预期结果应为SubList = [1,3,1,3,1,3,3,2]且X = 8
答案 0 :(得分:1)
您可以使用append/3
和subtract/3
获取包含所有项目的第一个子列表:
findFirstSubListHavingAllColors( NumList, List ,SubList, Len):-
once((
append(SubList, _, List), % get SubList
subtract(NumList, SubList, []), % test whether NumList is contained in SubList
length(SubList, Len)
)).
once/1
是为了避免在回溯时获得其他(错误的)解决方案。
答案 1 :(得分:0)
这是使用 aggegate_all / 3
的另一种解决方案firstSubList(NumList, In, Out) :-
aggregate_all(max(E),(member(X, NumList), once(nth1(E, In, X))), Len),
length(Out, Len),
append(Out, _, In).
Once/1 is used because numbers may appears many times in the list !