查找第一个子列表,其所有数字都从1到K

时间:2019-05-13 16:24:10

标签: prolog

我需要找到第一个具有从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

2 个答案:

答案 0 :(得分:1)

您可以使用append/3subtract/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 !