2

我是 prolog 的新手,我正在尝试通过更改优先级来重新分配 prolog 中的运算符。我遇到以下 4 个错误:

 :-op(1000,yf,+).  %unary plus%
 :-op(1000,yf,-).   %unary minus%
 :-op(750,yfx,"%").   %modulo%

前两个给了我一个类似的错误,如下所示:

warning: directive failed (op(1000,xf,+)) with exception (error(permission_error(create,operator,+),op/3))

我也收到模一错误(一个不同的错误),但我怀疑这是因为我不应该%用引号括起来(但我应该如何将它与评论标记区分开来?)。

我重新定义了一堆其他运算符(例如加法运算符:-op(500,yfx,+).),它们没有给我带来任何问题。只有上面列出的 3 个给我错误。

任何人都可以对此有所了解吗?

谢谢!

4

2 回答 2

1

您正在尝试定义+为后缀运算符。但是,+也被定义为中缀运算符,标准不允许将运算符定义为后缀和中缀。如果你真的想这样做,你必须首先使用优先级 0 取消定义中缀运算符。

但是,我只能建议您不要更改标准运算符,例如+or -。就像您要更改 C、C++、C#、Java、Perl、PHP、Javascript 等中的运算符优先级:这会让您作为程序员的生活非常非常痛苦。

我不建议%在 Prolog 中使用 as 运算符:%开始评论。如果您想将其用作运算符,则必须一直写'%'quoted。Prolog 已经定义为操作符modrem这还不够吗?

您可能正在使用非常符合 ISO 标准的 GNU Prolog。其他 Prolog 允许您同时定义中缀和后缀。见#237。但是那些其他 Prologs 做很多不同的事情。

总而言之:作为初学者,最好远离更改操作员表。您确实需要先习惯标准运算符。如果有更多经验,您很可能更愿意只添加与现有运算符具有相似优先级的新运算符。


:ISO/IEC 13211-1:1995 6.3.4.3 运算符,最后一段:

不能有
同名的中缀和后缀运算符。

于 2013-02-18T11:47:37.683 回答
1

GNU Prolog文档指出

一个原子可以有多个运算符定义(例如前缀和中缀,如+),但是一个原子不能同时具有中缀和后缀运算符定义。

从这里开始,前两个声明的错误。然后您应该将说明符更改为fy. 模运算符将需要单引号。

于 2013-02-18T11:49:42.530 回答