我想获取一个整数列表,并创建一个整数列表,这些整数位于前一个列表中整数之间(或在其间隙中)。例如,我希望?- findmissing([1,3,4,5,6],X).
生成X = [2]
。我该如何实现这样的功能?
答案 0 :(得分:3)
逻辑编程的第一个技巧是从最小的情况开始并进行处理。
这里的基本案例很简单,如果列表中的元素少于两个,则没有任何遗漏。
findmissing([], []).
findmissing([_], []).
第二招是分而治之。为了找到列表中每对之间缺少的所有内容,我们需要一个谓词(比如(X,Y,List)/ 3之间的数字),它给出给定数字对之间的所有数字,然后在每个数字上运行在输入列表中配对。使用内置的append()/ 3,而不是担心如何在()/ 3之间实现数字,我们可以放:
findmissing([X, Y|In], Out) :-
numbersbetween(X, Y, Between),
findmissing([Y|In], After),
append(Between, After, Out).
(这里有一点需要注意,以确保我们考虑每一对,在列表[1,2,3]中,我们需要检查[1,2]和[2,3] - 这就是为什么重复使用步骤需要[Y | In]而不仅仅是In。。
然后只留下在()/ 3之间定义数字的挑战。如果你碰巧知道()/ 3之间的内置谓词,(如果X< Z< Y则为真)和setof()/ 3(可以从所有解决方案生成List),你可以使用:
numbersbetween(X, Y, List) :- setof(B, between(X, Y, B), List).
如果您不碰巧知道这些函数,可以使用Prolog的算术“is”在()之间构造自己的数字。
答案 1 :(得分:0)
Conrad Irwin在此给出了一个很好的分析,即递归地解决问题,但假设输入列表按升序排序(如Hunterhod所示的示例中所示)。
考虑到未分类输入的可能性,除了在应用康拉德技术之前对输入进行排序外,还提出了一种方法。
查找Minimum
的{{1}}和Maximum
元素。
创建连续整数列表InputList
。
从BetweenList = [Minimum,...,Maximum]
提取BetweenList
所有 成员InputList
以形成MissingList
。