仅Prolog检查变量已实例化

时间:2018-12-05 15:37:52

标签: prolog rules

Prolog中,仅当变量为variable时,才可以检查instantiated是否是确定值。

? - my_rule(X).

my_rule(X):-
    X = 4,
    write('continue'). 

在这里,我尝试检查X is 4X is 4是否继续,但是如果X_,我也希望规则继续执行,但是如果以其他方式调用它,例如X is 3,则它不应继续。

所以结果看起来像这样:

?- my_rule(X).

continue
true.

?- my_rule(4).

continue
true.

?- my_rule(3).

false.

3 个答案:

答案 0 :(得分:3)

看看var/1atom/1ground/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.