List 查找缺少的整数-Prolog

List 查找缺少的整数-Prolog,list,prolog,integer,List,Prolog,Integer,我想获取一个整数列表,并创建一个整数列表,这些整数位于前一个列表中的整数之间(或在其间隙中)。例如,我想要?-findmissing([1,3,4,5,6],X)。来生成X=[2]。我该如何实现这样一个功能?逻辑编程的第一个技巧是从最小的情况开始,然后逐步进行 这里的基本情况很简单,如果列表中的元素少于两个,则不会缺少任何元素 findmissing([], []). findmissing([_], []). 第二个诀窍是分而治之。要查找列表中每对之间缺少的所有内容,我们需要一个谓词(比如n

我想获取一个整数列表,并创建一个整数列表,这些整数位于前一个列表中的整数之间(或在其间隙中)。例如,我想要
?-findmissing([1,3,4,5,6],X)。
来生成
X=[2]
。我该如何实现这样一个功能?

逻辑编程的第一个技巧是从最小的情况开始,然后逐步进行

这里的基本情况很简单,如果列表中的元素少于两个,则不会缺少任何元素

findmissing([], []).
findmissing([_], []).
第二个诀窍是分而治之。要查找列表中每对之间缺少的所有内容,我们需要一个谓词(比如numbersbetween(X,Y,List)/3),该谓词给出给定数字对之间的所有数字,然后在输入列表中的每对上运行该谓词。使用内置的append()/3,暂时不必担心如何实现numbersbetween()/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 in)。

这样就只剩下定义numbersbetween()/3的挑战了。如果您碰巧知道()/3(如果X
numbersbetween(X, Y, List) :- setof(B, between(X, Y, B), List).

如果您碰巧不知道这些函数,您可以使用Prolog的算术“is”构造自己的numbersbetween()。

逻辑编程的第一个技巧是从最小的情况开始,然后逐步进行

这里的基本情况很简单,如果列表中的元素少于两个,则不会缺少任何元素

findmissing([], []).
findmissing([_], []).
第二个诀窍是分而治之。要查找列表中每对之间缺少的所有内容,我们需要一个谓词(比如numbersbetween(X,Y,List)/3),该谓词给出给定数字对之间的所有数字,然后在输入列表中的每对上运行该谓词。使用内置的append()/3,暂时不必担心如何实现numbersbetween()/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 in)。

这样就只剩下定义numbersbetween()/3的挑战了。如果您碰巧知道()/3(如果X
numbersbetween(X, Y, List) :- setof(B, between(X, Y, B), List).

如果您不知道这些函数,可以使用Prolog的算术“is”构造自己的numbersbetween()。

Conrad Irwin在这里对递归解决问题进行了很好的分析,但假设输入列表按升序排序(如Hunterhod提出的示例中的情况)

考虑到未排序输入的可能性,除了在应用康拉德的技术之前对输入进行排序外,还建议了一种方法

  • 查找
    输入列表
    最小值和
    最大值
    元素

  • 创建连续整数列表
    BetweenList=[最小值,…,最大值]

  • 中间列表
    中提取所有非
    输入列表
    成员的条目,形成
    缺失列表


  • Conrad Irwin在这里给出了一个递归解决问题的很好的分析,但是假设输入列表是按升序排序的(如Hunterhod提出的示例中的情况)

    考虑到未排序输入的可能性,除了在应用康拉德的技术之前对输入进行排序外,还建议了一种方法

  • 查找
    输入列表
    最小值和
    最大值
    元素

  • 创建连续整数列表
    BetweenList=[最小值,…,最大值]

  • 中间列表
    中提取所有非
    输入列表
    成员的条目,形成
    缺失列表