我想使用连字符运算符将对象表示为对,即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
我原本以为这会失败而是...... 我的问题:
X
的<显示的)绑定中删除括号? 连字符运算符的可能相关的优先规则:
?- current_op(P,T,-).
P = 200,
T = fy ;
P = 500,
T = yfx.
(这是在SWI-Prolog开发人员分支,但我怀疑这将是SWI特定的。)
答案 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)
之类的谓词非常有用。