我是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已经将mod
和rem
定义为运算符。这还不够吗?
您可能正在使用GNU Prolog,它完全符合ISO。其他Prolog允许您同时定义中缀和后缀。参见#237。但其他Prolog在很多事情上都有所不同。
一般来说:作为一个初学者,最好不要更换操作员表。你真的需要先习惯标准运算符。有了更多的经验,你可能更喜欢只添加优先级与现有运算符相似的新运算符。
iso序言:iso/IEC 13211-1:1995 6.3.4.3操作员,最后一段:
不应存在具有相同名称的中缀运算符和后缀运算符。