gpt4 book ai didi

prolog - Between/3 不能递归吗?

转载 作者:行者123 更新时间:2023-12-01 14:35:26 24 4
gpt4 key购买 nike

我已经看到了Prolog Prologue between/3 的定义:

between(Lower, Upper, Lower) :-
Lower =< Upper.
between(Lower1, Upper, X) :-
Lower1 < Upper,
Lower2 is Lower1 + 1,
between(Lower2, Upper, X).

我不明白为什么需要递归。 between 的逻辑定义可能是:

between(Lower, Upper, Something):-
Lower =< Upper,
Lower =< Something,
Something =< Upper.

我在 gprolog 上尝试过它可以工作,但仅适用于简单查询:

| ?- between(0,5,1).

yes

对于带有变量的查询,我得到:

| ?- between(0,5,X).
uncaught exception: error(instantiation_error, (=<)/2)

我不太明白为什么。

我认为 Prolog 需要某种引用号来统一变量,但为什么 (=<)/2 上出现神秘错误?

最佳答案

一旦您知道 Prolog 中的通用算术是做什么的,这个错误就不那么神秘了。简而言之,它只是进行非逻辑的“计算并给出答案”类型的算术。比较(因此所有 </2=</2=:=/2 等)要求两边都有算术表达式; is/2假设它的左侧有一个算术表达式,右侧有一个自由变量。因此,您可以执行以下操作:

?- X is 3^1.3.
X = 4.171167510947728.

?- 1 =:= sin(pi/2).
true.

如果你真的足够仔细地阅读 GNU-Prolog 手册,你应该会发现,在 relevant section 的开头。 ,下面两句话:

An arithmetic expression is a Prolog term built from numbers, variables, and functors (or operators) that represent arithmetic functions. When an expression is evaluated each variable must be bound to a non-variable expression.

(强调我的)

between/3这样的谓词, plus/3 ,或succ/2特殊用途整数算术的示例。它们有它们的用途。然而,大多数用于实际整数数学运算的用途已被 CLPFD 取代。对于 GNU-Prolog,您应该 consult the documentation ,但举一个简短的例子,模拟 between/3 ,你可以说:

?- fd_domain(X, 0, 2), fd_labeling(X).
X = 0 ? ;
X = 1 ? ;
X = 2
yes

您应该注意到,这绝对不是递归(回答标题中的问题)。当然,我们都知道,在某种程度上,为了得到这些答案,需要递归或迭代。

关于prolog - Between/3 不能递归吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com