使用运算符连字符的嵌套对

时间:2014-10-16 23:38:00

标签: prolog

我想使用连字符运算符将对象表示为对,即From-To。 我想将节点表示为对(表示FCA概念),即Extent-Intent。 所以我得到如下内容:

([1]-[a])-([2,3]-[b])

括号确保表达式被正确消除歧义:单个外连字符表示边运算符,两个内连字符表示节点运算符。

这是我的问题:

?- X = (a-b)-(c-d), X = Y1-Y2-Y3.
X = a-b- (c-d),
Y1 = a,
Y2 = b,
Y3 = c-d

我原本以为这会失败而是...... 我的问题:

  1. 为什么在X的<显示的)绑定中删除括号?
  2. 为什么第一个连字符的解释方式与第三个不同?
  3. 连字符运算符的可能相关的优先规则:

    ?- current_op(P,T,-).
    P = 200,
    T = fy ;
    P = 500,
    T = yfx.
    

    (这是在SWI-Prolog开发人员分支,但我怀疑这将是SWI特定的。)

1 个答案:

答案 0 :(得分:3)

通常,write_canonical对于理解Prolog如何解释运算符非常有用。

?- write_canonical(a-b-c).
-(-(a,b),c)
true.

?- write_canonical(a-(b-c)).
-(a,-(b,c))
true.

?- write_canonical(a-b-c-d).
-(-(-(a,b),c),d)
true.

?- write_canonical(a-b-(c-d)).
-(-(a,b),-(c,d))
true.

然后,这种情况是有道理的,假设这里的所有连字符都是二元运算符,右手参数具有严格的低优先级:

?- X = (a-b)-(c-d), X = Y1-(Y2-Y3).
X = a-b- (c-d),
Y1 = a-b,
Y2 = c,
Y3 = d.

?- X = (a-b)-(c-d), X = (Y1-Y2)-Y3.
X = a-b- (c-d),
Y1 = a,
Y2 = b,
Y3 = c-d.

显示嵌套术语-(-(a,b),-(c,d))并非必须使用第一个括号。第二对括号是必要的,否则就意味着-(-(-(a,b),c),d)

PS。由于我不能始终保持运算符优先级规则,我试图避免运算符。显式仿函数没有错。连字符对于keysort/2之类的谓词和library(ugraphs)之类的谓词非常有用。