我在prolog中有一个数字列表。数字已经排序。我想检查任何数字是否重复,并且任何两个数字之间的差异大于1.如何检查它。任何的想法。谢谢。
?- check([1,3,4]). %expectation
false.
?- check([2,5,7,10]). %expectation
true.
答案 0 :(得分:2)
我假设列表alreade尝试它...
check([_]).
check(L):-append([],[X1,X2|T],L),X1+1<X2,check([X2|T]).
答案 1 :(得分:2)
让我猜猜......
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`
您是否注意到上述(#<)/2
定义中的二元运算符check/1
?
它允许我们运行常规查询并获得逻辑上合理的答案。考虑!
?- 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.