prolog,test(X,Y,Z): - Y是X + Z.

时间:2010-12-05 12:36:14

标签: prolog clpfd

当我只知道X时,如何在prolog中获得Y和Z?

例如:

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

但错误:

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

2 个答案:

答案 0 :(得分:3)

你必须将它们作为参数传递。 Prolog算术(is/2)不是魔术棒,它的正确参数必须在被评估之前完全实例化(无变量)。

如果您希望谓词在多个“方向”中工作,使用基础术语和变量的多种组合,您将需要使用约束逻辑编程,但这是一个相当高级的逻辑编程领域。在有限域上的CLP中,您可以说

:- use_module(library(clpfd)).  % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.

答案 1 :(得分: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.