発端
この度、N-Prologのコンパイラを大幅に改良しました。TCOを入れた関係です。コンパイラはPrologでおよそ2000行ほどになりました。そうしますと小さなコードであれば容易に発見できたミスも発見が難しくなることがわかりました。そこでver4.0においてCheckerライブラリを追加しました。
誤airty検出
次の例ではfact/2の呼び出しで引数を間違えています。
fact(0,1).
fact(N,X) :-
N1 is N-1,
fact(N1,X1,2),
X is N*X1.
このようにして検出されます。
?- check_file('./tests/fact.pl').
detect arity fact(varN1,varX1,2) in fact(varN,varX)
yes
?-
singleton検出
次の例では変数のタイプミスをしています。
fact(0,1).
fact(N,X) :-
N1 is N-1,
fact(N1,X2),
X is N*X1.
次のように検出されます。
?- check_file('./tests/fact.pl').
detect singleton varX2 in fact(varN,varX)
detect singleton varX1 in fact(varN,varX)
yes
?-
タイプミス検出
次の例では頭部の述語名のタイプミスをしています。
fact(0,1).
facT(N,X) :-
N1 is N-1,
fact(N1,X1),
X is N*X1.
次のようにして検出されます。
?- check_file('./tests/fact.pl',full).
detect single clause facT(varN,varX):-varN1 is varN-1,(fact(varN1,varX1),varX is varN*varX1)
yes
?-
このようなタイプのミスは1つだけ節がある場合という条件で検出しています。そうしますと正常なコードでも誤検出してしまいます。そこでこれはfullオプションをつけた場合にだけ検出する仕様としています。大きなコードになってくるとつまらないタイプミスで悩んで時間を浪費してしまうことがあります。Checkerで凡ミスを検出してしまいます。
N-PrologはOSSとして公表しています。ぜひ、お試しください。
https://github.com/sasagawa888/nprolog