続・Collatz予想

C++の特殊化されたtemplateは、KL1等のGHC(Guard Horn Clause)に基づく言語の条件付clauseに似ています。
(特殊化してない場合はguardが常にtrueのclauseでしょうか)

試しに先日のCollatz予想のステップ数を求めるtemplateを、だいたい同じような形でKL1に対応させたコードを書いてみました。

どうでしょう、templateが特殊化によって、異なるguardを持つclauseのように振舞ってるように見えませんか?
(templateの特殊化はguardほど柔軟ではありませんが)

C++
#include 

template 
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世代コンピュータプロジェクトの初期の頃は、他の処理系も開発されていたようですが、現在でも手に入るんでしょうか?