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(如果Xnumbersbetween(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(如果Xnumbersbetween(X, Y, List) :- setof(B, between(X, Y, B), List).
如果您不知道这些函数,可以使用Prolog的算术“is”构造自己的numbersbetween()。Conrad Irwin在这里对递归解决问题进行了很好的分析,但假设输入列表按升序排序(如Hunterhod提出的示例中的情况) 考虑到未排序输入的可能性,除了在应用康拉德的技术之前对输入进行排序外,还建议了一种方法
输入列表
的最小值和最大值
元素
BetweenList=[最小值,…,最大值]
中间列表
中提取所有非输入列表
成员的条目,形成缺失列表
Conrad Irwin在这里给出了一个递归解决问题的很好的分析,但是假设输入列表是按升序排序的(如Hunterhod提出的示例中的情况) 考虑到未排序输入的可能性,除了在应用康拉德的技术之前对输入进行排序外,还建议了一种方法
输入列表
的最小值和最大值
元素
BetweenList=[最小值,…,最大值]
中间列表
中提取所有非输入列表
成员的条目,形成缺失列表