プロローグ標準シーンの現状op
が必ずしもopの使い方の決定的なガイドになるとは思いません。各 op をこれらの型コード (xf、fx、yfx など) に縮小することは素晴らしい発明でしたが、そのような発明は、特定の理論的根拠の産物というよりも時代精神の産物です (つまり、結果は必ずしも定義されていません)。発明者の意図による)。
xfy
左側にソース、右側にターゲットを持つ op です。
xfx
左にソース、右にソースを持つ op です。
yfx
左にターゲット、右にソースを持つ op です。
'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___
。右側はソース別名ドメイン(したがって最初に評価される) であり、左側はターゲット別名コドメイン(したがって 2 番目に評価される) です。
その例では、:~
です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
。