【问题标题】:Prolog infix operator definitionProlog中缀运算符定义
【发布时间】:2012-02-18 11:33:17
【问题描述】:

我最近在学习 Prolog,发现用于定义中缀运算符的三种类型令人困惑。

在指定运算符的类型时,xfx、xfy 和 yfx 有什么区别? 我用谷歌搜索了这个问题,但没有发现任何有用的东西。

我尝试在 Prolog 中输入以下代码:

:- op(500,yfx,is_alive).
is_alive(A,B) :- display([A,B]).
:- op(500,xfy,is_alive2).
is_alive2(A,B) :- display([A,B]).
:- op(500,xfx,is_alive3).
is_alive3(A,B) :- display([A,B]).

和输出:

| ?- 1 is_alive 2.
'.'(1,'.'(2,[]))

yes
| ?- 1 is_alive2 2.
'.'(1,'.'(2,[]))

yes
| ?- 1 is_alive3 2.
'.'(1,'.'(2,[]))

yes

结果对我来说没有什么不同。

【问题讨论】:

    标签: prolog iso-prolog infix-operator


    【解决方案1】:

    操作符的“类型”控制关联性,例如表达式“5 - 4 - 3”应解释为“(5 - 4) - 3”,即左结合性,还是“5 - (4 - 3)”,即右结合性。

    如果减号运算符应该按预期工作,则需要将其定义为“yfx”,使其具有左关联性。 'xfx 和 'xfy' 等其他类型是对此的变体。在http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html 上查看更多信息。

    【讨论】:

    • 尝试为您的每个运算符执行 (1 is_alive 2 is_alive 3),您会看到不同
    【解决方案2】:

    如果您的 Prolog 符合 ISO 标准,您可以使用 write_canonical 来分析运算符优先级和关联性的影响。比如

    ?- write_canonical(1+2*3).
    +(1,*(2,3))
    true.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多