4

私はプロローグが初めてです。私は次のように非常に短いプログラムを書きました:

plus(X,Y,R):- R is X+Y.

実行すると、次の問題が発生します。

?- plus(1,1,2).
true
?- plus(1,1,X).
X=2
?- plus(1,X,2).
ERROR: is/2: Arguments are not sufficiently instantiated

エラーが発生するのはなぜですか?同じ目標を達成するためにコードを変更するにはどうすればよいですか? 私を助けてくれてありがとう!

4

1 に答える 1

2

これがうまくいかない理由は、is/2 が (似たような) 関数だからです。X,Y を指定すると、X+Y を計算し、それを R に格納します (X+Y で R をインスタンス化します)。R が提供され、X または Y が var である (まだインスタンス化されていない) 場合、どのように X+Y を計算できますか。それがインスタンス化エラーの理由です。

これを解決するには、モジュール :CLPFD のようなよりリレーショナルなものを使用する必要があります

:- use_module(library(clpfd)).

plus(X,Y,R):- R #= X+Y.

いくつかの例:

**?- [ask].
true.
?- plus(1,1,2).
true.
?- plus(1,1,X).
X = 2.
?- plus(1,X,2).
X = 1.
?- plus(X,Y,2).
X+Y#=2.
?- plus(X,Y,R).
X+Y#=R.**

最後のケースでは、X、Y、R がどのように関連しているかを答えとして示しています。

于 2016-11-09T06:05:34.077 に答える