检查prolog

时间:2016-02-20 15:06:01

标签: list prolog clpfd

我在prolog中有一个数字列表。数字已经排序。我想检查任何数字是否重复,并且任何两个数字之间的差异大于1.如何检查它。任何的想法。谢谢。

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

2 个答案:

答案 0 :(得分:2)

我假设列表alreade尝试它...

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

答案 1 :(得分:2)

让我猜猜......

  • 您正在使用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`

您是否注意到上述(#<)/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.