如何检查一个范围的元素是否存在于列表中?



这是他第一次用Prolog语言编程,他想知道我如何从一个列表和两个数字Min和Max开始,看看Min和Max之间的数字是否存在于列表中。

示例:existerango([1,2,3,4,5,6,7,8],5,9)应该返回true,因为在列表中有5,6,7,8,这是5到9之间的整个范围(不包括最后一个)。

我在想这样的事情:

existerango([],Min,Max).
existerango(L,X,Y) :- existerango2(L,X,Y,N).

我想让它显示的是:

existerango([1,3,7,8,2],1,4).  
true.
existerango([1,3,7,8,2],X,Y).
X = 1 , Y = 2.
X = 1 , Y = 4.
...

所有的可能性。

对于第二个函数&;existerango2&;添加变量N,看看是否验证了以下条件:N = Y-X,因为如果这是真的,那么范围内的所有元素都存在,显然我每次都会增加N,这就满足了列表中的元素位于两个数字之间。

existorango(List, Max, Max) :-
memberchk(Max, List).
existorango(List, Min, Max) :-
memberchk(Min, List),
succ(Min, Next),
existorango(List, Next, Max).

?- trace, existorango([1,2,3,4,5], 2, 4).   %<-- query
Call:existorango([1, 2, 3, 4, 5],2,4)
Call:memberchk(2,[1, 2, 3, 4, 5])          % check if 2 is in 1,2,3,4,5
Exit:memberchk(2,[1, 2, 3, 4, 5])
Call:succ(2,_772)                          % successor after 2 is ?
Exit:succ(2,3)                             % it's 3
Call:existorango([1, 2, 3, 4, 5],3,4)      % call Min=3, Max=4
Call:memberchk(3,[1, 2, 3, 4, 5])          % check if 3 is in 1,2,3,4,5
Exit:memberchk(3,[1, 2, 3, 4, 5])
Call:succ(3,_774)                          % Next after 3 is ?
Exit:succ(3,4)                             % it's 4
Call:existorango([1, 2, 3, 4, 5],4,4)      % call Min=4, Max=4 (same!)
Call:memberchk(4,[1, 2, 3, 4, 5])          % check if 4 is in List
Exit:memberchk(4,[1, 2, 3, 4, 5])
Exit:existorango([1, 2, 3, 4, 5],4,4)      % no more calls, exit out
Exit:existorango([1, 2, 3, 4, 5],3,4)
Exit:existorango([1, 2, 3, 4, 5],2,4)
true                                        % yep, all checked

Min开始计数,检查每个Next是否为列表中的成员。当下一个数字和最大值相同时,检查该数字是否在列表中,并停止。

,或者短:

existerango(List, Min, Max) :-
forall(between(Min, Max, Number), memberchk(Number, List)).

"对于所有在Min和Max之间的数字,检查它们是否属于列表"

最新更新