Prolog:将谓词值与常量进行比较
Prolog: comparing predicate value with constant
我在使用 prolog 时遇到一些问题,特别是我无法将谓词的值与常量进行比较。
predicate(9).
compare(X,Y) :- X<Y.
运行 程序:
?-compare(predicate(X),10).
为什么不起作用?谢谢你的回答。
谓词不像函数那样return取值。
这里是 C:
int nine() { return 9; }
int main() {
int x = nine(); /* x is now 9 */
}
这是序言:
% 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 术语。因为谓词不像函数那样具有 return 值,所以它使用一个额外的参数来报告比较结果。您可以改为尝试以下方式:
% 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.
就像@Boris 之前说的那样"Predicates don't return values in the way that a function does." 这里你必须尝试实例化规则头部的变量。
如果您尝试使用谓词 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
。这就是您正在寻找的 return 值。
注意
请注意,运算符 >/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
我在使用 prolog 时遇到一些问题,特别是我无法将谓词的值与常量进行比较。
predicate(9).
compare(X,Y) :- X<Y.
运行 程序:
?-compare(predicate(X),10).
为什么不起作用?谢谢你的回答。
谓词不像函数那样return取值。
这里是 C:
int nine() { return 9; }
int main() {
int x = nine(); /* x is now 9 */
}
这是序言:
% 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 术语。因为谓词不像函数那样具有 return 值,所以它使用一个额外的参数来报告比较结果。您可以改为尝试以下方式:
% 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.
就像@Boris 之前说的那样"Predicates don't return values in the way that a function does." 这里你必须尝试实例化规则头部的变量。
如果您尝试使用谓词 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
。这就是您正在寻找的 return 值。
注意
请注意,运算符 >/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