自定义Prolog算术函数

发布于 2024-10-02 06:01:03 字数 246 浏览 5 评论 0原文

我正在寻找类似内置算术运算符的东西,它在 Prolog 中(特别是在 SWI-Prolog 中)有返回值。例如,如果运行 A is (1+2) + (3+2).,它将返回 A = 8.

如何定义 func 运算符来执行类似 + 运算符的操作?
例如,A 是 (2 func 3) func (4 func (2+1))。

I'm looking for something like built-in arithmetic operators that has a return value in Prolog (specifically in SWI-Prolog). E.g. if you run A is (1+2) + (3+2)., it returns A = 8..

How can I define func operator to do something like + operator?
E.g. A is (2 func 3) func (4 func (2+1))..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

伴随着你 2024-10-09 06:01:03

为了将函数 func 定位为内联,就像 + 运算符(以及许多其他运算符)一样,您需要为 func 定义优先顺序code> 及其参数。您可以在 SWI-PROLOG 中使用 op/3

例如,指令(使用 func/2 的前面的代码):

:- op(500,yfx,func).

要实现 func/2,您可以为您的语言编写一个元解释器(即,您编写一个 PROLOG 程序,该程序解析包括 func 在内的术语表达式并根据您的意愿解释它们),或者如果 func/2 是严格的算术,则可以使用 arithmetic_function/1 也作为指令,如下所示:

:- arithmetic_function(func/2).

使用以下定义来测试 func/ 2:

func(X, Y, Z) :- 
    Z is X + Y.

以您的示例为例:

?- A is (2 func 3) func (4 func (2+1)).
A = 12.

In order to situate your function func inline just as the + operator (along with many others), you'll need to define a precedence order for func and it's arguments. You can achieve this in SWI-PROLOG with op/3.

For example, the directive (preceding code where func/2 is used):

:- op(500,yfx,func).

To implement func/2, you can either write a meta-interpreter for your language (i.e., you write a PROLOG program which parses term expressions including func and interprets them as you wish), or if func/2 is strictly arithmetic, you can use arithmetic_function/1 also as a directive, as follows:

:- arithmetic_function(func/2).

Testing this with the following definition for func/2:

func(X, Y, Z) :- 
    Z is X + Y.

Gives, with your example:

?- A is (2 func 3) func (4 func (2+1)).
A = 12.
眸中客 2024-10-09 06:01:03

它在手册中,arithmetic_function/1 会将您的关系提升为 is 可以理解的东西,请参阅

http://www.swi-prolog.org/pldoc/doc_forobject=section(2,'4.26',swi('/doc/Manual/extendarith.html'))

It is in the manual, arithmetic_function/1 will raise your relation into something which is can understand, see

http://www.swi-prolog.org/pldoc/doc_forobject=section(2,'4.26',swi('/doc/Manual/extendarith.html'))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文