Prolog 序言数的范围

Prolog 序言数的范围,prolog,Prolog,我遇到过这样的情况,有人可以生成从低到高的一系列数字 我对prolog非常陌生,所以我很难准确地理解解决方案是如何工作的。因此,我想知道是否有人会友好地介绍一下它是如何为我工作的 更具体地说,我很难理解回溯以及Prolog解释器如何获得解决方案 我还想知道如何创建这样的谓词 范围(上限,K) 所以当我打电话的时候 射程(5,K)。 K=1; K=2; . . K=5 为清晰起见进行了编辑。对于范围(+U,-K)最好的答案是使用介于/3之间的内置谓词。但这里有一个可能的实现: range(_, 1

我遇到过这样的情况,有人可以生成从低到高的一系列数字

我对prolog非常陌生,所以我很难准确地理解解决方案是如何工作的。因此,我想知道是否有人会友好地介绍一下它是如何为我工作的

更具体地说,我很难理解回溯以及Prolog解释器如何获得解决方案

我还想知道如何创建这样的谓词 范围(上限,K)

所以当我打电话的时候

射程(5,K)。 K=1; K=2; . . K=5

为清晰起见进行了编辑。

对于
范围(+U,-K)
最好的答案是使用
介于/3之间的内置谓词。但这里有一个可能的实现:

range(_, 1).
range(U, K):- range(U, K1), (K1 >= U, !, false ; K is K1+1).
有比这个更好的解决方案,但我认为用它来解释是很好的。这并不完美,因为给出一个否定的
U
会给你一个错误的解决方案,但你可以从这里开始让它变得完美

示例

假设您运行以下查询:

?- range(2, K).
Prolog将试图通过寻找规则来满足给定的目标,这些规则的主体将与之统一。可以使用第一条规则(
range(u,1)
),并创建一个选择点,因为有可供考虑的备选方案(即第二条规则)。因此,由于匿名变量
\uuu
与2和1相结合,与
K
相结合,您得到了第一个答案:

K = 1 ;
现在Prolog返回到最后一个选择点,并尝试使用第二条规则满足
范围(2,K)
。它通过将
U
与规则中的变量
K
和变量
K
统一起来,并将条件放在目标堆栈上,如下所示:

range(2, K1), (K1 >= 2, !, false ; K is K1 + 1)
为了满足第一个目标,Prolog考虑第一条规则并创建一个选择点<代码>K1
被实例化为1,目标堆栈变为:

(1 >= 2, !, false ; K is 1 + 1)
现在,因为有一个or操作符(
),Prolog将尝试满足第一组子目标,并在这里创建一个选择点。但是,
1>=2
为false,因此它返回到最后一个选择点,并尝试满足
K为1+1
,通过将
K
实例化为2成功。因此,您将获得第二个结果:

K = 2 ;
Prolog现在返回到为
范围(2,K1)
创建的选择点,并使用第二条规则。目标堆栈变为:

range(2, K2), (K2 >= 2, !, false ; K1 is K2+1), (K1 >= 2, !, false ; K is K1 + 1)
Prolog再次尝试使用第一条规则来满足
范围(2,K2)
,该规则将
K2
与1统一,并创建一个选择点

(1 >= 2, ! false ; K1 is 1+1), (K1 >= 2, !, false ; K is K1+1)
由于or运算符,现在Prolog有两种选择,但第一种选择失败,因为
1>=2
为false。第二个满足于将
K1
实例化为2

(2 >= 2, !, false ; K is 2 + 1)

现在,Prolog创建一个选择点,获取第一组目标
(2>=2,!,false)
,并尝试满足它们
2>=2
为真,然后cut运算符(
)将销毁所有以前的选择点
false
为false,执行停止。

在Prolog中,您不使用函数,而是使用描述关系的谓词。谓词可以是true也可以是false,它们不返回任何内容。所以你第二个问题的答案是否定的。看看这个问题,它可能会回答你的问题。对不起我的无知。我更新了我的问题,以便更清楚地了解我的问题。我假设谓词
范围(U,K)
对于1到
U
之间的所有
K
s都应该为真。下一个问题是“您想如何使用谓词?”。
范围(+U,-K)
范围(+U,-K)
之间的实现可能存在差异。更准确地说,您是只想满足
K
为自由变量的
range/2
目标,还是还想检查给定的
K
是否介于1和
U
之间?K将是自由变量。所以我希望K的范围仅为1到U。