Prolog:比较谓词值和常量

时间:2015-10-01 09:21:42

标签: prolog compare logic yap

我在prolog中遇到了一些问题,特别是我无法将谓词的值与常量进行比较。

predicate(9).
compare(X,Y) :- X<Y.

运行程序:

?-compare(predicate(X),10).

为什么不起作用?谢谢你的回答。

2 个答案:

答案 0 :(得分:2)

谓词不会以函数的方式返回值。

这是C:

int nine() { return 9; }

int main() {
    int x = nine(); /* x is now 9 */
}

这是Prolog:

% source
nine(9).

% from the top level
?- nine(X).
X = 9.

?- nine(X), X < 10.
X = 9.

?- nine(X), compare(C1, X, 10), compare(C2, 10, X).
X = 9,
C1 =  (<),
C2 =  (>).

很少的事情(尽量不要使用过多的Prolog术语):

你的predicate/1和我的nine/1所做的是将其唯一参数与整数9统一。如果统一成功,则谓词成功,现在参数绑定为9.如果统一失败,谓词失败。

?- nine(9).
true.

?- nine(nine).
false.

?- nine(X), nine(Y).
X = Y, Y = 9.

您还会注意到有一个标准谓词compare/3可用于比较Prolog术语。因为谓词不像函数那样具有返回值,所以它使用额外的参数来报告比较结果。你可以尝试一下以下方面:

% greater_than(X, Y) : true if X is greater than Y according
%                      to the standard order of terms
greater_than(X, Y) :- X @> Y.

但这只是为@>/2定义了一个别名,它本身就是一个谓词(但已被声明为运算符,因此您可以在中缀表示法中使用它)。

?- @>(a, b).
false.

?- @>(b, a).
true.

同样适用于</2,它是比较算术表达式的谓词:

?- 2 + 4 =< 6.
true.

?- nine(X), X > 10 - X.
X = 9.

?- nine(X), X > 10.
false.

答案 1 :(得分:1)

就像@Boris之前所说的那样“谓词不会以函数的方式返回值。”在这里,你必须尝试在规则的头部实例化变量。
如果您正在尝试使用谓词compare/2来查找大于Y的数字X,同时此数字X应该是事实predicate/1,那么请将两个条件添加到规则正文或谓词compare/2

predicate(9).
compare(X,Y) :- predicate(X), X<Y.

现在,如果你咨询:

?- compare(X,10).

答案是

X = 9

如您所见,9小于10,同时9是事实predicate/1。这就是您正在寻找的返回值

注意

请注意,运算符>/2要求双方都被实例化,因此在这种情况下,您将无法在谓词中请求值Y

?- compare(9, Y)
</2: Arguments are not sufficiently instantiated

也许并且如果有意义,您可以尝试将此变量实例化为事实predicate/1

predicate(9).
predicate(10).
compare(X,Y) :- predicate(X), predicate(Y), X<Y.

?- compare(9,Y).
Y = 10