gpt4 book ai didi

prolog - Prolog 中的可逆数值计算

转载 作者:行者123 更新时间:2023-12-03 23:31:20 28 4
gpt4 key购买 nike

在阅读 SICP 时,我遇到了逻辑编程第 4.4 章。然后我开始研究 Prolog 编程语言,并试图理解 Prolog 中的一些简单赋值。我发现 Prolog 在数值计算方面似乎有问题。

这是标准 Prolog 中阶乘的计算:

f(0, 1).
f(A, B) :- A > 0, C is A-1, f(C, D), B is A*D.

我发现的问题是我需要引入两个辅助变量( CD ),一个新的语法( is )并且问题是不可逆的(即, f(5,X) 按预期工作,但是 f(X,120) 没有)。

天真地,我希望至少 C is A-1, f(C, D)以上可以替换为 f(A-1,D) ,但即使这样也行不通。

我的问题是:为什么我需要在数值计算中而不是在其他查询中做这个额外的“东西”?

我确实理解(而且 SICP 对此非常清楚)一般来说,关于“做什么”的信息不足以回答“如何做”的问题。因此(至少一些)数学问题中的陈述性知识不足以实际解决这些问题。但这引出了下一个问题:Prolog 中这个额外的“东西”如何帮助我将公式限制在那些“做什么”足以回答“怎么做”的问题上?

最佳答案

is/2非常低级和有限。正如您正确观察到的那样,它不能用于所有方向,因此不是真正的关系。

对于可逆算术,请使用 Prolog 系统的约束求解器。

例如,SWI-Prolog 的 CLP(FD) manual包含以下 n_factorial/2 的定义:

:- use_module(library(clpfd)).

n_factorial(0, 1).
n_factorial(N, F) :- N #> 0, N1 #= N - 1, F #= N * F1, n_factorial(N1, F1).

以下示例查询表明它可以在所有方向上使用:
?- n_factorial(47, F).
F = 258623241511168180642964355153611979969197632389120000000000 ;
false.

?- n_factorial(N, 1).
N = 0 ;
N = 1 ;
false.

?- n_factorial(N, 3).
false.

当然,这个定义仍然依赖于统一,因此您不能插入任意整数表达式。像 2-2 这样的术语(在前缀符号中是 -(2,2))与 0 不冲突.但是,如果您将其重写为:
:- use_module(library(clpfd)).

n_factorial(N, F) :- N #= 0, F #= 1.
n_factorial(N, F) :- N #> 0, N1 #= N - 1, F #= N * F1, n_factorial(N1, F1).

示例查询及其结果:
?- n_factorial(2-2, -4+5).
true .

关于prolog - Prolog 中的可逆数值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2896701/

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