1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Prologチェッカー

Posted at

発端

この度、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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?