2

Jの式から名詞を引数として抽出するための体系的なアプローチは何ですか? 明確にするために、2 つのリテラルを含む式は、リテラルの代わりに使用される左と右の引数を持つ 2 項式になる必要があります。

私は暗黙のスタイルを学ぼうとしているので、名前付き変数が避けられる場合は使用しないことを好みます。

具体的な例は、私が作成した単純なサイコロ シミュレーターです。

   >:?10#6    NB. Roll ten six sided dice.
2 2 6 5 3 6 4 5 4 3
   >:?10#6
2 1 2 4 3 1 3 1 5 4

引数 10 と 6 を式の外側に体系的に抽出して、任意のサイズのサイコロをいくつでも振れるようにしたいと思います。

   d =. <new expression here>
   10 d 6  NB. Roll ten six sided dice.
1 6 4 6 6 1 5 2 3 4
   3 d 100  NB. Roll three one hundred sided dice.
7 27 74

私の例を使用して自由に説明してください。ただし、任意の式の手順に従うことができるようにしたいと考えています。

編集: x と y を使用した引用バージョンは、たとえば13 : '>:?x#y'. 誰かが定義を見つける方法を教えてくれれば13 :、私自身の質問に答えることができるかもしれません.

4

2 に答える 2

5

暗黙のスタイルを学ぶことが目標である場合は、明示的なアルゴリズムを暗記しようとするよりも、単純にゼロから学習する方がよいでしょう。J4CLearning Jは優れたリソースです。式を明示的なものから暗黙的なものに変換する一般的なケースは、難治

J4 以降、暗黙的な接続詞の規定がないという事実を無視しても、動詞の明示的な定義では、(1)制御語を使用する、(2) グローバル変数を使用および変更する、(3) xand/orを含む式を配置することができます。y副詞または接続詞のオペランドとして、および (4) それ自体を参照します。(1)、(3)、または (4) を解くことは、一般的なケースでは非常に難しく、(2) は完全に不可能です。*

あなたの J 文が式の小さなクラスの 1 つである場合、 fork ルールを適用してそれを暗黙にする簡単な方法があり、これが多かれ少なかれ で実装されているものです13 :。それを思い出します

  • (F G H) yis (F y) G (H y)、 and x (F G H) yis (x F y) G (x H y)( Monad/Dyad Fork )
  • ([: G H) yis G (H y)、 and x ([: G H) yis G (x H y)( Monad/Dyad Capped Fork )
  • x [ yis xx ] yis y、および and の両方[ y( ] yLeft y/ Right )

フォークが中央の動詞を「最も外側の」動詞として使用する方法に注意してください。フォークは のダイアディック アプリケーションを提供しますがgキャップ フォークはモナド アプリケーションを提供します。これは、J における動詞の適用の 2 つのモード、単項および 2 項に正確に対応します。したがって、暗黙を「二項」表現にするための簡単なアルゴリズムは、F G H動詞とN名詞の場合、次のようになります。

  1. x(x [ y)に置き換えyます(x ] y)。(左/右)
  2. 他の名詞n(x N"_ y)
  3. パターン が表示されている場合は(x F y) G (x H y)、 に置き換えx (F G H) yます。(フォーク)
  4. パターン が表示されている場合はG (x H y)、 に置き換えx ([: G H) yます。(*キャップフォーク()
  5. フォームに到達するまで 1 ~ 4 を繰り返しx F y、その時点で勝利となります。
  6. これ以上単純化を実行できず、まだ勝っていない場合は、負けです。

にのみ依存する式である「モナド式」についても、同様のアルゴリズムを導出できますy。ここにサンプルの派生があります。

<. (y - x | y) % x                          NB. start
<. ((x ] y) - (x [ y) | (x ] y)) % (x [ y)  NB. 1
<. ((x ] y) - (x ([ | ]) y)) % (x [ y)      NB. 3
<. (x (] - ([ | ])) y) % (x [ y)            NB. 3
<. x ((] - ([ | ])) % [) y                  NB. 3
x ([: <. ((] - ([ | ])) % [)) y             NB. 4 and we win

これはいくつかの明らかな単純化を無視していますが、目標を達成しています。単純化するために、他のさまざまな規則を組み合わせることができます。たとえば、長い列のルール (Trainが奇数の長さの列の場合、 は(F G (Train))等価)や、 とが等価(F G Train)であるという観測などです。ルールを学んだ後、結果を得るためにアルゴリズムを変更することは難しくありません。x ([ F ]) yx F y[: <. [ %~ ] - |13 : '<. (y - x | y) % x'

xand/orを含む式がy副詞または接続詞のオペランドである場合は常に、失敗条件が達成されます。いくつかの深いリファクタリングと、 and の動詞と動名詞の知識があれば、暗黙の形式を復元できる場合もありますが^:}これがプログラムで実行できるかどうかは疑問です。

これが、(1)、(3)、(4) を不可能ではなく難しくしている理由です。暗黙のプログラマーは、どのように機能するかの知識があれば、たとえばアッカーマン関数$:の暗黙の形式をそれほど問題なく見つけることができ、賢いプログラマーはそれを効率的にリファクタリングすることさえできます。それを行うアルゴリズムを見つけることができれば、プログラマーを不要にすることができます。

   ack1 =: (1 + ])`(([ - 1:) $: 1:)`(([ - 1:) $: [ $: ] - 1:)@.(, i. 0:)
   ack2 =: $: ^: (<:@[`]`1:) ^: (0 < [) >:
   3 (ack1, ack2) 3
61 61
   TimeSpace =: 6!:2, 7!:2@]  NB. iterations TimeSpace code
   10 TimeSpace '3 ack1 8'
2.01708 853504
   10 TimeSpace '3 ack2 8'
0.937484 10368

※嘘みたいな話です。このような動詞を含むプログラム全体を、高度なブードゥー教の魔法でリファクタリングできます。2012年Jカンファレンスのペペ・キンタナの講演。それはきれいではありません。

于 2015-03-09T23:11:40.747 に答える