Prolog重新分配运营商

时间:2013-02-18 10:53:34

标签: prolog operators redefine iso-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个给我错误。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

但是,我只能建议您不要更改+-等标准运算符。这就像你会改变C,C ++,C#,Java,Perl,PHP,Javascript之类的运算符优先级:它会让你作为程序员的生活变得非常非常悲惨。

我不建议在Prolog中使用%作为运算符:%开始发表评论。如果要将其用作运算符,则必须始终编写'%'引号。 Prolog已将modrem定义为运算符。还不够吗?

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

作为一般性评论:作为初学者,最好远离更改操作员表。你真的需要先习惯标准的操作员。而且凭借更多的经验,您最有可能只希望添加具有与现有运算符相似优先级的新运算符。


:ISO / IEC 13211-1:1995 6.3.4.3运营商,最后一段:

  

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

答案 1 :(得分:1)

GNU Prolog documentation声明

  

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

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