如果
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
答案 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了。