4

Java や C など、演算子を使用した構文糖衣(インフィックス) を許可する言語では、優先順位結合性を使用します。

Prolog は結合性も使用します:
左結合 - yfx
右結合 - xfy

しかし、なぜxfxがあるのですか?

私がインターネットで見つけた唯一のことは、これ以上明確にすることです

xfx は、演算子が分岐を「支配する」ことを意味しますが、xfy または yfx は、同じ優先度の式をチェーンできるという意味で「リスト構築」を表します。

from: CapelliCによる演習での Prolog の演算子の解釈

xfy と yfx が失敗する/意味がないために xfx が必要な例を回答に含めることができれば、それは高く評価されます。

Prolog の参照用: Prolog 組み込みディレクティブ op

虚偽のメモ として:

上記のリンクで指定した演算子は、標準と SWI の両方とは異なることに注意してください。それらは少なくとも10年は時代遅れです。例として、それはする必要がありますcurrent_op(200,fy,-)

CapelliCfalseによる 2 つの現在の回答を読んだ後、より関連性の高い情報を見つけるためのキーワードは非連想であることが明らかになりました。そのため、非関連セクションに注意を払うと、演算子の結合性がxfxに関してより意味を持つようになりました。

4

3 に答える 3

5

演算子の指定子は、演算子のクラス (プレフィックス、インフィックス、ポストフィックス) と結合性を示します。

xfx演算子がいかなる形式の結合性も許可しないことを意味します。つまり、同じ優先度の演算子とはネストしません。ただし、優先度の低い演算子でネストされます。

このような演算子の大部分は、比較のような意味で使用されるアリティ 2 の述語であり、入れ子にすると、少なくとも述語とはまったく異なる意味になります。それらはすべて優先度 700 に配置されています。これは、すべての算術演算子がブラケットなしで機能するのに十分な高さです。引数として目標を期待する制御構造および関連するメタ述語を操作するのに十分な低さ。、、、と考えて(\+)/1ください。(;)/2(',')/2

考慮してください=<: 1 から 3 の間であると述べたい場合は、Prolog ではどちらも意味がないため、X書くことはできません。実際、どちらも評価エラーにつながります。あなたは書く必要があります。つまり。1 =< X =< 3(1 =< X) =< 31 =< (X =< 3)1 =< X, X =< 3=<(1, X), =<(X, 3)

場合によっては、入れ子にするのが理にかなっているかもしれません(A = B) = P。ここで、1=つ目はアリティ 2 の他のものと同様の単なるファンクタですが、2 つ目は等価/統一のため=の組み込み述語です。(=)/2しかし、そのようなケースはまれであり、追加の丸括弧のペアでそれらを強調する価値があります.

また、ネストしない:- :- a.ため、これは無効な構文であることに注意してください 。(:-)/1

算術演算子は通常、 のように左から右に処理し1+2+4、最初に計算1+2してから追加するため、左結合です4。注目すべき例外は(^)/2次のとおりです。これは、 (X^Y)^Z =:= X^(Y*Z)一方(X^(Y^Z))が単純な演算子では表現できない用語を表すためです。

于 2013-11-12T18:15:59.930 に答える
2

たとえば、 (:-)/2 は明らかに一度しか使用できない演算子です。これは、頭と体を分離するためです。

分離は「相対的」です。たとえば、ルールに含めることができます

my_rule :- assertz((a :- b, c)).

SWI-Prolog の (デフォルトの) xfx 演算子の完全なリストは次のとおりです。

?- setof((X,Y), current_op(X,xfx,Y), L), maplist(writeln, L).
200, (**)
700, (<)
700, (=)
700, (=..)
700, (=:=)
700, (=<)
700, (==)
700, (=@=)
700, (=\=)
700, (>)
700, (>=)
700, (@<)
700, (@=<)
700, (@>)
700, (@>=)
700, (\=)
700, (\==)
700, (\=@=)
700, (as)
700, (is)
1200, (-->)
1200, (:-)
于 2013-11-12T17:30:47.357 に答える
1

プロローグ標準シーンの現状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

于 2017-05-21T19:57:02.870 に答える