1. ホーム
  2. prolog

[解決済み】Prolog - 引数が十分にインスタンス化されていない

2022-01-27 19:11:32

質問

あるリストの中で数字でない要素がいくつあるかを数える小さなプログラムを書いています。 以下は私のコードです。

not_number([],0).
not_number([X|T],R):- 
    not(number(X)),
    R1 is R+1,  
    not_number(T,R1). 

not_number([_|Tail],Result):-
    not_number(Tail,Result).  

このようなコードを実行すると.

?- not_number([1,2,3,5], R).

R = 0 と表示されます(本来は表示されます)。

R = 0.

しかし、リストに文字を入れると

?- not_number([1,2,3,5,a], R).

を実行すると、次のようなエラーが発生します。

ERROR: not_number/2: Arguments are not sufficiently instantiated
   Exception: (10) not_number([a], _G247) ? 

誰かこのコードの何が問題なのか説明してください。私はPrologの初心者です。

どのように解決するのですか?

この回答を書いているのは、まだベストアンサーが コメント によって ラーカー . 実際の回答として表示させたいのですが。

あなたのコードが機能していないのは、あなたが R1 is R+1 いつ R がインスタンス化されていない場合 not_number([X|T], R) . あなたの再帰的なケースは、少し後ろに張られています。こうしたいんでしょう。

not_number([X|T],R):- 
    not(number(X)),
    not_number(T,R1),
    R is R1+1.

今度は、右側の is が呼び出されるとインスタンス化されます。