在Prolog
中,仅当变量为variable
时,才可以检查instantiated
是否是确定值。
? - my_rule(X).
my_rule(X):-
X = 4,
write('continue').
在这里,我尝试检查X is 4
,X is 4
是否继续,但是如果X
为_
,我也希望规则继续执行,但是如果以其他方式调用它,例如X is 3
,则它不应继续。
所以结果看起来像这样:
?- my_rule(X).
continue
true.
?- my_rule(4).
continue
true.
?- my_rule(3).
false.
答案 0 :(得分:3)
看看var/1
,atom/1
和ground/1
:
var(X)
为真,且仅当X
为变量时。
?-var(X),X = 1。 X = 1。
?-X = 1,var(X)。 错误。
?-X = f(Y),var(X)。 错误。
atom(X)
是原子,则 X
为真。
?-原子(a)。 是的。
?-原子(f(a))。 错误。
?-原子(X)。 错误。
ground(X)
是地面(不包含变量),则 X
为真。
?-地面(f(a))。 是的。
?-地面(f(X))。 错误。
这三个谓词是确定性的(即不回溯),您可以放心地否定它们。
您的代码将变成这样:
my_rule(4) :-
% handle the 4 case
my_rule(X) :-
var(X),
% general case
我不确定这是否是您想要的。在大多数程序中,没有必要单独处理仅变量情况。还应注意,此类元逻辑测试不在经典逻辑的范围内。如果比较查询X = 1, var(X)
和var(X), X = 1
,您会发现该合取不再是可交换的,而是在逻辑A∧B = B∧A成立。
答案 1 :(得分:2)
您可以使用双重否定(\+(\+(...))
):
在您的示例中:
my_rule(X):-
\+(\+(X = 4)),
write('continue').
答案 2 :(得分:1)
my_rule(X):-
check(X),
write('continue').
% A fact used to check a value.
check(4).
% A predicate that checks if X is unbound, e.g. a variable.
check(X) :-
var(X).
验证所需结果。
?- my_rule(X).
continue
X = 4 ;
continue
true.
?- my_rule(4).
continue
true ;
false.
?- my_rule(3).
false.