尝试在 Prolog 中定义运算符时出现问题

发布于 2024-09-25 14:07:02 字数 370 浏览 2 评论 0原文

我用以下代码定义了一个 prolog 文件:

divisible(X, Y) :-
    X mod Y =:= 0.

divisibleBy(X, Y) :-
    divisible(X, Y).

op(35,xfx,divisibleBy).

Prolog 抱怨说

'$record_clause'/2:无权修改 static_procedure `op/3'

我做错了什么?我想定义一个 divisibleBy 运算符,它允许我编写如下代码:

4 divisibleBy 2

谢谢。

I have defined a prolog file with the following code:

divisible(X, Y) :-
    X mod Y =:= 0.

divisibleBy(X, Y) :-
    divisible(X, Y).

op(35,xfx,divisibleBy).

Prolog is complaining that

'$record_clause'/2: No permission to modify static_procedure `op/3'

What am I doing wrong? I want to define an divisibleBy operator that will allow me to write code like the following:

4 divisibleBy 2

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

森林散布 2024-10-02 14:07:02

使用

:- op(35,xfx,divisibleBy).

:- 告诉 Prolog 解释器在加载文件时评估下一个术语,即进行谓词调用,而不是将其视为定义(在本例中是重新定义) op/3)。

Use

:- op(35,xfx,divisibleBy).

:- tells the Prolog interpreter to evaluate the next term while loading the file, i.e. make a predicate call, instead of treating it as a definition (in this case a redefinition of op/3).

薔薇婲 2024-10-02 14:07:02

@larsmans 给出的答案对于您原来的问题是准确的。

但是,您应该重新考虑是否您应该定义一个新的运算符。

一般来说,我强烈建议不要定义新的运算符,原因如下:

  • 可读性的提高常常被高估。
  • 它可能很容易在您通常不会想到有问题的地方引入新问题。
  • 它不能很好地“扩展”:少数操作员可以使演示幻灯片上的代码变得超级简洁,但是如果随着时间的推移添加更多有区别的联合案例会怎样?更多运营商?

The answer given by @larsmans is spot-on regarding your original problem.

However, you should reconsider if you should define a new operator.

In general, I would strongly advise against defining new operators for the following reasons:

  • The gain in readability is often overrated.
  • It may easily introduce new problems in places you wouldn't normally expect buggy.
  • It doesn't "scale" well: a small number of operators can make code on presentation slides super-concise, but what if you add more discriminate union cases over time? More operators?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文