在数据库中使用变量

时间:2015-09-05 18:22:24

标签: database prolog

我使用SWI-Prolog。 这不可能吗?

:- dynamic question/1.
   question([do, you, know, what, a, F1, is, ?]).
   question([does, F1, have, a, F2, ?]).

.....

 ?- question([do, you, know, what, a, son,  is, ?]), writeln(F1).
F1 = son.

1 个答案:

答案 0 :(得分:1)

在Prolog中,当您有谓词子句或事实(或规则)时,任何只出现一次的变量都被视为单例。这意味着Prolog在该子句中没有关于该变量与其他任何内容相关的信息,并且无法在该子句中实例化它。

以下这样的事实有一个单例变量F1

question([do, you, know, what, a, F1, is, ?]).

这个事实与F1无关。因此,查询如:

?- question([do, you, know, what, a, son, is, ?]).

将匹配,从而成功。但是,您的查询中没有变量与事实中的任何内容统一,因此您没有其他结果。同样,F1F2在以下事实中是单例变量:

question([does, F1, have, a, F2, ?]).

解决这种情况的一种方法是将变量隔离在一个单独的参数中,这样它们就不再是单例,而Prolog会在执行查询时将它们统一起来。例如:

question([do, you, know, what, a, F1, is, ?], [F1]).
question([does, F1, have, a, F2, ?], [F1, F2]).

现在,您可以使用自己的变量进行查询,这些变量将与以下事实中的变量统一起来:

?- question([do, you, know, what, a, son, is, ?], [X]).
X = son

当Prolog收到查询时,它与您的第一个事实匹配,第一个参数[do, you, know, what, a, son, is, ?][do, you, know, what, a, F1, is, ?]统一,[X]将与[F1]统一。由于第一次统一会产生F1 = son,因此您将[X] = [son]X = son

类似地:

?- question([does, fred, have, a, son, ?], [X, Y]).
X = fred
Y = son

然后查询,例如,问题([做,你,知道,什么,a,儿子,是,?],L)。屈服,L = [儿子]