prolog - 为什么 Prolog 运算符定义有 xfx?

标签 prolog operators syntactic-sugar iso-prolog

对于 Java 和 C 等允许 syntactic sugar 的语言与运营商,即中缀,他们使用 precedenceassociativity .

Prolog 还使用关联性:
左关联 - yfx
右结合 - xfy

但为什么会有xfx?

我在互联网上发现的唯一更清晰的是

xfx means that the operator 'dominates' upon its branches, while xfy or yfx stand for 'list construction', in sense that allow chaining expressions of same priority.



来自:Interpretation of Prolog's operator in an exercise来自 CapelliC

如果答案可以包括需要 xfx 的示例,因为 xfy 和 yfx 失败/没有意义,那将不胜感激。

序言引用:The Prolog Built-in Directive op

false笔记:

Please note that the operators you give in above link differ from both the standard and SWI! They are outdated by at least 10 years. As an example, it should be current_op(200,fy,-).



阅读 CapelliC 的两个当前答案后和 false很明显
非关联是定位更多相关信息的关键词。所以Operator associativity现在在关注非关联部分时对 xfx 更有意义。

最佳答案

运算符的说明符表示运算符的类(前缀、中缀、后缀)和结合性。
xfx意味着运算符不允许任何形式的结合性。换句话说:它不会与具有相同优先级的运算符嵌套。但是,它仍然与优先级较低的运算符嵌套。

此类运算符的最大部分是二元谓词,它们用于类似比较的含义,并且嵌套的含义 - 至少 - 与谓词的含义完全不同。它们都位于优先级 700:足够高以允许所有算术运算符在没有括号的情况下工作;低到足以与期望目标作为参数的控制结构和相关元谓词一起使用。想想(\+)/1 , (;)/2 , (',')/2 .

考虑 =< : 如果你想声明 X介于 1 和 3 之间,您不能写 1 =< X =< 3因为都没有 (1 =< X) =< 3也不是 1 =< (X =< 3)在 Prolog 中有意义。事实上,两者都会导致评估错误。你必须写1 =< X, X =< 3 .这意味着 =<(1, X), =<(X, 3) .

对于某些情况,嵌套可能有意义,请考虑 (A = B) = P .在这里,第一个=只是一个像 arity 2 中的任何其他函数一样的仿函数,而第二个 =是内置谓词(=)/2为了平等/统一。但这种情况很少见,值得用一对额外的圆括号突出显示它们。

另请注意 :- :- a.是无效的语法,因为 (:-)/1再次不嵌套。

算术运算符通常是左结合的,因为您从左到右处理它们,例如 1+2+4 ,先计算1+2然后才添加 4 .值得注意的异常(exception)是 (^)/2 : 是这样,因为(X^Y)^Z =:= X^(Y*Z)(X^(Y^Z))表示不能用更简单的运算符表达的术语。

关于prolog - 为什么 Prolog 运算符定义有 xfx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19935840/

相关文章:

c++ - 如何重载赋值运算符以允许我的类等于原始类型,例如 'int'

javascript - 最好的 JavaScript 语法糖

prolog - 如何在 Prolog 中添加多项式?

prolog - 为什么foreach只循环一次?

c# - 为什么 x++-+-++x 合法但 x+++-+++x 不合法?

Scala 任何数字类型的隐式转换

JavaScript 绑定(bind)语法

prolog - CLP 中变量的暂定绑定(bind)

C# 作为用户界面调用 Prolog 作为推理模块

Python 前置的加等于运算符