我写了一个Prolog程序来解决简单的三角方程。我写它来获得三角函数的值。例如,我可以获得sin(45)
的值,但我无法将sin(45)
的值分配给术语sin(45)
。我尝试了=,==,=:=
运营商,但他们没有工作。实际上,我想将sin(45)
的值传递给程序的下一个代码而不是术语sin(45)
。
感谢...
答案 0 :(得分:4)
算术由一些专门的内置函数执行,例如is / 2或(<)/ 2,它们将右手术语评估为表达式,并统一数字用左手边的价值。最常见的用法是为 free 变量赋值,例如
?- X is sin(pi/2).
X = 1.0.
注意sin / 1的参数是弧度的。在评估之后,将现在绑定到数值的变量传递给下一个代码。
答案 1 :(得分:1)
prolog中的复合术语("仿函数"或"结构")没有任何数字"值"。 Prolog算术引擎没有"分配"计算到这样一个术语的值,它只是使用计算值作为参数 在外部操作中或将计算值限制为变量(因为"是"内置谓词)#/ p>
Y is sin(45), ... % Y is now now bound to the numeric result of sin(45), do with Y what you whant
如果你不想忘记罪的价值的起源(45), 您可以使用其他参数创建另一个术语,例如
Y is sin(45), MyTerm=funcresult(sin,45,Y), ... % then pass MyTerm wherever you whant or return it to the caller
MyTerm的消费者可以统一
MyTerm= funcresult(F,X,Y),
并获得函数名称(F = sin)和参数(X = 45)以及结果本身(Y)
你甚至可以assert(funcresult(sin,X,Y))
并为所有已计算的函数值提供数据库(不要忘记
:-dynamic(funcresult/3).
在这种情况下指令。)
另请注意,sin()通常接受弧度,而不是等级,所以sin(45)可能会产生你不期望的东西
答案 2 :(得分:0)
我研究并了解,无法使用=
,==
或=:=
等过程语言将值分配给术语。当我们使用这个运算符时,prolog只是比较这两个值。因此,我们应该通过
value作为参数。例如,
isolax(1,sin(U) = V,U = R):-
getasin(V,R).
getatan(X,R):-R is atan(X).
即使我们没有定义事实或规则来获得sin,cos,tan,prolog自动回答sin,cos,tan。