私はXしか知りませんが、プロローグでYとZを取得する方法は?例えばプロローグ、テスト(X、Y、Z): - YはX + Zです
:
test(X, Y, Z) :- X is Y + Z.
が、エラー:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
私はXしか知りませんが、プロローグでYとZを取得する方法は?例えばプロローグ、テスト(X、Y、Z): - YはX + Zです
:
test(X, Y, Z) :- X is Y + Z.
が、エラー:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
を言うことができます。
あなたはY
とZ
は、いくつかの限定セット(5未満例えば正の整数)からのものであることを知っていれば、あなたは次のような何かを行うことができますが、私は
valid_number(1).
valid_number(2).
valid_number(3).
valid_number(4).
test(X, Y, Z) :- valid_number(Y), valid_number(Z), X is Y + Z.
あなたは引数として渡す必要があります。プロローグの算術演算(is/2
)はマジックワンドではないため、その右の引数は評価する前に完全にインスタンス化する必要があります(変数なし)。
述語をいくつかの「方向」で動作させたい場合、基本用語と変数の複数の組み合わせを使用する場合は、制約論理プログラミングを使用することをお勧めします。有限領域上のCLPでは、あなたはあなたが欲しいものであることをY
を選択することができますし、それらをZ
またはその逆を計算するので、それは不可能です
:- use_module(library(clpfd)). % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
二larsmans'制約の提案をし、それがはるかに簡単です見つけます低レベルのmoded算術よりも初心者のための理解が必要です。私の意見では、/ 2は初心者のために理解するのが難しいので入門コースから除外されるべきです。 – mat
これらの設定制約は、 'between/3'で達成することもできます。 –
はい。私はこれが(I、J、J)の間に を見つけました: - J> = I。 (I、J、K)の間: :-J> I、J1は(I、J1、K)の間のJ-1である。 ? - (1、4、X)の間。X = 4; X = 3; X = 2; X = 1; false。 非常に役に立ちました。 – Martynas