检查序言中多于一个的数字列表

check the list of numbers different more than one in prolog

我在序言中有一个数字列表。号码已经是sorted.I要检查任何号码不重复和任何两个号码之间的差异大于one.How来检查它。任何的想法。谢谢。

?- check([1,3,4]). %expectation
false.
?- check([2,5,7,10]). %expectation
true.

我假设列表已经试过了...

check([_]).
check(L):-append([],[X1,X2|T],L),X1+1<X2,check([X2|T]).

让我猜猜...

  • 您正在使用 SWI-Prolog,并且
  • 您的 check/1 关心的所有数字都是整数。

如果是,请继续阅读!


使用!

:- use_module(library(clpfd)).

正如您可能已经猜到的那样,有数十亿种方法可以实现谓词 check/1。在这个答案中,我们使用直接的递归方法:

check([]).
check([_]).
check([E0,E1|Es]) :-
   E0+1 #< E1,
   check([E1|Es]).

示例查询:

?- check([1,3,4]).
false.

?- check([2,5,7,10]).
true ;                   % do not be bothered by the trailing `; false`
false.                   % `true ; false` is equivalent to `true`

你注意到上面 check/1 定义中的二元运算符 (#<)/2 了吗?

它使我们能够 运行 一般查询并获得合乎逻辑的答案。考虑一下!

?- Xs = [1,A,B,C], check(Xs).
Xs = [1,A,B,C], A in 3..sup, A#=<B+ -2, B in 5..sup, B#=<C+ -2, C in 7..sup ;
false.