続・Collatz予想
C++の特殊化されたtemplateは、KL1等のGHC(Guard Horn Clause)に基づく言語の条件付clauseに似ています。
(特殊化してない場合はguardが常にtrueのclauseでしょうか)
試しに先日のCollatz予想のステップ数を求めるtemplateを、だいたい同じような形でKL1に対応させたコードを書いてみました。
どうでしょう、templateが特殊化によって、異なるguardを持つclauseのように振舞ってるように見えませんか?
(templateの特殊化はguardほど柔軟ではありませんが)
C++
#includetemplate struct f2{ enum{value = 0}; }; /* even */ template struct f2<0, n>{ enum{value = 1 + f2<(n / 2) % 2, n / 2>::value}; }; /* odd */ template struct f2<1, n>{ enum{value = 1 + f2<(n * 3 + 1) % 2, n * 3 + 1>::value}; }; template <> struct f2<1, 1>{ enum{value = 1}; }; template struct f{ enum{value = f2 ::value}; }; int main(){ std::cout << f<3>::value << std::endl; return 0; }
KL1
:- module main. main :- f(3, Step), io:outstream([print(Step),nl]) . f(In, Out):- true | f2(In, 0, Out). f2(In, Count, Out):- In = 1 | Out := Count + 1. f2(In, Count, Out):- In mod 2 =:= 0 | Temp := In / 2, NewCount := Count + 1, f2(Temp, NewCount, Out). f2(In, Count, Out):- In > 1, In mod 2 =:= 1 | Temp := In * 3 + 1, NewCount := Count + 1, f2(Temp, NewCount, Out).
KL1の処理系はklicを想定しています。
というか、それ以外の処理系は私の手元にありません。
第5世代コンピュータプロジェクトの初期の頃は、他の処理系も開発されていたようですが、現在でも手に入るんでしょうか?