Prolog重新分配操作员



我是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个给了我错误。

有人能解释一下吗?

谢谢!

GNU Prolog文档指出

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

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

您正试图将+定义为后缀运算符。然而,+也被定义为中缀运算符,并且标准不允许将运算符同时定义为后缀和中缀。如果你真的想这样做,你必须首先使用优先级0来取消对中缀运算符的定义。

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

我不建议在Prolog中使用%作为运算符:%开始注释。如果你想把它用作运算符,你必须一直写引用的'%'。Prolog已经将modrem定义为运算符。这还不够吗?

您可能正在使用GNU Prolog,它完全符合ISO。其他Prolog允许您同时定义中缀和后缀。参见#237。但其他Prolog在很多事情上都有所不同。

一般来说:作为一个初学者,最好不要更换操作员表。你真的需要先习惯标准运算符。有了更多的经验,你可能更喜欢只添加优先级与现有运算符相似的新运算符。


iso序言:iso/IEC 13211-1:1995 6.3.4.3操作员,最后一段:

不应存在具有相同名称的中缀运算符和后缀运算符。

相关内容

  • 没有找到相关文章

最新更新