1

Xしか知らないのに、プロローグでYとZを取得するにはどうすればよいですか?

例えば:

test(X, Y, Z) :- X is Y + Z.

しかし、エラー:

?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
4

2 に答える 2

2

それらを引数として渡す必要があります。プロローグ算術(is/2)は魔法の杖ではありません。評価する前に、その正しい引数を完全にインスタンス化する必要があります(変数なし)。

述語を複数の「方向」で機能させ、基底項と変数の複数の組み合わせを使用する場合は、制約論理プログラミングを使用する必要がありますが、これは論理プログラミングのかなり高度な領域です。有限ドメインのCLPでは、次のように言うことができます

:- use_module(library(clpfd)).  % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
于 2010-12-05T13:31:29.190 に答える
2

それは不可能です。なぜなら、あなたはYあなたが望むものになることを選択でき、彼らは計算するZか、またはその逆を行うことができるからです。

あなたがそれを知っていてYZいくつかの限られたセット (例えば、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.
于 2010-12-05T13:55:21.340 に答える