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

您必须将它们作为参数传递。Prolog 算术 ( 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,反之亦然。

尽管如果您知道这一点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.
于 2010-12-05T13:55:21.340 回答