如果
a+b+c=1
a^2+b^2+c^2=2
a^3+b^3+c^3=3
然后
a^4+b^4+c^4=?
我知道结果是 25/6,但是如何通过 prolog 计算呢?
我试过这个但失败了:
[1] 5 ?- A+B+C=:=1,A**2+B**2+C**2=:=2,A**3+B**3+C**3=:=3.
ERROR: Unhandled exception: =:=/2: Arguments are not sufficiently instantiated
不幸的是,使用 Prolog 作为数值求解器并非易事。
?- X is 1 + 2*X.
会引发同样的错误,而答案看起来很明显。
虽然 Prolog 能够钻取其知识库以神奇地解决逻辑问题,但它不能对数字做同样的事情。问题不仅在于最常见数字集的无限性,而且还在于连续性(即 1.1234567890123456789 之后是什么数字?)。
所以,简而言之:我不相信可以编写一个简单的程序来解决这个问题,即使在 Prolog 中也是如此。
然而,已经有人尝试在 Prolog 中实现一些数值求解器(参见右上角的缓存版本)。
这不是对您最初问题的回答,但从您对其他答案的一些回答中,我看到您犯了一个根本性错误:
您不能只在 Prolog 提示符下输入谓词!
你可能想再读一遍。(这就是您的 Prolog 试图告诉您的内容Undefined procedure: :-/2
)。因此,如果例如 Jerome 建议(引用):
:- use_module(library(clpr)).
run(A, B, C) :- {A+B+C=1, A*A+B*B+C*C=2}.
您需要将此代码放入文件和consult/1
文件中(查找手册以获取“咨询”)。在 Prolog 命令提示符下,您只能输入查询,不能输入谓词。(有一些方法可以解决这个问题,但你最好先把“咨询”的事情弄清楚)。
查阅文件后,您将输入类似的查询run(A,B,C)
并获得一些结果。这样,您会发现提供的大部分代码也将为您运行。
您真的应该考虑阅读 Prolog 的介绍,正如有人评论您关于 SO 的其他问题之一,然后才不得不解决特定问题。
Prolog 的标准 ISO Prolog 不包括约束逻辑编程谓词,这是您将约束表达为方程式所需的。但是,一些 prolog 实现有自己的扩展:
SWI-Prolog包括一个用于对实数进行约束逻辑编程的模块。这允许您编写约束,例如:
:- use_module(library(clpr)).
run(A, B, C) :- {A+B+C=1, A*A+B*B+C*C=2}.
有关详细信息,请参阅SWI-Prolog 文档的 A.8 节。
SICStus Prolog还有一个称为 CHR(约束处理规则)的约束系统。
GNU Prolog有一个有限域求解器,但它只适用于整数。
你是在乘法,而不是求幂。我不知道 Prolog 是否有内置的幂运算符,但构建一个不应该超过:
expt(var,0) :- 1, expt(var, n) :- var*expt(var, n-1)
也就是说,如果我真的正确地记住了我的 prolog 语法(距离我上次编写 prolog 代码已经过去了将近 20 年)。
在你的问题中:
a+b+c=1
a^2+b^2+c^2=2
a^3+b^3+c^3=3
a^4+b^4+c^4=?
它是一个非线性方程组。此链接描述了解决简单(非线性)系统的数学方法。
[编辑]你不能只用一两个命令通过 Prolog 解这个方程,这并不像你想象的那么容易......
但是....你可以做一些数学运算:
a+b+c=1
a^2+b^2+c^2 = ( a + b + c )^2 - 2ab - 2ac - 2bc = 2
a^3+b^3+c^3 = ( a + b + c )*(a^2 + b^2 + c^2 - ab - ab - bc ) + 3abc = 3
.
.
.
并解决它!(你可以在 Prolog 中实现这个序列,但这并不容易......)
您可以尝试添加一些额外的事实来定义正数集和正有理数集。我的 Prolog 有点生锈,但类似于:
number(1).
number(N) :- number(N-1).
rational(X) :- number(A), number(B), X is A/B.
然后添加对 A,B,C 的约束,给出:
?- rational(A), rational(B), rational(C), A+B+C=:=1,A**2+B**2+C**2=:=2,A**3+B**3+C**3=:=3.
但是,我怀疑在为 B 尝试第二个值之前,搜索有理数集的顺序将达到 A 的无穷大。一种解决方法/作弊(假设对解决方案有一些了解),将只定义小于的数字(比如说)100 来限制搜索空间。
number(1).
number(N) :- N <= 100, number(N-1).
对不起,如果我的语法有点不对劲。我已经很久很久没有使用 Prolog 了。