检查序言中多于一个的数字列表
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
关心的所有数字都是整数。
如果是,请继续阅读!
使用clpfd!
:- 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.
我在序言中有一个数字列表。号码已经是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
关心的所有数字都是整数。
如果是,请继续阅读!
使用clpfd!
:- 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.