将sin函数的答案赋给prolog中的sin(X)项

将sin函数的答案赋给prolog中的sin(X)项,prolog,Prolog,我写了一个Prolog程序来解简单的三角方程。我写它是为了得到三角函数的值。例如,我可以获得sin(45)的值,但我不能将sin(45)的值分配给术语sin(45)。我尝试了=,=,=:=操作符,但它们不起作用。实际上,我想将sin(45)的值传递给程序的下一个代码,而不是术语sin(45)。 多亏了…算术是由一些专门的内置项执行的,比如/2,或者(prolog中的复合项(“functor”或“structures”)没有任何数字“值”。 Prolog算术引擎不会“分配”计算值给这样一个术语,它

我写了一个Prolog程序来解简单的三角方程。我写它是为了得到三角函数的值。例如,我可以获得
sin(45)
的值,但我不能将
sin(45)
的值分配给术语
sin(45)
。我尝试了
=,=,=:=
操作符,但它们不起作用。实际上,我想将
sin(45)
的值传递给程序的下一个代码,而不是术语
sin(45)

多亏了…

算术是由一些专门的内置项执行的,比如/2,或者(prolog中的复合项(“functor”或“structures”)没有任何数字“值”。 Prolog算术引擎不会“分配”计算值给这样一个术语,它只是将计算值用作参数 在外部操作或将计算值绑定到变量中(与“is”内置谓词一样)

如果你不想忘记罪的价值起源(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)也许会产生一些你不期望的结果

我研究并理解,不能使用
=
=
或类似过程语言的
=:=
将值分配给一个术语。当我们使用这个操作符时,序言只是比较两个值。因此,我们应该传递 值作为参数。例如

isolax(1,sin(U) = V,U = R):-
    getasin(V,R).   

getatan(X,R):-R is atan(X).

尽管我们没有定义自动获取sin、cos、tan、prolog的sin、cos、tan答案的事实或规则。

这不是一个完全准确的答案。
=/2
操作符将统一这两个参数。它可以起到比较的作用,但也可以起到赋值的作用。
的目的是/2
是规范对于将右侧的算术表达式指定给左侧的变量而言,这是一个很好的解释。
:-dynamic(funcresult/3). 
isolax(1,sin(U) = V,U = R):-
    getasin(V,R).   

getatan(X,R):-R is atan(X).