我是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个给我错误。
任何人都可以对此有所了解吗?
谢谢!
答案 0 :(得分:1)
您正在尝试将+
定义为后缀运算符。但是,+
也被定义为中缀运算符,并且标准不允许将运算符定义为后缀和中缀。如果你真的想这样做,你必须首先使用优先级0取消定义中缀运算符。
但是,我只能建议您不要更改+
或-
等标准运算符。这就像你会改变C,C ++,C#,Java,Perl,PHP,Javascript之类的运算符优先级:它会让你作为程序员的生活变得非常非常悲惨。
我不建议在Prolog中使用%
作为运算符:%
开始发表评论。如果要将其用作运算符,则必须始终编写'%'
引号。 Prolog已将mod
和rem
定义为运算符。还不够吗?
你可能正在使用符合ISO标准的GNU Prolog。其他Prolog允许您同时定义中缀和后缀。见#237。但是那些其他Prolog以不同的方式做了很多事情。
作为一般性评论:作为初学者,最好远离更改操作员表。你真的需要先习惯标准的操作员。而且凭借更多的经验,您最有可能只希望添加具有与现有运算符相似优先级的新运算符。
iso-prolog:ISO / IEC 13211-1:1995 6.3.4.3运营商,最后一段:
不应存在具有相同名称的中缀和后缀运算符。
答案 1 :(得分:1)
GNU Prolog documentation声明
一个原子可以有多个运算符定义(例如前缀和类似+的中缀)但是原子不能同时具有中缀和后缀运算符定义。
从这里前两个声明的错误。然后您应该将说明符更改为fy
。
模运算符需要单引号。