如何通过prolog处理公式?

时间:2010-01-01 10:46:46

标签: prolog formula

如果

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

6 个答案:

答案 0 :(得分:5)

不幸的是,使用Prolog作为数值求解器并非易事。

?- X is 1 + 2*X.

会引发同样的错误,而答案看起来很明显。

虽然Prolog能够深入了解其知识库以神奇地解决逻辑问题,但它不能对数字做同样的事情。 问题不仅是大多数常见数字集的无穷大,而且还有连续性(即1.1234567890123456789之后是什么数字?)。

因此,简而言之:即使在Prolog中,我也不相信有可能编写一个简单的程序来解决这个问题。

但是,有some attempts to implement some numeric solvers in Prolog(参见右上方的缓存版本)。

答案 1 :(得分:2)

这不是你原来问题的答案,但是从你对其他答案的一些回答中我发现你犯了一个根本性的错误:

您不能只在Prolog提示符下输入谓词!

您可能想再次阅读。 (而这正是你的Prolog试图告诉你的Undefined procedure: :-/2)。因此,如果杰罗姆建议(引用):

:- 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的其他问题发表了评论。

答案 2 :(得分:1)

在你的问题中:

a+b+c=1
a^2+b^2+c^2=2
a^3+b^3+c^3=3
a^4+b^4+c^4=?

这是一个非线性方程组。 This链接描述了解决简单(非线性)系统的数学方法。

[编辑] 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中实现这个序列,但这并不容易......)

答案 3 :(得分:1)

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}.

有关详细信息,请参阅section A.8 of SWI-Prolog documentation

SICStus Prolog 还有一个名为CHR的约束系统(约束处理规则)。

GNU Prolog 有一个有限域求解器,但它只适用于整数。

答案 4 :(得分:0)

你正在成倍增长,而不是指数化。我不知道Prolog是否有内置取幂运算符,但构建一个不应该超过:

expt(var,0): - 1, expt(var,n): - var * expt(var,n-1)

也就是说,如果我实际上正确地记住了我的prolog语法(那是,自从我上次编写prolog代码以来已接近20年)。

答案 5 :(得分:0)

您可以尝试添加一些额外的事实来定义正数集和 一组正的有理数。我的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了。