Xしか知らないのに、プロローグでYとZを取得するにはどうすればよいですか?
例えば:
test(X, Y, Z) :- X is Y + Z.
しかし、エラー:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
それらを引数として渡す必要があります。プロローグ算術(is/2
)は魔法の杖ではありません。評価する前に、その正しい引数を完全にインスタンス化する必要があります(変数なし)。
述語を複数の「方向」で機能させ、基底項と変数の複数の組み合わせを使用する場合は、制約論理プログラミングを使用する必要がありますが、これは論理プログラミングのかなり高度な領域です。有限ドメインのCLPでは、次のように言うことができます
:- use_module(library(clpfd)). % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
それは不可能です。なぜなら、あなたはY
あなたが望むものになることを選択でき、彼らは計算するZ
か、またはその逆を行うことができるからです。
あなたがそれを知っていて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.