我认为 prolog 标准op
场景的当前状态不一定是如何使用 op 的权威指南。将每个操作减少到这些类型代码(xf、fx、yfx 等)是一项了不起的发明,但这样的发明更多是时代精神的产物,而不是任何特定原理的产物(即结果不一定是定义的)由发明者的意图)。
xfy
是一个左侧有源,右侧有目标的操作。
xfx
是一个左侧有源,右侧有源的操作。
yfx
是一个左侧有目标,右侧有源的操作。
'xfy' (通常)与:
- 左到右
- 从上到下
- 统治
- 第一
- 声明性的
- 对“yfx”一无所知
“xfx”(通常)与:
- 操作数的判断
- 同类事物的比较
- 这就是我对这个怪人的全部
“yfx”(通常)与:
- 右到左
- 自下而上
- 平等主义
- 在最后(从而最终实现真正的统治)
- 程序化
- 容忍“xfy”的恶作剧
请注意,由于 'x' 和 'y' 在整个过程中是合作的,所以下面的结果是可行的:
xfy xfx yfx
但相比之下,这行不通:
yfx xfx xfy
一些例子(未经测试,只是草图)......
(term_expansion((_a),(true)):-(asserta(_a))) .
(term_expansion((_a | _b),(_b)):-(expand_term(_a,_c),asserta(_c))) .
:-
(op(10'1200,'xfy',':='))
,
(op(10'1200,'xfx',':~'))
,
(op(10'1200,'yfx',':-'))
.
(term_expansion((_a := _b :- _c),(term_expansion(_a,_b):-_c))) .
(term_expansion((_a :~ _b :- _c),(goal_expansion(_a,_b):-_c))) .
(term_expansion((_a := _b1 :~ _b2 :- _c),((_a := _b1 :- _c) | (_a :~ _b2 :- _c)))) .
在那个例子中:-
是yfx
. 语法是___consequent___ :- ___precedent___
; 右边是源,也就是域(因此首先评估),左边是目标,也就是codomain(因此第二次评估)。
在那个例子中:~
是xfx
. 语法是___goal_1___ :~ ___goal_2__
. 它对应于一个goal_expansion。
在那个例子中:=
是xfy
. 语法是___precedent___ := ___consequence__
. 它对应于 term_expansion。
:-
(op(10'700,'xfy','@='))
,
(op(10'700,'xfx','\\='))
,
(op(10'700,'yfx','#='))
.
(_x @= _y) :- ('='(_x,_y)) . % .i.e. term equality
% (_x1 \= _x2) % prolog builtin, not equal
% (_y #= _x) % via clpfd, math is generally simplification/\answer is left
在我看来,这是运算符\=
的明确示例xfx
。
术语source | domain, target | codomain
来自这里:https ://en.wikipedia.org/wiki/Morphism#Definition 。
我对范畴论知之甚少(目前),但我确实想xfx
知道identity morphism
.