Recursion Prolog约束编程与递归

Recursion Prolog约束编程与递归,recursion,prolog,clpfd,Recursion,Prolog,Clpfd,我使用的是Prolog的整数约束库(clpfd),我很难让它使用范围信息可靠地回答查询。作为示例程序: puzzle(X, Y) :- X in 1..5, X #>= Y. 然后可以在固定时间内回答以下查询:puzzle(2,-100000000000000000000)。无论Y的大小如何,此查询都是常量 我试图得到同样的行为,但在递归设置中(这更接近于我实际试图解决的问题)。但是,clpfd在这种情况下似乎无法推断范围信息: recursive(0). recursive(X

我使用的是Prolog的整数约束库(clpfd),我很难让它使用范围信息可靠地回答查询。作为示例程序:

puzzle(X, Y) :-
  X in 1..5,
  X #>= Y.
然后可以在固定时间内回答以下查询:
puzzle(2,-100000000000000000000)
。无论Y的大小如何,此查询都是常量

我试图得到同样的行为,但在递归设置中(这更接近于我实际试图解决的问题)。但是,
clpfd
在这种情况下似乎无法推断范围信息:

recursive(0).
recursive(X) :-
    X1 #= X - 1,
    recursive(X1).
使用此设置,查询
递归(1000000000000)
需要大量时间(似乎线性搜索到0)

对于第二个例子,有没有一种方法可以得到恒定时间的计算结果


似乎只有当变量跨越一个谓词时,clpfd才足够聪明来实现这个恒定的时间步长。但是,似乎应该有某种方法向prolog提示递归设置中发生的归纳,或者这要求太多了?

可以使用一个谓词来实现
recursive/1
谓词。如果在两个示例中用
true
或传统的prolog类比替换所有clpfd内容,在第一个示例中得到一个不做任何事情的O(1)谓词,在第二个示例中得到一个不做任何事情的O(N)谓词。clpfd并没有从根本上改变Prolog计算谓词的方式。因此,我认为您对库的期望有点高,但我也认为如果我们看到您的实际问题,我们可能会帮助您找到解决方案。比较的成本是较小数字的O(ld N)。
recursive(-1)
不终止-出于同样的原因,我认为您可能会有更好的结果,只要问一个新问题就可以解决这个问题。使用a实现
递归/1
谓词是可能的。如果您在两个示例中用
true
或传统的Prolog类比替换所有clpfd内容,您将得到一个O(1)在第一个示例中不执行任何操作的谓词和在第二个示例中不执行任何操作的O(N)谓词。clpfd并没有从根本上改变Prolog计算谓词的方式。因此,我认为您对库的期望有点高,但我也认为如果我们看到您的实际问题,我们可能会帮助您找到解决方案。比较的成本是较小数字的O(ld N)。
recursive(-1)
不会终止-出于同样的原因,我认为您可能会有更好的结果,只要用这个问题问一个新问题。