序言,测试(X,Y,Z): - Y是X + Z
问题描述:
如何在序言中获得Y和Z,当我只知道X?序言,测试(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
反之亦然。
但如果你知道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.
答
您必须将它们作为参数传递。 Prolog算术(is/2
)不是魔术棒,它的正确参数必须完全实例化(无变量)才能评估。
如果您希望谓词在多个“方向”上工作,并且有多个基本术语和变量的组合,您将需要使用约束逻辑编程,但这是一个相当先进的逻辑编程领域。在有限域CLP,你可以说
:- use_module(library(clpfd)). % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
+1
我第二larsmans'约束的建议,找到更容易对于初学者来说比低级模式算术更能理解。在我看来,/ 2应该从入门课程中消除,因为初学者很难理解。 – mat 2010-12-05 13:58:54
这些设置约束也可以通过`between/3`来实现。 – 2010-12-05 15:05:05