暗黙のスタイルを学ぶことが目標である場合は、明示的なアルゴリズムを暗記しようとするよりも、単純にゼロから学習する方がよいでしょう。J4CとLearning Jは優れたリソースです。式を明示的なものから暗黙的なものに変換する一般的なケースは、難治。
J4 以降、暗黙的な接続詞の規定がないという事実を無視しても、動詞の明示的な定義では、(1)制御語を使用する、(2) グローバル変数を使用および変更する、(3) x
and/orを含む式を配置することができます。y
副詞または接続詞のオペランドとして、および (4) それ自体を参照します。(1)、(3)、または (4) を解くことは、一般的なケースでは非常に難しく、(2) は完全に不可能です。*
あなたの J 文が式の小さなクラスの 1 つである場合、 fork ルールを適用してそれを暗黙にする簡単な方法があり、これが多かれ少なかれ で実装されているものです13 :
。それを思い出します
(F G H) y
is (F y) G (H y)
、 and x (F G H) y
is (x F y) G (x H y)
( Monad/Dyad Fork )
([: G H) y
is G (H y)
、 and x ([: G H) y
is G (x H y)
( Monad/Dyad Capped Fork )
x [ y
is x
、x ] y
is y
、および and の両方[ y
( ] y
Left y
/ Right )
フォークが中央の動詞を「最も外側の」動詞として使用する方法に注意してください。フォークは のダイアディック アプリケーションを提供しますがg
、キャップ フォークはモナド アプリケーションを提供します。これは、J における動詞の適用の 2 つのモード、単項および 2 項に正確に対応します。したがって、暗黙を「二項」表現にするための簡単なアルゴリズムは、F G H
動詞とN
名詞の場合、次のようになります。
x
と(x [ y)
に置き換えy
ます(x ] y)
。(左/右)
- 他の名詞
n
を(x N"_ y)
- パターン が表示されている場合は
(x F y) G (x H y)
、 に置き換えx (F G H) y
ます。(フォーク)
- パターン が表示されている場合は
G (x H y)
、 に置き換えx ([: G H) y
ます。(*キャップフォーク()
- フォームに到達するまで 1 ~ 4 を繰り返し
x F y
、その時点で勝利となります。
- これ以上単純化を実行できず、まだ勝っていない場合は、負けです。
にのみ依存する式である「モナド式」についても、同様のアルゴリズムを導出できます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 ]) y
x F y
[: <. [ %~ ] - |
13 : '<. (y - x | y) % x'
x
and/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カンファレンスでのペペ・キンタナの講演。それはきれいではありません。