成長速度の調整の講では,
複数の変数を使って,ちょっぴり不規則にパターン成長をさせました.
例えば
a(X,Y):****a(sY,ssX)とすると,Xの部分に「,s,sss,ssss,…」つまり「0,1,3,4,6,7,…」というパターンが
a(,)
つまり,次のようにします:
a(X,Y,Z):****a(YX,Z,Y)(なおこのコードには明らかに1Bの無駄があります,後述.)
a(,s,ss)
以下簡単のため,最初に挙げたa(X,Y):****a(sY,ssX)という方法を方法A,
今回紹介したa(X,Y,Z):****a(YX,Z,Y)という方法を方法Bと呼ぶことにします.
方法Bと方法Aの大きな違いは,方法Bでは「1つのパターンを成長させている」という点です.
逆に言えば方法Aでは「2つのパターンを育てている」ことになります.
つまり,XとYの2つを同時に育てているのが分かりますね.そのため
XとYに別の初項を与えると,別系列のパターンを同時に育てるようなことも可能です.例えば
a(X,Y):XXXXa(sY,ssX)みたいな感じですかね.また,方法Bでは「1つのパターンを成長させる」ということから,例えば
a(r,l)
さて,ただでさえbyte数が膨らんだように見える方法Bについて,さらに追い打ちをかけるように
「方法Aでしか出来ないこと」を紹介していきました.しかし,
いつでも方法Aが有利だというわけではありません.いくつか例を挙げましょう.
まずは,初項が複雑な場合です.例えば
a(X,Y):XrslsrXrslsrXrslsrXrslsra(sY,ssX)という方法Aのコードはそのまま短縮すると
a(,)
a(X,Y):XXXXa(sY,ssX)と2つ同じ初項を設定する必要があります.p:rslsrのように文字で置けば
a(rslsr,rslsr)
次に,階差の部分を実行でも用いる場合です.例えば
a(X,Y,Z):XYXa(YX,Z,Y)みたいな感じでしょうか?
a(,sr,sl)
次に,「同じ関数形の階差」の場合です.例えば
a(X,Y,Z):Xla(YYX,Z,Y) a(,ss,srsl)のような感じでしょうか.「ssss, srslsrsl」という階差が
a(X,Y,Z):****a(YX,Z,Y)というコードも,
a(,s,ss)
a(X,Y,Z):****a(sYX,Z,Y)とすることで,つまり同じ関数形sYと思うことで短縮が可能です.
a(,,s)
a(X,Y,Z):****a(sYYX,Z,Y)とすれば,「0,3,10,13,…」というような激しい成長も作れます.
a(,s,sss)
上記の「同じ関数形」と一口に言っても「YYXZY」のように左右にYZ複合してつける
ようなことも可能ですしね.もちろんそんなに複雑なものは見たことがないですが,
これに近い複雑なことをやって短縮できたようなこともあります.
単純に「YZX」のような付け方でも意外と気付きにくかったりします.奥が深いですね.